| Next revision | Previous revision |
| provenance:design:mobile_and_app_measurement:mini_programs [2026/09/27 16:23] – New provenance page for design:mobile_and_app_measurement:mini_programs (queries, verdicts, hand codes, checks, sources). Authored by Claude karel.kubicek.claude | provenance:design:mobile_and_app_measurement:mini_programs [2026/09/27 17:08] (current) – Review round 3 log; final outputs. Authored by Claude karel.kubicek.claude |
|---|
| | External checks | ''scripts/external_checks_mini_programs.sh'' — script and output below; exit status is the number of FAILED checks | | | External checks | ''scripts/external_checks_mini_programs.sh'' — script and output below; exit status is the number of FAILED checks | |
| | Number guard | ''check_page_numbers.mjs'' whole-page against the concatenation of the report, verifier and external-check outputs: every figure traces. That guard is a presence check, not a binding check; figures were also read against the output by hand and by the figures reviewer. | | | Number guard | ''check_page_numbers.mjs'' whole-page against the concatenation of the report, verifier and external-check outputs: every figure traces. That guard is a presence check, not a binding check; figures were also read against the output by hand and by the figures reviewer. | |
| | Bibliography | 25 entries appended to [[literature:bibliography]] (19 from ''bibgen.mjs'' over the corpus index, 6 hand-written from Crossref and arXiv records for papers outside the index); USENIX and PoPETs author lists from the landing pages' ''citation_author'' metadata and author line; ''bib_dedup_scan.py'' over the merged file: 0 same-DOI or same-title pairs, 30 same-surname-same-year candidates involving a new key, all 30 different papers by title; no literal ''@'' inside a field | | | Bibliography | 27 entries appended to [[literature:bibliography]] in two saves (25 at rev 1790526095, 2 Telegram Mini Apps preprints at rev 1790527209 after the external-currency review; 1,162 → 1,189 entries): 19 from ''bibgen.mjs'' over the corpus index, 8 hand-written from Crossref and arXiv records for papers outside the index; USENIX and PoPETs author lists from the landing pages' ''citation_author'' metadata and author line; ''bib_dedup_scan.py'' over the merged file: 0 same-DOI or same-title pairs, 30 same-surname-same-year candidates involving a new key, all 30 different papers by title; no literal ''@'' inside a field | |
| | Agents | One Opus session (queries, triage of 41 candidates, verdicts, hand codes, drafting, verification). Four Sonnet readers read the 17 papers that looked like mini-program studies (16 candidates + 1 recall hit) into unpublished notes (brief below). One Opus sub-agent did the external-source pass (about 30 verified claims, notes unpublished); every load-bearing claim on the page was then re-fetched by the external-check script. Four review sub-agents — see [[#Review log]]. | | | Agents | One Opus session (queries, triage of 41 candidates, verdicts, hand codes, drafting, verification). Four Sonnet readers read the 17 papers that looked like mini-program studies (16 candidates + 1 recall hit) into unpublished notes (brief below). One Opus sub-agent did the external-source pass (about 30 verified claims, notes unpublished); every load-bearing claim on the page was then re-fetched by the external-check script. Six review sub-agents in three rounds — three focused Sonnet passes, a Sonnet re-check of their fixes, a generic Fable pass, and a Sonnet re-check of its fixes — see [[#Review log]]. | |
| |
| ==== Mistakes made in this run ==== | ==== Mistakes made in this run ==== |
| * **Seven claims in the first draft overstated the evidence and were corrected before any review**: "three crawling routes, two of which the host has since closed or changed" (only MiniCrawler's is reported closed; the search endpoint's current state is unknown); the malware corpus "took two and a half years" (it was collected March 2020 – June 2022, revisited to December 2022); "delisted within about six months" (delisting was measured at the end of 2022 over miniapps collected since 2020); "7 of the 9 deployed-population papers state no host version" (9 of 9 once two ''n/a'' codes were recoded ''not-stated''); a language label on two unpackers that no source gave; a sentence about author clustering that no query measured; and "before a single flow was readable". | * **Seven claims in the first draft overstated the evidence and were corrected before any review**: "three crawling routes, two of which the host has since closed or changed" (only MiniCrawler's is reported closed; the search endpoint's current state is unknown); the malware corpus "took two and a half years" (it was collected March 2020 – June 2022, revisited to December 2022); "delisted within about six months" (delisting was measured at the end of 2022 over miniapps collected since 2020); "7 of the 9 deployed-population papers state no host version" (9 of 9 once two ''n/a'' codes were recoded ''not-stated''); a language label on two unpackers that no source gave; a sentence about author clustering that no query measured; and "before a single flow was readable". |
| * **One external check asserted nothing on its first version.** "Tencent publishes no mini-program count" was checked against the Q2 2026 release, which contains **zero** mentions of "Mini Program" — so "no count next to a mention" was vacuously true. The script now also reads the 2025 annual and Q1 2026 PDFs and requires a positive control (the Weixin/WeChat MAU line) to be present in each before accepting "no count"; the annual release does mention "content-related Mini Programs" twice, with no number. | * **One external check asserted nothing on its first version.** "Tencent publishes no mini-program count" was checked against the Q2 2026 release, which contains **zero** mentions of "Mini Program" — so "no count next to a mention" was vacuously true. The script now also reads the 2025 annual and Q1 2026 PDFs and requires a positive control (the Weixin/WeChat MAU line) to be present in each before accepting "no count"; the annual release does mention "content-related Mini Programs" twice, with no number. |
| | * **Four hand codes were wrong until review** (see [[#Review log]]): {[shi2026_better]} (figures review) and {[yang2025_miniapp]} (generic review) were coded as acknowledging that their sample is not the population, which neither text says — both had caveats about the detector, not the crawl; the WRAP box's "six of the nine" is **four**; {[wang2025_wechat]} was coded as using Chinese seed keywords, which it attributes to a cited prior method; {[cai2025_tell]} was coded "none-stated" for artefacts although it discusses and declines release (new code ''declined''). Only the first moved a printed figure. |
| | * **A quote hid its own citation.** The page quoted {[liu2024_riotfuzzer]}'s "most mini-apps employ obfuscation techniques" without the "as reported in [45]" that precedes it; [45] is {[zhang2021_measurement]}. Caught by the citations reviewer; the sentence now credits the measurement to its source. |
| * **Two readers missed released code.** KeySentinel ({[zhou2025_secrets]}) and RIoTFuzzer ({[liu2024_riotfuzzer]}) print their repository URL only in the reference list; the readers coded "not stated". The report's hand-versus-schema cross-check (section G) flagged both; verified in the text and recoded. | * **Two readers missed released code.** KeySentinel ({[zhou2025_secrets]}) and RIoTFuzzer ({[liu2024_riotfuzzer]}) print their repository URL only in the reference list; the readers coded "not stated". The report's hand-versus-schema cross-check (section G) flagged both; verified in the text and recoded. |
| |
| * **Hand codes** for the 16 (''HAND'' in the fold): unit, hosts, side, acquisition route, collected and analysed counts, analysis kind, tools, instrumentation, host version stated, account type, Chinese keyword handling, validation, LLM use, ethics review, disclosure, artefacts, and whether the paper acknowledges its sample is not the population. "not-stated" means the paper does not say. | * **Hand codes** for the 16 (''HAND'' in the fold): unit, hosts, side, acquisition route, collected and analysed counts, analysis kind, tools, instrumentation, host version stated, account type, Chinese keyword handling, validation, LLM use, ethics review, disclosure, artefacts, and whether the paper acknowledges its sample is not the population. "not-stated" means the paper does not say. |
| * **Hand versus schema** (section G): ''tools[]'' names MiniCrawler for exactly the five papers the hand codes do; ''ethics.notifiedAffectedParties'' is ''yes'' for all 16, matching the hand disclosure codes; ''ethics.reviewOutcome = approved'' matches the 3 hand-coded approvals; the extraction reads the IEEE S&P 2025 secrets paper as "explicitly-discussed-no-review", which its text ("Following ethical guidelines [65], all analyses were conducted locally") does not say — the hand code stays "none-mentioned". Artefacts disagreed on two papers until the readers' misses were fixed (see [[#Mistakes made in this run]]). | * **Hand versus schema** (section G): ''tools[]'' names MiniCrawler for exactly the five papers the hand codes do; ''ethics.notifiedAffectedParties'' is ''yes'' for all 16, matching the hand disclosure codes; ''ethics.reviewOutcome = approved'' matches the 3 hand-coded approvals; the extraction reads the IEEE S&P 2025 secrets paper as "explicitly-discussed-no-review", which its text ("Following ethical guidelines [65], all analyses were conducted locally") does not say — the hand code stays "none-mentioned". Artefacts disagreed on two papers until the readers' misses were fixed (see [[#Mistakes made in this run]]). |
| | * **Hand codes checked against the paper text, not the notes**: all 9 ''denominator'' codes of the deployed-population papers (after two were found wrong), all 16 ''irb'' codes and all 16 ''artifacts'' codes (section K's probes plus the schema cross-check; every hit read), and every code a reviewer spot-checked — 41 of the 288 codes systematically, the rest by spot-check. Of the codes checked, 6 were wrong (2 ''denominator'', 3 ''artifacts'', 1 ''keywords''); the other fields' codes (unit, hosts, acquisition, tools, validation) were taken from the reader notes and each is visible, with its paper, in the fold below. That error rate is why the page prints counts, not rates, for hand-coded fields. |
| * **The invariant**: the report throws if a candidate lacks a verdict, a verdict names a non-candidate, a verdict note still says PENDING, an IN paper lacks hand codes, hand codes exist for a non-IN paper, a hand-code record lacks a field, or a venue-index title outside the extraction has no hand entry. | * **The invariant**: the report throws if a candidate lacks a verdict, a verdict names a non-candidate, a verdict note still says PENDING, an IN paper lacks hand codes, hand codes exist for a non-IN paper, a hand-code record lacks a field, or a venue-index title outside the extraction has no hand entry. |
| |
| |
| * **Page quotes**: ''verify_mini_programs_figures.mjs'' pulls **every** ''%%//"…"//%%'' span out of the page source and requires each to be located in the paper of a citekey on the same line (the publisher PDF text for {[wei2026_raising]}), or to be an EXTERNAL span whose external check printed OK. Six spans are found only in the ''pypdf'' rendering, where ''.cols'' splices two columns across them. Four print a WARN because the nearest citekey on the line is a different paper; each was read and the quote is attributed in the sentence to the right one. | * **Page quotes**: ''verify_mini_programs_figures.mjs'' pulls **every** ''%%//"…"//%%'' span out of the page source and requires each to be located in the paper of a citekey on the same line (the publisher PDF text for {[wei2026_raising]}), or to be an EXTERNAL span whose external check printed OK. Six spans are found only in the ''pypdf'' rendering, where ''.cols'' splices two columns across them. Four print a WARN because the nearest citekey on the line is a different paper; each was read and the quote is attributed in the sentence to the right one. |
| * **Per-paper figures**: 87 needles, located in ''.cols'' or, for eleven, only in the ''pypdf'' re-extraction. Three mutated needles (40,880→40,881; 41,726→41,727; 170→171) must not be found and are not. The needles under 20 characters are tool names whose presence is the claim. | * **Per-paper figures**: 101 needles, located in ''.cols'' or, for thirteen, only in the ''pypdf'' re-extraction. Three mutated needles (40,880→40,881; 41,726→41,727; 170→171) must not be found and are not. The needles under 20 characters are tool names whose presence is the claim. |
| * **One number is verified in the form the paper prints it**: {[yang2025_miniapp]}'s "19, 905" carries a space inside the number in both renderings; the page writes 19,905. | * **One number is verified in the form the paper prints it**: {[yang2025_miniapp]}'s "19, 905" carries a space inside the number in both renderings; the page writes 19,905. |
| * **NUL bytes**: the MiniCAT ''.cols'' file contains 141 NUL bytes, which make ''grep''/''ugrep'' return nothing silently; the verifier and the notes check fold them out before matching. | * **NUL bytes**: the MiniCAT ''.cols'' file contains 141 NUL bytes, which make ''grep''/''ugrep'' return nothing silently; the verifier and the notes check fold them out before matching. |
| * **[[:roadmap]]** (rev 1790511917 → 1790526202): an //Assessed// row. **[[provenance:roadmap]]** (rev 1790511918 → 1790526204): a dated decision entry under 3g. | * **[[:roadmap]]** (rev 1790511917 → 1790526202): an //Assessed// row. **[[provenance:roadmap]]** (rev 1790511918 → 1790526204): a dated decision entry under 3g. |
| * **Nothing filed.** The one piece of adjacent work the page points at — whether the regulator's filing system can serve as a population frame — is an open research question, not a wiki item. | * **Nothing filed.** The one piece of adjacent work the page points at — whether the regulator's filing system can serve as a population frame — is an open research question, not a wiki item. |
| | * **This page and its content page, after review**: content rev 1790526119 → 1790527251 (round 1) → 1790528159 (round 2) → final save below; provenance rev 1790526233 → 1790527253 → 1790528161 → final save below. The final revisions are recorded in ''notes/mp_log.md'' and on the drain item. |
| |
| ===== Review log ===== | ===== Review log ===== |
| |
| Reviews pending at first save; this section is replaced when they return. | Four reviewers, each told that the author's context may not be exhaustive and handed the page source, the provenance page, the report script and its output, the verifier and external-check outputs. The three focused passes ran in parallel on frozen snapshots of rev 1790526119 (content) and rev 1790526233 (provenance) in ''out/mp/review/''; fixes were applied together after all three returned. Their findings files are ''notes/mp_review_figures.md'', ''notes/mp_review_citations.md'', ''notes/mp_review_external.md''. My own self-review, written while they ran, is ''notes/mp_selfreview.md''. |
| | |
| | ==== Round 1: focused reviewers (Sonnet) ==== |
| | |
| | ^ # ^ Reviewer ^ Finding ^ Decision ^ |
| | | F1 | figures | "the ecosystem vocabulary finds all 16 at twice the gap rule's precision" — the ratio is 53.3 / 40.5 = 1.32 | **Accepted.** Now states both precisions; the report's Y block prints the ratio. | |
| | | F2 | figures | {[shi2026_better]} coded ''denominator: yes'' with no supporting sentence; "six of the nine" should be five | **Accepted.** Recoded ''no''; WRAP box now "Five of the nine". I re-read the paper's discussion: its generality caveat is about hosts, not about the crawl covering the ecosystem. | |
| | | F3 | figures | {[wang2025_wechat]} ''keywords: Chinese'' rests on a sentence describing a cited method | **Accepted.** Recoded ''not-stated''; the field's definition now says "the paper's own seed terms". No printed figure moved (the field is tallied over deployed-population papers only). | |
| | | F4 | figures | {[cai2025_tell]} ''artifacts: none-stated'' although it discusses and declines release | **Accepted.** New value ''declined''; the report's artefact tallies and schema cross-check updated so ''declined'' still counts as no release (11 of 16 unchanged). | |
| | | F5 | figures | three cells in the papers table drop a figure or host list the report has | **Accepted.** Host lists and "1,031 documented APIs" filled in; 1,031 added as a verifier needle. | |
| | | C1 | citations | the RIoTFuzzer obfuscation quote omits "as reported in [45]", and [45] is {[zhang2021_measurement]} | **Accepted.** Sentence credits {[zhang2021_measurement]}'s obfuscation-rate measurement (its abstract, re-fetched by the external script) and quotes RIoTFuzzer citing it. The span is column-spliced in ''.cols'' ("as" sits before a figure caption), so it is checked as a needle. | |
| | | X1 | external | Ackites/KillWxapkg, the most-starred unpacker, is missing | **Accepted.** Added to the tool table and the currency row as stalling (v2.4.1, 2024-09-20); both facts re-fetched by the script. | |
| | | X2 | external | WeMinT's repository bundles wxappUnpacker, contradicting "research groups do not ship unpackers" | **Accepted.** "Most research groups", WeMinT named as the exception; checked by the script through the GitHub contents API. | |
| | | X3 | external | two August 2026 arXiv preprints measure Telegram Mini Apps | **Accepted.** Cited in Beyond WeChat, the currency table and Open Questions, with "not yet in any venue"; both abstract pages re-fetched by the script. The "no paper in these venues" claim stands and is now dated against them. | |
| | | X4 | external | the SoK "no journal-ref" check cannot fail when the paper is published without the author updating arXiv | **Accepted.** Replaced with an OpenAlex check that every indexed location is a repository. | |
| | | X5 | external | ''get()'' never checked the HTTP status | **Accepted.** ''get()'' now prints the status and FAILs on non-2xx. | |
| | | X6 | external | the parent rates Xposed dead and LSPosed stalled, so "superseded for general hooking" implies a healthier contrast than the parent gives | **Accepted.** Reworded to the parent's own verdicts. | |
| | | S1–S5 | self | "every dynamic study hooks the client"; "75 of 81 reachable only as a mini-program"; "serves its corpora"; "every large corpus hooked the client"; "the same failure class as AppSecret leaks" | **Applied** — each over-generalised a paper or a source; see ''notes/mp_selfreview.md''. | |
| | |
| | Round 1 accepted all 12 reviewer findings and rejected none. The citations reviewer checked all 26 keys, the USENIX/PoPETs author lists and about 20 quotes independently and found one defect, which is what a clean pass looks like when the verifier has already run; the figures reviewer's F2 is the one that changed a headline number and could only be found by reading a paper, not by any guard. |
| | |
| | ==== Round 2: re-check of the fixes (Sonnet) and the generic review (Fable) ==== |
| | |
| | The re-check diffed the two snapshots, re-fetched every new external claim, mutation-tested the hardened ''get()'' and the OpenAlex check, and found **0** defects in the round-1 fixes (''notes/mp_review_recheck.md''). The generic review (''notes/mp_review_generic.md'') ran on the same snapshot (rev 1790527251 / 1790527253) and returned 20 findings, 6 marked major. |
| | |
| | ^ # ^ Finding ^ Decision ^ |
| | | G1 (major) | "recall almost nowhere … bounded at best by 100 unflagged" is contradicted by recall 85.56% (500 per host) and 83.55% (a labelled set) | **Accepted.** Vulnerability paragraph, currency row and Open Question rewritten with the counts; recall figures added as needles. | |
| | | G2 (major) | {[yang2025_miniapp]} ''denominator: yes'' rests on detector caveats; "five of the nine" is four | **Accepted.** Re-read: its "representative and generalizable" sentence is about countermeasures across hosts. Recoded; WRAP box "Four of the nine"; all nine denominator codes then re-checked against the text (see [[#The hand audit]]). | |
| | | G3 (major) | "none of the 16 discusses the host's terms" — the 2026 mini-games paper asserts "compliance with platform policies" | **Accepted.** Now "none quotes or analyses the licence", with the three compliance assertions named; backed by section K's terms probe (every hit read). | |
| | | G4 (major) | "WeChat resists emulators / Unreliable" contradicts the page's own Android 14 emulator paper and the BlueStacks run | **Accepted.** "Stock images do not run it; others did"; currency row "Mixed". | |
| | | G5 (major) | MiniCAT: the 14,920 timeouts are quoted, not "silent"; the informative denominator is the 26,806 completed (49.8%) | **Accepted** with the reviewer's caveat that the paper does not say whether a timed-out query can flag. Y block prints it. | |
| | | G6 (major) | MiniCrawler "closed" in the intro rests on one 2024 sentence, against later papers that name it | **Accepted.** Intro and currency row now state both sides; "What to Read First" says "its 2024 report". The reviewer counted three later papers; on re-reading, two name MiniCrawler or its extension for undated crawls (2025, 2026) and one reuses the extended crawler's method — the page says that. | |
| | | G7 | gated datasets "reused by later papers" / "Current, cheapest start" with no corpus use | **Accepted.** "None in the corpus"; currency "Available, untried in these venues", with the crawl's age. | |
| | | G8 | "quarterly results for 2025–2026" wider than the three releases read | **Accepted.** Names the three documents. | |
| | | G9 | the host "oracle" is a token grab with a third party's leaked secret, recommended without an ethics note | **Accepted.** Said in the vulnerability paragraph, the ethics bullets and the currency row. | |
| | | G10 | 975/570 is a 2021 count stated in the present tense | **Accepted.** Dated in the intro and Language section; the 2021 date is a needle. | |
| | | G11 | Telegram ''photo_url'' is optional and privacy-gated | **Accepted.** Reworded; the "privacy settings allow" clause is now an external check. | |
| | | G12 | DevTools cannot attach to a third-party mini-program; the bug note is 2021-era | **Accepted.** Added with the remote-debugging and ''wx.setEnableDebug'' documentation, both re-fetched by the script. | |
| | | G13 | "measured once" vs two host-side papers | **Accepted.** | |
| | | G14 | the filing system is a lookup by number or name, not a category browse | **Accepted.** "If it can be enumerated". | |
| | | G15 | the provenance does not say how many hand codes were checked against the paper | **Accepted.** 41 of 288 systematically, 6 wrong among those checked; recorded in [[#The hand audit]]. | |
| | | G16 | the provenance recorded a fourth review before it ran | **Accepted.** This log and the Agents row were rewritten after the last review returned. | |
| | | G17 | the recall probe's six hits reported as one | **Accepted.** | |
| | | G18 | one table cell carried two tools' states unattributed | **Accepted.** | |
| | | G19 | "nobody knows the size of any ecosystem" — the hosts do | **Accepted.** "No host publishes a count you can use as a denominator." | |
| | | G20 | storage budgets and the licence's governing-law clause are missing; the 8.2.1.4 reading is the page's own | **Accepted.** 6.29 TB and 126.38 GB (needles) with per-package arithmetic; clause 12.3 (external check); "on our reading". | |
| | |
| | All 20 accepted, none rejected. The generic pass found the defects no guard could: four sentences about the literature that the papers contradict (G1, G3, G4, G6), a second instance of the hand-code error the figures reviewer had found one paper over (G2), and advice with an unstated ethics cost (G9). Its fixes were re-verified by the verifier (46 spans, 100 needles, 0 not located), the external script (68 OK, 0 FAILED) and the number guard; they were **not** sent to a third review round. The round-2 fixes are therefore reviewed only by those guards. |
| | |
| | ==== Round 3: re-check of the round-2 fixes (Sonnet) ==== |
| | |
| | ^ # ^ Finding ^ Decision ^ |
| | | R1 | the G1 fix still undercounts: {[zhou2025_secrets]} reports recall on a labelled benchmark (83.38% on WeChat, Table 14); only its 300-detection field check is precision-only | **Accepted.** Vulnerability paragraph, Open Question and currency row now say two papers report recall against a labelled set; 83.38% added as a needle. | |
| | |
| | The re-check verified every other round-2 fix against the papers and the fetched sources, and checked the provenance's hand-code audit bullet ("41 of 288", "6 wrong") against the review record. The R1 fix is a three-phrase change backed by a verifier needle and was not sent to a further round. |
| |
| ===== The report script ===== | ===== The report script ===== |
| const sIrb = p.ethics === null ? '(none)' : p.ethics.reviewOutcome, sArt = p.artifacts === null ? '(none)' : p.artifacts.availability; | const sIrb = p.ethics === null ? '(none)' : p.ethics.reviewOutcome, sArt = p.artifacts === null ? '(none)' : p.artifacts.availability; |
| if ((h.irb === 'approval') !== (sIrb === 'approved')) console.log(` review hand/schema disagree: ${k} (hand ${h.irb}, schema ${sIrb})`); | if ((h.irb === 'approval') !== (sIrb === 'approved')) console.log(` review hand/schema disagree: ${k} (hand ${h.irb}, schema ${sIrb})`); |
| if ((h.artifacts !== 'none-stated') !== (sArt === 'public' || sArt === 'restricted')) console.log(` artifacts hand/schema disagree: ${k} (hand ${h.artifacts}, schema ${sArt})`); | if (['code', 'code+data', 'gated-data'].includes(h.artifacts) !== (sArt === 'public' || sArt === 'restricted')) console.log(` artifacts hand/schema disagree: ${k} (hand ${h.artifacts}, schema ${sArt})`); |
| } | } |
| const llmSchema = inP.filter((p) => p.classification.some((c) => c.method === 'llm')).length; | const llmSchema = inP.filter((p) => p.classification.some((c) => c.method === 'llm')).length; |
| ar('chen2026_minigames: Cocos games / crawled', 2076, 6769); | ar('chen2026_minigames: Cocos games / crawled', 2076, 6769); |
| ar('wang2025_wechat: analysed / attempted', 104, 170); | ar('wang2025_wechat: analysed / attempted', 104, 170); |
| console.log(` IN papers releasing code (code, code+data): ${IN.filter(([k]) => ['code', 'code+data'].includes(HAND[k].artifacts)).length} of ${nIn}; any artefact incl. gated data: ${IN.filter(([k]) => HAND[k].artifacts !== 'none-stated').length}`); | console.log(` IN papers releasing code (code, code+data): ${IN.filter(([k]) => ['code', 'code+data'].includes(HAND[k].artifacts)).length} of ${nIn}; any artefact incl. gated data: ${IN.filter(([k]) => ['code', 'code+data', 'gated-data'].includes(HAND[k].artifacts)).length}`); |
| | ar('zhang2024_minicat: potentially vulnerable / analysed minus timed out (41,726 - 14,920)', 13349, 41726 - 14920); |
| | console.log(` zhang2024_minicat: packages on which the detector completed: ${(41726 - 14920).toLocaleString('en-US')}`); |
| | console.log(` yang2022_cross: storage per WeChat package: 6.29 TB / 2,571,490 = ${(6.29e12 / 2571490 / 1e6).toFixed(2)} MB (decimal units)`); |
| | console.log(` zhang2024_minicat: storage per unpacked package: 126.38 GB / 44,273 = ${(126.38e9 / 44273 / 1e6).toFixed(2)} MB (decimal units)`); |
| | console.log(` vocabulary >= 3 precision / gap-rule precision: ${(16 / 30 / (15 / 37)).toFixed(2)}x (53.3% vs 40.5%)`); |
| console.log(` IN papers stating an IRB/ethics-board approval: ${IN.filter(([k]) => HAND[k].irb === 'approval').length} of ${nIn}`); | console.log(` IN papers stating an IRB/ethics-board approval: ${IN.filter(([k]) => HAND[k].irb === 'approval').length} of ${nIn}`); |
| console.log(` IN papers using an LLM anywhere in the pipeline: ${IN.filter(([k]) => HAND[k].llm === 'yes').length} of ${nIn} (years ${IN.filter(([k]) => HAND[k].llm === 'yes').map(([k]) => byKey.get(k).year).join(', ')})`); | console.log(` IN papers using an LLM anywhere in the pipeline: ${IN.filter(([k]) => HAND[k].llm === 'yes').length} of ${nIn} (years ${IN.filter(([k]) => HAND[k].llm === 'yes').map(([k]) => byKey.get(k).year).join(', ')})`); |
| console.log(` hosts: papers including a host outside WeChat/Baidu/TikTok-Douyin/Alipay/QQ: ${IN.filter(([k]) => HAND[k].hosts.some((h) => h === 'other' || h === 'IoT host')).length}`); | console.log(` hosts: papers including a host outside WeChat/Baidu/TikTok-Douyin/Alipay/QQ: ${IN.filter(([k]) => HAND[k].hosts.some((h) => h === 'other' || h === 'IoT host')).length}`); |
| console.log(` hosts: papers naming a host other than WeChat: ${IN.filter(([k]) => HAND[k].hosts.some((h) => h !== 'WeChat')).length}; WeChat-only: ${IN.filter(([k]) => HAND[k].hosts.length === 1 && HAND[k].hosts[0] === 'WeChat').length}`); | console.log(` hosts: papers naming a host other than WeChat: ${IN.filter(([k]) => HAND[k].hosts.some((h) => h !== 'WeChat')).length}; WeChat-only: ${IN.filter(([k]) => HAND[k].hosts.length === 1 && HAND[k].hosts[0] === 'WeChat').length}`); |
| | |
| | // ---------------------------------------------------------------- K. probes behind the page's negative claims about the 16 |
| | // Each hand code the page prints as "none" or "not stated" is backed by a probe over the paper's own text; every hit was read. |
| | console.log('\n== K. Probes behind negative claims (distinct matched strings per paper; every hit read by hand) =='); |
| | const KP = { irb: /\bIRB\b|ethics? (review )?(board|committee)|institutional review|review board/gi, |
| | release: /github\.com\/[\w.-]+|zenodo|gitlab\.com|figshare|osf\.io/gi, |
| | terms: /terms of (service|use)|licen[cs]e agreement|platform polic(y|ies)|in compliance|ensur\w* compliance|comply with/gi }; |
| | for (const [k] of IN) { |
| | const t = fs.readFileSync(path.join(dataRoot(), 'fulltext', String(byKey.get(k).year), byKey.get(k).venue, byKey.get(k).slug, 'paper.cols.txt'), 'latin1').replace(/\u0000/g, '').replace(/\s+/g, ' '); |
| | const f = Object.fromEntries(Object.entries(KP).map(([n, re]) => [n, [...new Set((t.match(re) || []).map((x) => x.toLowerCase()))].slice(0, 5)])); |
| | console.log(` ${byKey.get(k).year} ${byKey.get(k).venue} ${byKey.get(k).slug.slice(0, 34)} | irb=${HAND[k].irb} ${JSON.stringify(f.irb)} | artifacts=${HAND[k].artifacts} ${JSON.stringify(f.release)} | terms ${JSON.stringify(f.terms)}`); |
| | } |
| | console.log(' reading of the terms hits: the 2026 mini-games paper asserts its crawl "ensur[es] compliance with platform policies"; the NDSS 2026 paper "compliance with all relevant laws and regulations"; the 2024 rental paper complies with "the vendor\'s bug bounty plan"; the other hits are about permission policies, privacy regulation or advertising policies. None quotes or analyses the host\'s user licence.'); |
| |
| if (process.argv.includes('--list')) { | if (process.argv.includes('--list')) { |
| 1 11.1% ground-truth-set | 1 11.1% ground-truth-set |
| -- denominator (of 9; multi-valued fields do not sum): | -- denominator (of 9; multi-valued fields do not sum): |
| 6 66.7% yes | 5 55.6% no |
| 3 33.3% no | 4 44.4% yes |
| |
| -- the 5 host-framework papers: | -- the 5 host-framework papers: |
| -- artifacts (of 16; multi-valued fields do not sum): | -- artifacts (of 16; multi-valued fields do not sum): |
| 8 50.0% code | 8 50.0% code |
| 5 31.3% none-stated | 4 25.0% none-stated |
| 2 12.5% code+data | 2 12.5% code+data |
| | 1 6.3% declined |
| 1 6.3% gated-data | 1 6.3% gated-data |
| |
| wang2025_wechat: analysed / attempted: 104 / 170 = 61.2% | wang2025_wechat: analysed / attempted: 104 / 170 = 61.2% |
| IN papers releasing code (code, code+data): 10 of 16; any artefact incl. gated data: 11 | IN papers releasing code (code, code+data): 10 of 16; any artefact incl. gated data: 11 |
| | zhang2024_minicat: potentially vulnerable / analysed minus timed out (41,726 - 14,920): 13,349 / 26,806 = 49.8% |
| | zhang2024_minicat: packages on which the detector completed: 26,806 |
| | yang2022_cross: storage per WeChat package: 6.29 TB / 2,571,490 = 2.45 MB (decimal units) |
| | zhang2024_minicat: storage per unpacked package: 126.38 GB / 44,273 = 2.85 MB (decimal units) |
| | vocabulary >= 3 precision / gap-rule precision: 1.32x (53.3% vs 40.5%) |
| IN papers stating an IRB/ethics-board approval: 3 of 16 | IN papers stating an IRB/ethics-board approval: 3 of 16 |
| IN papers using an LLM anywhere in the pipeline: 2 of 16 (years 2026, 2024) | IN papers using an LLM anywhere in the pipeline: 2 of 16 (years 2026, 2024) |
| hosts: papers including a host outside WeChat/Baidu/TikTok-Douyin/Alipay/QQ: 7 | hosts: papers including a host outside WeChat/Baidu/TikTok-Douyin/Alipay/QQ: 7 |
| hosts: papers naming a host other than WeChat: 10; WeChat-only: 6 | hosts: papers naming a host other than WeChat: 10; WeChat-only: 6 |
| | |
| | == K. Probes behind negative claims (distinct matched strings per paper; every hit read by hand) == |
| | 2020 CCS demystifying-resource-management-r | irb=none-mentioned [] | artifacts=code ["github.com/mozillasecurity","github.com/aslody","github.com/itseez"] | terms ["comply with"] |
| | 2022 CCS cross-miniapp-request-forgery-root | irb=none-mentioned [] | artifacts=code ["github.com/osuseclab"] | terms [] |
| | 2022 USENIX identity-confusion-in-webview-base | irb=none-mentioned [] | artifacts=none-stated ["github.com/soot-oss"] | terms [] |
| | 2023 CCS dont-leak-your-keys-understanding- | irb=none-mentioned [] | artifacts=none-stated [] | terms [] |
| | 2023 CCS uncovering-and-exploiting-hidden-a | irb=none-mentioned [] | artifacts=none-stated [] | terms [] |
| | 2023 USENIX one-size-does-not-fit-all-uncoveri | irb=none-mentioned [] | artifacts=code ["github.com/1n3"] | terms [] |
| | 2024 CCS minicat-understanding-and-detectin | irb=none-mentioned [] | artifacts=code ["github.com/en","github.com/fxsjy","github.com/pywinauto","github.com/system-cpu","github.com/imingyu"] | terms [] |
| | 2026 NDSS better-safe-than-sorry-uncovering- | irb=approval ["irb"] | artifacts=code+data ["zenodo","github.com/wemobiledev"] | terms ["ensure compliance"] |
| | 2025 PETS what-wechat-knows-pervasive-first- | irb=none-mentioned [] | artifacts=code+data ["github.com/wemobiledev"] | terms [] |
| | 2025 USENIX i-can-tell-your-secrets-inferring- | irb=approval ["irb"] | artifacts=declined [] | terms ["comply with"] |
| | 2026 USENIX when-fun-turns-toxic-a-first-look- | irb=none-mentioned [] | artifacts=code ["github.com/w","zenodo","github.com/cwi-swat","github.com/wala","github.com/swc-project"] | terms ["platform policies","platform policy","terms of use","ensuring compliance"] |
| | 2025 NDSS understanding-miniapp-malware-iden | irb=none-mentioned [] | artifacts=gated-data ["github.com/jkeylu","github.com/tarruda"] | terms ["terms of use"] |
| | 2025 NDSS the-skeleton-keys-a-large-scale-an | irb=approval ["irb"] | artifacts=code ["github.com/keymagnetproject2025","github.com/ant-move","github.com/wala"] | terms [] |
| | 2024 USENIX demystifying-the-security-implicat | irb=none-mentioned [] | artifacts=none-stated [] | terms ["comply with"] |
| | 2025 IEEE-SP hey-your-secrets-leaked-detecting- | irb=none-mentioned [] | artifacts=code ["github.com/abbrcode","github.com/david47k","github.com/dwyl","github.com/aoa0","github.com/gitleaks"] | terms [] |
| | 2024 CCS riotfuzzer-companion-app-assisted- | irb=none-mentioned [] | artifacts=code ["github.com/androguard","github.com/wireghoul","github.com/iputils","github.com/kzliu2017"] | terms [] |
| | reading of the terms hits: the 2026 mini-games paper asserts its crawl "ensur[es] compliance with platform policies"; the NDSS 2026 paper "compliance with all relevant laws and regulations"; the 2024 rental paper complies with "the vendor's bug bounty plan"; the other hits are about permission policies, privacy regulation or advertising policies. None quotes or analyses the host's user licence. |
| |
| OK: candidates and verdicts agree in both directions; every IN paper has hand codes. | OK: candidates and verdicts agree in both directions; every IN paper has hand codes. |
| // hostVersion pinned (a host-app version is stated) | os-only | not-stated | n/a | // hostVersion pinned (a host-app version is stated) | os-only | not-stated | n/a |
| // accounts own-test-accounts | non-Chinese-phone | real-name | operator | not-stated | // accounts own-test-accounts | non-Chinese-phone | real-name | operator | not-stated |
| // keywords Chinese (seed terms or NLP on Chinese text are described) | not-stated | n/a | // keywords Chinese (the paper's OWN seed terms or NLP on Chinese text are described; a cited prior method does not |
| | // count) | not-stated | n/a. Tallied only over deployed-population papers. |
| // validation manual-sample | manual-all | api-oracle | ground-truth-set | held-out | vendor-confirmation | manual-coding | // validation manual-sample | manual-all | api-oracle | ground-truth-set | held-out | vendor-confirmation | manual-coding |
| // denominator yes (the paper says its sample is not the population, or why) | no | // denominator yes (the paper says its sample is not the population, or why) | no |
| // artifacts code | code+data | gated-data | none-stated. Two readers missed a release URL printed only in | // artifacts code | code+data | gated-data | declined (discussed and withheld) | none-stated. Two readers missed a release URL printed only in |
| // the reference list (KeySentinel, RIoTFuzzer); the report's schema cross-check caught both. | // the reference list (KeySentinel, RIoTFuzzer); the report's schema cross-check caught both. |
| export const HAND_FIELDS = ['unit', 'hosts', 'side', 'acquisition', 'collected', 'analysed', 'analysis', 'tools', 'instrumentation', 'hostVersion', 'accounts', 'keywords', 'validation', 'llm', 'irb', 'disclosure', 'artifacts', 'denominator']; | export const HAND_FIELDS = ['unit', 'hosts', 'side', 'acquisition', 'collected', 'analysed', 'analysis', 'tools', 'instrumentation', 'hostVersion', 'accounts', 'keywords', 'validation', 'llm', 'irb', 'disclosure', 'artifacts', 'denominator']; |
| analysis: ['static', 'dynamic', 'manual'], tools: ['ICREMiner', 'Gemini'], instrumentation: [], hostVersion: 'not-stated', | analysis: ['static', 'dynamic', 'manual'], tools: ['ICREMiner', 'Gemini'], instrumentation: [], hostVersion: 'not-stated', |
| accounts: 'own-test-accounts', keywords: 'not-stated', validation: 'manual-all', llm: 'yes', irb: 'approval', | accounts: 'own-test-accounts', keywords: 'not-stated', validation: 'manual-all', llm: 'yes', irb: 'approval', |
| disclosure: ['host-vendor', 'developers'], artifacts: 'code+data', denominator: 'yes', | disclosure: ['host-vendor', 'developers'], artifacts: 'code+data', denominator: 'no', |
| }, | }, |
| 'PETS/2025/what-wechat-knows-pervasive-first-party-tracking-in-a-billion-user-super-app-eco': { | 'PETS/2025/what-wechat-knows-pervasive-first-party-tracking-in-a-billion-user-super-app-eco': { |
| acquisition: ['rankings', 'keyword-search'], collected: '170', analysed: '104', | acquisition: ['rankings', 'keyword-search'], collected: '170', analysed: '104', |
| analysis: ['dynamic', 'manual'], tools: ['Frida', 'Jadx', 'Ghidra', 'IDA Pro'], instrumentation: ['Frida'], hostVersion: 'pinned', | analysis: ['dynamic', 'manual'], tools: ['Frida', 'Jadx', 'Ghidra', 'IDA Pro'], instrumentation: ['Frida'], hostVersion: 'pinned', |
| accounts: 'non-Chinese-phone', keywords: 'Chinese', validation: 'manual-coding', llm: 'no', irb: 'none-mentioned', | accounts: 'non-Chinese-phone', keywords: 'not-stated', validation: 'manual-coding', llm: 'no', irb: 'none-mentioned', |
| disclosure: ['host-vendor'], artifacts: 'code+data', denominator: 'yes', | disclosure: ['host-vendor'], artifacts: 'code+data', denominator: 'yes', |
| }, | }, |
| analysis: ['ml'], tools: ['THEFT (DNN)'], instrumentation: [], hostVersion: 'n/a', | analysis: ['ml'], tools: ['THEFT (DNN)'], instrumentation: [], hostVersion: 'n/a', |
| accounts: 'operator', keywords: 'n/a', validation: 'held-out', llm: 'no', irb: 'approval', | accounts: 'operator', keywords: 'n/a', validation: 'held-out', llm: 'no', irb: 'approval', |
| disclosure: ['host-vendor'], artifacts: 'none-stated', denominator: 'yes', | disclosure: ['host-vendor'], artifacts: 'declined', denominator: 'yes', |
| }, | }, |
| 'USENIX/2026/when-fun-turns-toxic-a-first-look-at-aggressive-advertising-in-mini-games': { | 'USENIX/2026/when-fun-turns-toxic-a-first-look-at-aggressive-advertising-in-mini-games': { |
| analysis: ['static'], tools: ['MiniCrawler'], instrumentation: [], hostVersion: 'not-stated', | analysis: ['static'], tools: ['MiniCrawler'], instrumentation: [], hostVersion: 'not-stated', |
| accounts: 'not-stated', keywords: 'not-stated', validation: 'manual-sample', llm: 'no', irb: 'none-mentioned', | accounts: 'not-stated', keywords: 'not-stated', validation: 'manual-sample', llm: 'no', irb: 'none-mentioned', |
| disclosure: ['host-vendor'], artifacts: 'gated-data', denominator: 'yes', | disclosure: ['host-vendor'], artifacts: 'gated-data', denominator: 'no', |
| }, | }, |
| 'NDSS/2025/the-skeleton-keys-a-large-scale-analysis-of-credential-leakage-in-mini-apps': { | 'NDSS/2025/the-skeleton-keys-a-large-scale-analysis-of-credential-leakage-in-mini-apps': { |
| lee2025_deep: 'CCS/2025/deep-dive-into-in-app-browsers-uncovering-hidden-pitfalls-in-certificate-validat', | lee2025_deep: 'CCS/2025/deep-dive-into-in-app-browsers-uncovering-hidden-pitfalls-in-certificate-validat', |
| wei2026_raising: 'EXT:out/mp/ext/wei_zhiao.txt', | wei2026_raising: 'EXT:out/mp/ext/wei_zhiao.txt', |
| | zhang2021_measurement: 'EXT:out/mp/ext/zhang2021_abstract.txt', |
| }; | }; |
| |
| ['wei2026_raising', 'We disclosed all identified vulnerabilities to the Security Response Centers of Tencent, Baidu, and Alipay', 'disclosure'], | ['wei2026_raising', 'We disclosed all identified vulnerabilities to the Security Response Centers of Tencent, Baidu, and Alipay', 'disclosure'], |
| ['lee2025_deep', 'we conducted WeChat-specific experiments on BlueStacks', 'BlueStacks'], | ['lee2025_deep', 'we conducted WeChat-specific experiments on BlueStacks', 'BlueStacks'], |
| | ['wang2023_size', 'we have 1,031 APIs in total', '1,031 documented APIs'], |
| | ['yang2022_cross', 'consume 6.29 TB disk storage. We also extended M', '6.29 TB'], |
| | ['zhang2024_minicat', 'which occupied a storage space of 126.38 GB', '126.38 GB'], |
| | ['zhang2024_minicat', 'introduced a 5-minute timeout for CodeQL queries', 'five-minute timeout'], |
| | ['shi2025_skeleton', 'The average precision of KeyMagnet is 95.04% and the recall is 85.56%', 'recall 85.56%'], |
| | ['chen2026_minigames', 'with a recall of 83.55%', 'recall 83.55%'], |
| | ['zhou2025_secrets', 'WeChat 902 89.91% 83.38%', 'WeChat benchmark recall 83.38% (Table 14)'], |
| | ['chen2026_minigames', 'This process produced 371 labeled Ad-behaviors', '371 labelled behaviours'], |
| | ['zhang2023_leak', 'Api.weixin.qq.com/cgi-bin/token', 'the oracle is the token endpoint'], |
| | ['chen2026_minigames', 'All test data was', 'crawl compliance assertion'], |
| | ['shi2026_better', 'we ensure compliance with all relevant laws and regulations', 'compliance with laws'], |
| | ['he2024_demystifying', "comply with the vendor's bug bounty plan", 'bug-bounty plan'], |
| | ['wang2023_uncovering', 'Our experiments were conducted primarily in 2021', 'the 975/570 count is from 2021'], |
| | ['liu2024_riotfuzzer', 'reported in [45], most mini-apps employ obfuscation techniques', 'citing zhang2021 (as is spliced off in .cols)'], |
| ]; | ]; |
| const CONTROLS = [ | const CONTROLS = [ |
| OK pypdf line 86 wang2025_wechat | OK pypdf line 86 wang2025_wechat |
| "38.8% of them required ID verification or Chinese phone number verification" | "38.8% of them required ID verification or Chinese phone number verification" |
| | OK paper.cols.txt line 89 yang2022_cross |
| | "6.29 TB disk storage" |
| OK paper.cols.txt line 98 zhang2024_minicat | OK paper.cols.txt line 98 zhang2024_minicat |
| "due to their use of a newer version of the WeChat mini-program base library" | "due to their use of a newer version of the WeChat mini-program base library" |
| OK pypdf line 103 yang2025_miniapp | OK pypdf line 104 yang2025_miniapp |
| "the malware may dynamically hide malicious contents without distributing them to the front-end by the time we tested the cases" | "the malware may dynamically hide malicious contents without distributing them to the front-end by the time we tested the cases" |
| OK paper.cols.txt line 103 liu2024_riotfuzzer | OK EXTERNAL line 106 TaintMini README: unpacker not provided due to potential legal implications |
| "most mini-apps employ obfuscation techniques" | |
| OK EXTERNAL line 105 TaintMini README: unpacker not provided due to potential legal implications | |
| "due to potential legal implications" | "due to potential legal implications" |
| OK EXTERNAL line 105 WeChat licence 8.2.1.4: no plug-ins or unauthorised third-party tools | OK EXTERNAL line 106 WeChat licence 8.2.1.4: no plug-ins or unauthorised third-party tools |
| "使用插件、外挂或非经腾讯授权的第三方工具" | "使用插件、外挂或非经腾讯授权的第三方工具" |
| OK paper.cols.txt line 112 lee2025_deep | OK paper.cols.txt line 113 lee2025_deep |
| "WeChat failed to launch even on Android 11 AVDs" | "WeChat failed to launch even on Android 11 AVDs" |
| OK paper.cols.txt line 115 wang2025_wechat | OK paper.cols.txt line 113 lee2025_deep |
| | "a configuration publicly known to support the app reliably" |
| | OK paper.cols.txt line 116 wang2025_wechat |
| "decided against further automation" | "decided against further automation" |
| OK EXTERNAL line 117 SaTS 26 topics include Agentic/LLM-based techniques | OK EXTERNAL line 118 SaTS 26 topics include Agentic/LLM-based techniques |
| "Agentic/LLM-based techniques" | "Agentic/LLM-based techniques" |
| OK paper.cols.txt line 123 wang2025_wechat | OK paper.cols.txt line 124 wang2025_wechat |
| "Of the 104 Mini Programs we coded, 51 had profile update flows, 85 had search flows, and 96 had browsing flows. 84.3%, 72.9%, and 76.0% of those flows were exfi" | "Of the 104 Mini Programs we coded, 51 had profile update flows, 85 had search flows, and 96 had browsing flows. 84.3%, 72.9%, and 76.0% of those flows were exfi" |
| OK paper.cols.txt line 123 wang2025_wechat | OK paper.cols.txt line 124 wang2025_wechat |
| "we also identified browsing data in 89.7% of the traces we decrypted from 40 health-related Mini Programs" | "we also identified browsing data in 89.7% of the traces we decrypted from 40 health-related Mini Programs" |
| OK paper.cols.txt line 123 wang2025_wechat | OK paper.cols.txt line 124 wang2025_wechat |
| "reflect a baseline of WeChat analytics' data collection" | "reflect a baseline of WeChat analytics' data collection" |
| OK paper.cols.txt line 124 cai2025_tell | OK paper.cols.txt line 125 cai2025_tell |
| "only one superapp (WeChat) mentions that it collects Mini-H" | "only one superapp (WeChat) mentions that it collects Mini-H" |
| OK paper.cols.txt line 134 shi2025_skeleton | OK paper.cols.txt line 135 shi2025_skeleton |
| "84,491 credential leaks are detected, spanning over 54,728 mini-apps" | "84,491 credential leaks are detected, spanning over 54,728 mini-apps" |
| OK paper.cols.txt line 137 zhou2025_secrets | OK paper.cols.txt line 138 zhou2025_secrets |
| "30.08% of 41,719 WeChat MPs contain leaked secrets" | "30.08% of 41,719 WeChat MPs contain leaked secrets" |
| OK paper.cols.txt line 139 chen2026_minigames | OK paper.cols.txt line 140 chen2026_minigames |
| "49.95% of ad-enabled mini-games" | "49.95% of ad-enabled mini-games" |
| OK paper.cols.txt line 145 wang2025_wechat | OK paper.cols.txt line 142 yang2022_cross |
| | "making the FN rate to 2%" |
| | OK paper.cols.txt line 146 wang2025_wechat |
| "purchased Canadian and American phone numbers, which resulted in various restrictions and limitations to our study" | "purchased Canadian and American phone numbers, which resulted in various restrictions and limitations to our study" |
| OK paper.cols.txt line 145 wang2025_wechat (WARN: located in a citekey other than the nearest) | OK paper.cols.txt line 146 wang2025_wechat (WARN: located in a citekey other than the nearest) |
| "evidence that WeChat behaves differently when registered to a Chinese phone number [55], which may bias our results" | "evidence that WeChat behaves differently when registered to a Chinese phone number [55], which may bias our results" |
| OK EXTERNAL line 155 Telegram Mini Apps: launched right inside Telegram | OK EXTERNAL line 156 Telegram Mini Apps: launched right inside Telegram |
| "launched right inside Telegram" | "launched right inside Telegram" |
| OK EXTERNAL line 155 Telegram Mini Apps: can completely replace any website | OK EXTERNAL line 156 Telegram Mini Apps: can completely replace any website |
| "can completely replace any website" | "can completely replace any website" |
| OK EXTERNAL line 155 Telegram Mini Apps: initDataUnsafe should not be trusted | OK EXTERNAL line 156 Telegram Mini Apps: initDataUnsafe should not be trusted |
| "should not be trusted" | "should not be trusted" |
| OK EXTERNAL line 156 TikTok mini games: app selects a version and obtains its code package | OK EXTERNAL line 157 TikTok mini games: app selects a version and obtains its code package |
| "selects an available version and obtains its code package" | "selects an available version and obtains its code package" |
| OK pypdf line 163 wang2023_uncovering | OK pypdf line 164 wang2023_uncovering |
| "We have never uploaded our malicious miniapps onto the markets to harm other users" | "We have never uploaded our malicious miniapps onto the markets to harm other users" |
| OK pypdf line 164 yang2025_miniapp (WARN: located in a citekey other than the nearest) | OK pypdf line 165 yang2025_miniapp (WARN: located in a citekey other than the nearest) |
| "a few seconds per miniapp" | "a few seconds per miniapp" |
| OK paper.cols.txt line 165 shi2026_better | OK paper.cols.txt line 166 shi2026_better |
| "without accessing the cloud data" | "without accessing the cloud data" |
| OK paper.cols.txt line 167 zhang2024_minicat | OK paper.cols.txt line 168 zhang2024_minicat |
| "248/316 (78.5%)" | "248/316 (78.5%)" |
| spans: 43; by route: paper.cols.txt 24, publisher-pdf 1, EXTERNAL 12, pypdf 6 | OK paper.cols.txt line 170 chen2026_minigames |
| | "compliance with platform policies" |
| | spans: 46; by route: paper.cols.txt 27, publisher-pdf 1, EXTERNAL 12, pypdf 6 |
| |
| == B. Per-paper figures == | == B. Per-paper figures == |
| OK paper.cols.txt lee2025_deep | BlueStacks | OK paper.cols.txt lee2025_deep | BlueStacks |
| "we conducted WeChat-specific experiments on BlueStacks" | "we conducted WeChat-specific experiments on BlueStacks" |
| needles: 87; by route: pypdf 10, paper.cols.txt 74, pypdf+dehyph 1, publisher-pdf 2; weak (<20 chars): 9 | OK paper.cols.txt wang2023_size | 1,031 documented APIs |
| | "we have 1,031 APIs in total" |
| | OK paper.cols.txt yang2022_cross | 6.29 TB |
| | "consume 6.29 TB disk storage. We also extended M" |
| | OK paper.cols.txt zhang2024_minicat | 126.38 GB |
| | "which occupied a storage space of 126.38 GB" |
| | OK paper.cols.txt zhang2024_minicat | five-minute timeout |
| | "introduced a 5-minute timeout for CodeQL queries" |
| | OK pypdf shi2025_skeleton | recall 85.56% |
| | "The average precision of KeyMagnet is 95.04% and the recall is 85.56%" |
| | OK paper.cols.txt chen2026_minigames | recall 83.55% |
| | "with a recall of 83.55%" |
| | OK paper.cols.txt zhou2025_secrets | WeChat benchmark recall 83.38% (Table 14) |
| | "WeChat 902 89.91% 83.38%" |
| | OK paper.cols.txt chen2026_minigames | 371 labelled behaviours |
| | "This process produced 371 labeled Ad-behaviors" |
| | OK paper.cols.txt zhang2023_leak | the oracle is the token endpoint |
| | "Api.weixin.qq.com/cgi-bin/token" |
| | OK paper.cols.txt WEAK chen2026_minigames | crawl compliance assertion |
| | "All test data was" |
| | OK paper.cols.txt shi2026_better | compliance with laws |
| | "we ensure compliance with all relevant laws and regulations" |
| | OK paper.cols.txt he2024_demystifying | bug-bounty plan |
| | "comply with the vendor's bug bounty plan" |
| | OK pypdf wang2023_uncovering | the 975/570 count is from 2021 |
| | "Our experiments were conducted primarily in 2021" |
| | OK paper.cols.txt liu2024_riotfuzzer | citing zhang2021 (as is spliced off in .cols) |
| | "reported in [45], most mini-apps employ obfuscation techniques" |
| | needles: 101; by route: pypdf 12, paper.cols.txt 86, pypdf+dehyph 1, publisher-pdf 2; weak (<20 chars): 10 |
| |
| === EXTERNAL FIGURES (non-corpus; each re-fetched by external_checks_mini_programs.sh — see its labels) === | === EXTERNAL FIGURES (non-corpus; each re-fetched by external_checks_mini_programs.sh — see its labels) === |
| then echo "OK $1"; else echo "FAILED $1"; FAILS=$((FAILS+1)); fi | then echo "OK $1"; else echo "FAILED $1"; FAILS=$((FAILS+1)); fi |
| } | } |
| get() { curl -sL -m 60 -A "$UA" "$1" -o "$2"; echo " GET $1 -> $(wc -c < "$2") bytes"; } | # get: fetch, print the final HTTP status, and FAIL on a non-2xx so a broken URL cannot pass on an accidental match |
| | get() { |
| | local code; code=$(curl -sL -m 60 -A "$UA" -w '%{http_code}' "$1" -o "$2") |
| | echo " GET $1 -> HTTP $code, $(wc -c < "$2") bytes" |
| | case "$code" in 2??) ;; *) echo "FAILED HTTP $code for $1"; FAILS=$((FAILS+1));; esac |
| | } |
| gh() { curl -sL -m 40 "${AUTH[@]}" -H 'Accept: application/vnd.github+json' "https://api.github.com/repos/$1" -o "$2"; } | gh() { curl -sL -m 40 "${AUTH[@]}" -H 'Accept: application/vnd.github+json' "https://api.github.com/repos/$1" -o "$2"; } |
| ghc() { curl -sL -m 40 "${AUTH[@]}" -H 'Accept: application/vnd.github+json' "https://api.github.com/repos/$1/commits?per_page=1" -o "$2"; } | ghc() { curl -sL -m 40 "${AUTH[@]}" -H 'Accept: application/vnd.github+json' "https://api.github.com/repos/$1/commits?per_page=1" -o "$2"; } |
| check 'MiniCAT README: wxappUnpacker not provided due to potential legal implications' $TMP/kee1ongz_MiniCAT.md 'Due to potential legal implications, we DO NOT provide wxappUnpacker' | check 'MiniCAT README: wxappUnpacker not provided due to potential legal implications' $TMP/kee1ongz_MiniCAT.md 'Due to potential legal implications, we DO NOT provide wxappUnpacker' |
| check 'APIDiff README: crawlers not provided due to potential legal implications' $TMP/OSUSecLab_APIDiff.md 'not able to provide such web crawlers due to potential legal implications' | check 'APIDiff README: crawlers not provided due to potential legal implications' $TMP/OSUSecLab_APIDiff.md 'not able to provide such web crawlers due to potential legal implications' |
| | curl -sL -m 40 "${AUTH[@]}" https://api.github.com/repos/Ackites/KillWxapkg/releases/latest -o $TMP/kw.json |
| | ghc Ackites/KillWxapkg $TMP/kw_c.json; lastc KillWxapkg $TMP/kw_c.json |
| | check 'KillWxapkg latest release v2.4.1' $TMP/kw.json '"tag_name": ?"v2\.4\.1"' |
| | check 'KillWxapkg last commit 2024-09-20' $TMP/kw_c.json '"date": ?"2024-09-20' |
| | curl -sL -m 40 "${AUTH[@]}" https://api.github.com/repos/EEEEEEcho/wemint/contents/wxappUnpacker -o $TMP/wemint_wxu.json |
| | check 'WeMinT repository bundles wxappUnpacker (wuWxapkg.js present)' $TMP/wemint_wxu.json '"name": ?"wuWxapkg\.js"' |
| get https://minimalware.github.io/ $TMP/minimal.html | get https://minimalware.github.io/ $TMP/minimal.html |
| check 'MiniSec datasets: AppSecret set requires additional consent and agreement' $TMP/minimal.html 'requires additional consent and agreement' | check 'MiniSec datasets: AppSecret set requires additional consent and agreement' $TMP/minimal.html 'requires additional consent and agreement' |
| get https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserProfile.html $TMP/wx_gup.html | get https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserProfile.html $TMP/wx_gup.html |
| check 'getUserProfile: DevTools 2.10.4-2.16.1 real data, devices anonymous' $TMP/wx_gup.html '开发者工具中 ?2\.10\.4 ?~ ?2\.16\.1 ?基础库版本.{0,80}真机上此区间会按照公告返回匿名数据' | check 'getUserProfile: DevTools 2.10.4-2.16.1 real data, devices anonymous' $TMP/wx_gup.html '开发者工具中 ?2\.10\.4 ?~ ?2\.16\.1 ?基础库版本.{0,80}真机上此区间会按照公告返回匿名数据' |
| | get https://developers.weixin.qq.com/miniprogram/dev/devtools/remote-debug.html $TMP/wx_rd.html |
| | check 'DevTools remote debugging packs and uploads the local code' $TMP/wx_rd.html '工具会将本地代码进行处理打包并上传' |
| | get https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/wx.setEnableDebug.html $TMP/wx_dbg.html |
| | check 'wx.setEnableDebug: debug switch set by the mini-program, works on release builds' $TMP/wx_dbg.html '此开关对正式版也能生效' |
| get https://developers.weixin.qq.com/miniprogram/product/record/record_faq.html $TMP/wx_faq.html | get https://developers.weixin.qq.com/miniprogram/product/record/record_faq.html $TMP/wx_faq.html |
| check 'Filing FAQ: unfiled mini-programs become inaccessible or delisted' $TMP/wx_faq.html '无法访问或下架' | check 'Filing FAQ: unfiled mini-programs become inaccessible or delisted' $TMP/wx_faq.html '无法访问或下架' |
| check 'WeChat licence 8.2.1.4: no plug-ins or unauthorised third-party tools' $TMP/wx_lic.html '8\.2\.1\.4.{0,200}使用插件、外挂或非经腾讯授权的第三方工具' | check 'WeChat licence 8.2.1.4: no plug-ins or unauthorised third-party tools' $TMP/wx_lic.html '8\.2\.1\.4.{0,200}使用插件、外挂或非经腾讯授权的第三方工具' |
| get https://www.wechat.com/en/service_terms.html $TMP/wx_tos.html | get https://www.wechat.com/en/service_terms.html $TMP/wx_tos.html |
| | check 'WeChat licence 12.3: governed by mainland-Chinese law' $TMP/wx_lic.html '12\.3 ?本协议的成立、生效、履行、解释及纠纷解决,适用中华人民共和国大陆地区法律' |
| check 'WeChat international ToS: last modified 2025-11-18' $TMP/wx_tos.html 'Last modified: ?2025-11-18' | check 'WeChat international ToS: last modified 2025-11-18' $TMP/wx_tos.html 'Last modified: ?2025-11-18' |
| check 'WeChat international ToS: no reverse engineering of WeChat Software' $TMP/wx_tos.html 'reverse engineer or extract source codes from WeChat Software' | check 'WeChat international ToS: no reverse engineering of WeChat Software' $TMP/wx_tos.html 'reverse engineer or extract source codes from WeChat Software' |
| check 'Telegram Bot API 8.0 (2024-11-17): photo_url to all Mini Apps' $TMP/tg.html 'photo_url in the class WebAppUser is now available to all Mini Apps' | check 'Telegram Bot API 8.0 (2024-11-17): photo_url to all Mini Apps' $TMP/tg.html 'photo_url in the class WebAppUser is now available to all Mini Apps' |
| check 'Telegram Bot API 8.0 dated November 17, 2024' $TMP/tg.html 'November 17, 2024 Bot API 8\.0' | check 'Telegram Bot API 8.0 dated November 17, 2024' $TMP/tg.html 'November 17, 2024 Bot API 8\.0' |
| | check 'Telegram: photo_url only if privacy settings allow' $TMP/tg.html 'if their privacy settings allow for it' |
| get https://developers.tiktok.com/docs/en/mini-games-overview $TMP/tt_over.html | get https://developers.tiktok.com/docs/en/mini-games-overview $TMP/tt_over.html |
| if [ "$(wc -c < $TMP/tt_over.html)" -lt 5000 ]; then node scripts/pw_fetch_text.mjs https://developers.tiktok.com/docs/en/mini-games-overview $TMP/tt_over.html > /dev/null 2>&1; echo " PW tiktok overview -> $(wc -c < $TMP/tt_over.html) bytes"; fi | if [ "$(wc -c < $TMP/tt_over.html)" -lt 5000 ]; then node scripts/pw_fetch_text.mjs https://developers.tiktok.com/docs/en/mini-games-overview $TMP/tt_over.html > /dev/null 2>&1; echo " PW tiktok overview -> $(wc -c < $TMP/tt_over.html) bytes"; fi |
| get https://arxiv.org/abs/2306.07495 $TMP/sok.html | get https://arxiv.org/abs/2306.07495 $TMP/sok.html |
| check 'SoK super app: arXiv 2306.07495, Yang Wang Zhang Lin' $TMP/sok.html 'Decoding the Super App Enigma' | check 'SoK super app: arXiv 2306.07495, Yang Wang Zhang Lin' $TMP/sok.html 'Decoding the Super App Enigma' |
| check 'SoK super app: no journal-ref on the arXiv record' $TMP/sok.html '^(?!.*Journal reference).*$' | # arXiv's Journal-ref field is author-maintained and usually never filled, so "no venue" is asserted on OpenAlex's |
| | # indexed locations instead: every location must be a repository (arXiv), none a conference or journal. |
| | curl -sL -m 40 "https://api.openalex.org/works/doi:10.48550/arXiv.2306.07495" -o $TMP/sok_oa.json |
| | python3 -c " |
| | import json |
| | d=json.load(open('$TMP/sok_oa.json')) |
| | locs=[((l.get('source') or {}).get('display_name'),(l.get('source') or {}).get('type')) for l in d['locations']] |
| | print(' OpenAlex locations:',locs) |
| | open('$TMP/sok_oa.txt','w').write('nonrepo=%d total=%d' % (sum(1 for n,t in locs if t!='repository'), len(locs)))" |
| | check 'SoK super app: OpenAlex lists only repository locations (no venue)' $TMP/sok_oa.txt 'nonrepo=0 total=[1-9]' |
| | get https://arxiv.org/abs/2608.17538 $TMP/tenet.html |
| | check 'TENET preprint: Telegram Mini App (in)security, plaintext tokens and mnemonics' $TMP/tenet.html 'store authentication materials---such as session tokens and wallet mnemonic phrases---in plaintext' |
| | get https://arxiv.org/abs/2608.13390 $TMP/tgap.html |
| | check 'TeleGapper preprint: privacy policies in Telegram Mini apps' $TMP/tgap.html 'On the \(un\)reliability of Privacy Policies in Telegram Mini apps' |
| | curl -sL -m 40 "https://api.openalex.org/works/doi:10.1145/3460081" -o $TMP/mc_oa.json |
| | python3 -c " |
| | import json;d=json.load(open('$TMP/mc_oa.json'));ii=d.get('abstract_inverted_index') or {} |
| | w=sorted((p,k) for k,v in ii.items() for p in v);open('$TMP/mc_abs.txt','w').write(' '.join(k for p,k in w))" |
| | if [ ! -s $TMP/mc_abs.txt ]; then curl -sL -m 40 "https://api.semanticscholar.org/graph/v1/paper/DOI:10.1145/3460081?fields=abstract" -o $TMP/mc_abs.txt; fi |
| | check 'SIGMETRICS 2021 abstract: measures obfuscation rate' $TMP/mc_abs.txt 'obfuscation rate' |
| get https://arxiv.org/abs/2607.08232 $TMP/oauth.html | get https://arxiv.org/abs/2607.08232 $TMP/oauth.html |
| check 'CCS 2026 OAuth-misuse preprint: accepted by ACM CCS 2026' $TMP/oauth.html 'Accepted by ACM CCS 2026' | check 'CCS 2026 OAuth-misuse preprint: accepted by ACM CCS 2026' $TMP/oauth.html 'Accepted by ACM CCS 2026' |
| |
| <file text external_checks_mini_programs-output.txt> | <file text external_checks_mini_programs-output.txt> |
| run: 2026-09-27T16:12Z | run: 2026-09-27T16:54Z |
| |
| == 1. Unpackers and research artefacts (GitHub API) == | == 1. Unpackers and research artefacts (GitHub API) == |
| > b", "email": "35103616+OSUSecLab@users.noreply.github.com", "date": "2021-06-29T20:03:45Z" }, "committer": { "name": "GitHub", "email": "no | > b", "email": "35103616+OSUSecLab@users.noreply.github.com", "date": "2021-06-29T20:03:45Z" }, "committer": { "name": "GitHub", "email": "no |
| OK MiniCrawler last commit 2021-06-29 | OK MiniCrawler last commit 2021-06-29 |
| GET https://raw.githubusercontent.com/OSUSecLab/MiniCrawler/main/README.md -> 2103 bytes | GET https://raw.githubusercontent.com/OSUSecLab/MiniCrawler/main/README.md -> HTTP 200, 2103 bytes |
| > p metadata. ## How to run it **Crawl Mini-app Metadata** 1. Install Xposed and WeChat 7.0.19 on your phone. 2. Compile and install XposedPlugin, and ena | > p metadata. ## How to run it **Crawl Mini-app Metadata** 1. Install Xposed and WeChat 7.0.19 on your phone. 2. Compile and install XposedPlugin, and ena |
| OK MiniCrawler README pins WeChat 7.0.19 (metadata) | OK MiniCrawler README pins WeChat 7.0.19 (metadata) |
| > a created database file `data.db` **Download Mini-apps** 1. Install Xposed and WeChat 7.0.20 on your phone. 2. Compile and install XposedPlugin, and ena | > a created database file `data.db` **Download Mini-apps** 1. Install Xposed and WeChat 7.0.20 on your phone. 2. Compile and install XposedPlugin, and ena |
| OK MiniCrawler README pins WeChat 7.0.20 (download) | OK MiniCrawler README pins WeChat 7.0.20 (download) |
| GET https://raw.githubusercontent.com/OSUSecLab/TaintMini/main/README.md -> 5048 bytes | GET https://raw.githubusercontent.com/OSUSecLab/TaintMini/main/README.md -> HTTP 200, 5048 bytes |
| GET https://raw.githubusercontent.com/kee1ongz/MiniCAT/main/README.md -> 4777 bytes | GET https://raw.githubusercontent.com/kee1ongz/MiniCAT/main/README.md -> HTTP 200, 4777 bytes |
| GET https://raw.githubusercontent.com/OSUSecLab/APIDiff/main/README.md -> 5306 bytes | GET https://raw.githubusercontent.com/OSUSecLab/APIDiff/main/README.md -> HTTP 200, 5306 bytes |
| > -Program unpacking tool in advance. Please note that we are unable to provide such a tool directly due to potential legal implications. We recommend seeking it out on external websites. ## Usage | > -Program unpacking tool in advance. Please note that we are unable to provide such a tool directly due to potential legal implications. We recommend seeking it out on external websites. ## Usage |
| OK TaintMini README: unpacker not provided due to potential legal implications | OK TaintMini README: unpacker not provided due to potential legal implications |
| > the API document for `apitest-gen`. Please note that we are not able to provide such web crawlers due to potential legal implications. We offer the `typescript` object description for structure | > the API document for `apitest-gen`. Please note that we are not able to provide such web crawlers due to potential legal implications. We offer the `typescript` object description for structure |
| OK APIDiff README: crawlers not provided due to potential legal implications | OK APIDiff README: crawlers not provided due to potential legal implications |
| GET https://minimalware.github.io/ -> 8354 bytes | KillWxapkg last commit 2024-09-20T04:12:44Z 'style: v2.4.1' |
| | > ", "site_admin": false }, "node_id": "RE_kwDOMapcSc4KffDl", "tag_name": "v2.4.1", "target_commitish": "master", "name": "v2.4.1", "draft": f |
| | OK KillWxapkg latest release v2.4.1 |
| | > "name": "Antkites", "email": "mayizhuifengzheng@gmail.com", "date": "2024-09-20T04:12:44Z" }, "committer": { "name": "Antkites", "email": " |
| | OK KillWxapkg last commit 2024-09-20 |
| | > Echo/wemint/blob/master/wxappUnpacker/wuRestoreZ.js" } }, { "name": "wuWxapkg.js", "path": "wxappUnpacker/wuWxapkg.js", "sha": "32212530231cc |
| | OK WeMinT repository bundles wxappUnpacker (wuWxapkg.js present) |
| | GET https://minimalware.github.io/ -> HTTP 200, 8354 bytes |
| > ] Dataset for Miniapps with AppSecret Leakage [CCS23] (This requires additional consent and agreement, contact me for details) Evasive miniapp malware [NDSS25] R | > ] Dataset for Miniapps with AppSecret Leakage [CCS23] (This requires additional consent and agreement, contact me for details) Evasive miniapp malware [NDSS25] R |
| OK MiniSec datasets: AppSecret set requires additional consent and agreement | OK MiniSec datasets: AppSecret set requires additional consent and agreement |
| |
| == 2. WeChat developer documentation == | == 2. WeChat developer documentation == |
| GET https://developers.weixin.qq.com/miniprogram/dev/framework/ability/network.html -> 146563 bytes | GET https://developers.weixin.qq.com/miniprogram/dev/framework/ability/network.html -> HTTP 200, 146563 bytes |
| > API 时,需要注意下列问题,请开发者提前了解。 # 1. 服务器域名配置 每个微信小程序需要事先设置通讯域名,小程序 只可以跟指定的域名进行网络通信 。包括普通 HTTPS 请求( wx.request )、上传文件( wx.uploadFile )、下载文件( wx | > API 时,需要注意下列问题,请开发者提前了解。 # 1. 服务器域名配置 每个微信小程序需要事先设置通讯域名,小程序 只可以跟指定的域名进行网络通信 。包括普通 HTTPS 请求( wx.request )、上传文件( wx.uploadFile )、下载文件( wx |
| OK WeChat network: only whitelisted domains | OK WeChat network: only whitelisted domains |
| > 内的非本机 IP 以及配置过的服务器域名通信。 如使用 微信云托管 作为后端服务,则可无需配置通讯域名(在小程序内通过 callContainer 和 connectContainer 通过微信私有协议向云托管服务发起 HTTPS 调用和 WebSocket 通信)。 # 配置流程 服务器域名请在 「小程序后台-开发-开 | > 内的非本机 IP 以及配置过的服务器域名通信。 如使用 微信云托管 作为后端服务,则可无需配置通讯域名(在小程序内通过 callContainer 和 connectContainer 通过微信私有协议向云托管服务发起 HTTPS 调用和 WebSocket 通信)。 # 配置流程 服务器域名请在 「小程序后台-开发-开 |
| OK WeChat network: cloud hosting via callContainer over the private protocol | OK WeChat network: cloud hosting via callContainer over the private protocol |
| GET https://developers.weixin.qq.com/miniprogram/dev/server/API/user-login/api_code2session.html -> 192004 bytes | GET https://developers.weixin.qq.com/miniprogram/dev/server/API/user-login/api_code2session.html -> HTTP 200, 192004 bytes |
| > 管控原因查询 广告 回传广告数据 广告数据源查询 广告创建数据源 广告数据源报表查询 # 小程序登录凭证校验 调试诊断 接口应在服务器端调用,不可在前端(小程序、网页、APP等)直接调用,具体可参考 接口调用指南 。 接口英文名:code2Session 登录凭证校验。通过 wx.login 接口获得临时 | > 管控原因查询 广告 回传广告数据 广告数据源查询 广告创建数据源 广告数据源报表查询 # 小程序登录凭证校验 调试诊断 接口应在服务器端调用,不可在前端(小程序、网页、APP等)直接调用,具体可参考 接口调用指南 。 接口英文名:code2Session 登录凭证校验。通过 wx.login 接口获得临时 |
| OK code2Session: server-side only | OK code2Session: server-side only |
| > 决方案 -1 system error 系统繁忙,此时请开发者稍候再试 40029 code 无效 js_code无效 40226 code blocked 高风险等级用户,小程序登录拦截 。风险等级详见 用户安全解方案 45011 api minute-quota reach limit | > 决方案 -1 system error 系统繁忙,此时请开发者稍候再试 40029 code 无效 js_code无效 40226 code blocked 高风险等级用户,小程序登录拦截 。风险等级详见 用户安全解方案 45011 api minute-quota reach limit |
| OK code2Session: error 40226 blocks high-risk users | OK code2Session: error 40226 blocks high-risk users |
| GET https://developers.weixin.qq.com/miniprogram/dev/framework/user-privacy/PrivacyAuthorize.html -> 170648 bytes | GET https://developers.weixin.qq.com/miniprogram/dev/framework/user-privacy/PrivacyAuthorize.html -> HTTP 200, 170648 bytes |
| > rivacyCheck__: true 后,会启用隐私相关功能,如果不配置或者配置为 false 则不会启用。 2)在 2023年9月15日之后,不论 app.json 中是否有配置 __usePrivacyCheck__ ,隐私相关功能都会启用。 接口用法可参考 | > rivacyCheck__: true 后,会启用隐私相关功能,如果不配置或者配置为 false 则不会启用。 2)在 2023年9月15日之后,不论 app.json 中是否有配置 __usePrivacyCheck__ ,隐私相关功能都会启用。 接口用法可参考 |
| OK Privacy guideline: 2023-09-15 enforcement announced | OK Privacy guideline: 2023-09-15 enforcement announced |
| > 见: 用户隐私保护指引填写说明 。 需要注意的是,仅有在指引中声明所处理的用户信息,才可以调用平台提供的对应接口或组件。若未声明,对应接口或组件将直接禁用。 隐私接口与对应的处理的信息关系可见: 小程序用户隐私保护指引内容介绍 。 配置完成后,对于每个使用小程序的用户,开发 | > 见: 用户隐私保护指引填写说明 。 需要注意的是,仅有在指引中声明所处理的用户信息,才可以调用平台提供的对应接口或组件。若未声明,对应接口或组件将直接禁用。 隐私接口与对应的处理的信息关系可见: 小程序用户隐私保护指引内容介绍 。 配置完成后,对于每个使用小程序的用户,开发 |
| OK Privacy guideline: undeclared APIs disabled | OK Privacy guideline: undeclared APIs disabled |
| GET https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserProfile.html -> 464408 bytes | GET https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserProfile.html -> HTTP 200, 464408 bytes |
| > p : wx.getUserProfile 返回的加密数据中不包含 openId 和 unionId 字段。 bug :开发者工具中 2.10.4 ~ 2.16.1 基础库版本通过 <button open-type="getUserInfo"> 会返回真实数据,真机上此区间会按照公告返回匿名数据。 < view class = " container " > < view class = " userinfo " | > p : wx.getUserProfile 返回的加密数据中不包含 openId 和 unionId 字段。 bug :开发者工具中 2.10.4 ~ 2.16.1 基础库版本通过 <button open-type="getUserInfo"> 会返回真实数据,真机上此区间会按照公告返回匿名数据。 < view class = " container " > < view class = " userinfo " |
| OK getUserProfile: DevTools 2.10.4-2.16.1 real data, devices anonymous | OK getUserProfile: DevTools 2.10.4-2.16.1 real data, devices anonymous |
| GET https://developers.weixin.qq.com/miniprogram/product/record/record_faq.html -> 67116 bytes | GET https://developers.weixin.qq.com/miniprogram/dev/devtools/remote-debug.html -> HTTP 200, 59902 bytes |
| | > .0 进行调试。 # 调试流程 要发起一个真机远程调试流程,需要先点击开发者工具的工具栏上 "真机调试" 按钮。 此时,工具会将本地代码进行处理打包并上传,就绪之后,使用手机客户端扫描二维码即可弹出调试窗口,开始远程调试。 # 远程调试窗口 使用手机扫描此二维码,即可开始远 |
| | OK DevTools remote debugging packs and uploads the local code |
| | GET https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/wx.setEnableDebug.html -> HTTP 200, 449919 bytes |
| | > Windows 版 :支持 微信 Mac 版 :支持 微信 鸿蒙 OS 版 :支持 # 功能描述 设置是否打开调试开关。此开关对正式版也能生效。 # 参数 # Object object 属性 类型 默认值 必填 说明 enableDebug boolean 是 |
| | OK wx.setEnableDebug: debug switch set by the mini-program, works on release builds |
| | GET https://developers.weixin.qq.com/miniprogram/product/record/record_faq.html -> HTTP 200, 67116 bytes |
| > 【注销主体】。需要注意,注销主体后该主体下的全部备案信息均会被注销,主体下的小程序、APP、网站、快应用等将因未备案导致无法访问或下架,且提交注销申请后无法撤回,建议谨慎操作。 # 2、什么情况下选择【注销小程序】? 当你确认多平台运营的小程序备案不再使 | > 【注销主体】。需要注意,注销主体后该主体下的全部备案信息均会被注销,主体下的小程序、APP、网站、快应用等将因未备案导致无法访问或下架,且提交注销申请后无法撤回,建议谨慎操作。 # 2、什么情况下选择【注销小程序】? 当你确认多平台运营的小程序备案不再使 |
| OK Filing FAQ: unfiled mini-programs become inaccessible or delisted | OK Filing FAQ: unfiled mini-programs become inaccessible or delisted |
| |
| == 3. Regulator and terms == | == 3. Regulator and terms == |
| GET https://www.miit.gov.cn/zwgk/zcwj/wjfb/tz/art/2023/art_920db564162e4312916a01bed6540ad8.html -> 19674 bytes | GET https://www.miit.gov.cn/zwgk/zcwj/wjfb/tz/art/2023/art_920db564162e4312916a01bed6540ad8.html -> HTTP 200, 19674 bytes |
| > 布 > 通知 发文机关: 工业和信息化部 标 题: 工业和信息化部关于开展移动互联网应用程序备案工作的通知 发文字号: 工信部信管〔2023〕105号 成文日期: 2023-07-21 发布日期: 2023-08-04 发布机构: 信息通信管理局 分 类: 信息通信管理 | > 布 > 通知 发文机关: 工业和信息化部 标 题: 工业和信息化部关于开展移动互联网应用程序备案工作的通知 发文字号: 工信部信管〔2023〕105号 成文日期: 2023-07-21 发布日期: 2023-08-04 发布机构: 信息通信管理局 分 类: 信息通信管理 |
| OK MIIT notice 工信部信管〔2023〕105号 | OK MIIT notice 工信部信管〔2023〕105号 |
| > 基础电信企业,公益性互联单位、互联网接入服务提供者、互联网数据中心服务提供者、内容分发网络服务提供者,移动互联网应用程序分发平台(含小程序、快应用等分发)、智能终端生产企业、互联网信息服务提供者: 为落实《中华人民共和国反电信网络诈骗法》《互联网信息服务管理办法》(国务院令 | > 基础电信企业,公益性互联单位、互联网接入服务提供者、互联网数据中心服务提供者、内容分发网络服务提供者,移动互联网应用程序分发平台(含小程序、快应用等分发)、智能终端生产企业、互联网信息服务提供者: 为落实《中华人民共和国反电信网络诈骗法》《互联网信息服务管理办法》(国务院令 |
| OK MIIT notice covers distribution platforms incl. mini-programs | OK MIIT notice covers distribution platforms incl. mini-programs |
| GET https://weixin.qq.com/agreement?lang=zh_CN -> 47391 bytes | GET https://weixin.qq.com/agreement?lang=zh_CN -> HTTP 200, 47391 bytes |
| > 法律允许或腾讯书面许可,你在使用本软件过程中不得从事下列行为: 8.2.1.1 删除本软件及其副本上关于著作权的信息; 8.2.1.2 对本软件进行反向工程、反向汇编、反向编译,或以其他方式尝试发现本软件的源代码; 8.2.1.3 对腾讯拥有知识产权的内容进行使用、出租、出借 | > 法律允许或腾讯书面许可,你在使用本软件过程中不得从事下列行为: 8.2.1.1 删除本软件及其副本上关于著作权的信息; 8.2.1.2 对本软件进行反向工程、反向汇编、反向编译,或以其他方式尝试发现本软件的源代码; 8.2.1.3 对腾讯拥有知识产权的内容进行使用、出租、出借 |
| OK WeChat licence 8.2.1.2: no reverse engineering | OK WeChat licence 8.2.1.2: no reverse engineering |
| > .2.1.3 对腾讯拥有知识产权的内容进行使用、出租、出借、复制、修改、链接、转载、汇编、发表、出版、建立镜像站点等; 8.2.1.4 对本软件或本软件运行过程中释放到任何终端内存中的数据、软件运行过程中客户端与服务器端的交互数据,以及本软件运行所必需的系统数据,进行复制、修改、增加、删除、挂接运行或创作任何衍生作品,形式包括但不限于使用插件、外挂或非经腾讯授权的第三方工具/服务接入本软件和相关系统; 8.2.1.5 通过修改或伪造软件运行中的指令、数据,增加、删减、变动软件的功能或运行效果 | > .2.1.3 对腾讯拥有知识产权的内容进行使用、出租、出借、复制、修改、链接、转载、汇编、发表、出版、建立镜像站点等; 8.2.1.4 对本软件或本软件运行过程中释放到任何终端内存中的数据、软件运行过程中客户端与服务器端的交互数据,以及本软件运行所必需的系统数据,进行复制、修改、增加、删除、挂接运行或创作任何衍生作品,形式包括但不限于使用插件、外挂或非经腾讯授权的第三方工具/服务接入本软件和相关系统; 8.2.1.5 通过修改或伪造软件运行中的指令、数据,增加、删减、变动软件的功能或运行效果 |
| OK WeChat licence 8.2.1.4: no plug-ins or unauthorised third-party tools | OK WeChat licence 8.2.1.4: no plug-ins or unauthorised third-party tools |
| GET https://www.wechat.com/en/service_terms.html -> 183449 bytes | GET https://www.wechat.com/en/service_terms.html -> HTTP 200, 183449 bytes |
| | > 改后的协议。如果你不接受修改后的协议,应当停止使用本软件。 12.2 本协议签订地为中华人民共和国广东省深圳市南山区。 12.3 本协议的成立、生效、履行、解释及纠纷解决,适用中华人民共和国大陆地区法律(不包括冲突法)。 12.4 若你和腾讯之间发生任何纠纷或争议,首先应友好协商解决;协商不成的,你同意将纠纷或争议提交本 |
| | OK WeChat licence 12.3: governed by mainland-Chinese law |
| > der .logo a{display:inline-block} WECHAT – TERMS OF SERVICE Last modified: 2025-11-18 TABLE OF CONTENTS INTRODUCTION ADDITIONAL TERMS AND POLICIE | > der .logo a{display:inline-block} WECHAT – TERMS OF SERVICE Last modified: 2025-11-18 TABLE OF CONTENTS INTRODUCTION ADDITIONAL TERMS AND POLICIE |
| OK WeChat international ToS: last modified 2025-11-18 | OK WeChat international ToS: last modified 2025-11-18 |
| |
| == 4. Other hosts == | == 4. Other hosts == |
| GET https://core.telegram.org/bots/webapps -> 193421 bytes | GET https://core.telegram.org/bots/webapps -> HTTP 200, 193421 bytes |
| > Script to create infinitely flexible interfaces that can be launched right inside Telegram — and can completely replace any website . Like bots, Mini | > Script to create infinitely flexible interfaces that can be launched right inside Telegram — and can completely replace any website . Like bots, Mini |
| OK Telegram Mini Apps: launched right inside Telegram | OK Telegram Mini Apps: launched right inside Telegram |
| > cure local storage on the user's device for sensitive data. November 17, 2024 Bot API 8.0 This is the largest update in the history of Telegram mini | > cure local storage on the user's device for sensitive data. November 17, 2024 Bot API 8.0 This is the largest update in the history of Telegram mini |
| OK Telegram Bot API 8.0 dated November 17, 2024 | OK Telegram Bot API 8.0 dated November 17, 2024 |
| GET https://developers.tiktok.com/docs/en/mini-games-overview -> 190714 bytes | > l Mini Apps, allowing them to access a user's profile photo if their privacy settings allow for it. Third parties (e.g., Mini App builders, external SDKs etc. |
| | OK Telegram: photo_url only if privacy settings allow |
| | GET https://developers.tiktok.com/docs/en/mini-games-overview -> HTTP 200, 190714 bytes |
| > ect search access, and more) to achieve seamless conversion Already launched in markets including the U.S., Japan, Indonesia, Turkey, Saudi Arabia, Thailand, Brazil, Malaysia, Philippines, and Vietnam, with new markets coming soon Leverages TikTok's global mon | > ect search access, and more) to achieve seamless conversion Already launched in markets including the U.S., Japan, Indonesia, Turkey, Saudi Arabia, Thailand, Brazil, Malaysia, Philippines, and Vietnam, with new markets coming soon Leverages TikTok's global mon |
| OK TikTok mini games: launched markets (no EU country listed) | OK TikTok mini games: launched markets (no EU country listed) |
| GET https://developers.tiktok.com/docs/en/mini-games-technical-overview -> 258376 bytes | GET https://developers.tiktok.com/docs/en/mini-games-technical-overview -> HTTP 200, 258376 bytes |
| > it begins from a specific user entry point. The TikTok app selects an available version and obtains its code package. The runtime creates a game instance and executes JavaScrip | > it begins from a specific user entry point. The TikTok app selects an available version and obtains its code package. The runtime creates a game instance and executes JavaScrip |
| OK TikTok mini games: app selects a version and obtains its code package | OK TikTok mini games: app selects a version and obtains its code package |
| |
| == 5. Tencent's own results: no mini-program count == | == 5. Tencent's own results: no mini-program count == |
| GET https://www.prnewswire.com/apac/news-releases/tencent-announces-2026-second-quarter-results-302849608.html -> 332415 bytes | GET https://www.prnewswire.com/apac/news-releases/tencent-announces-2026-second-quarter-results-302849608.html -> HTTP 200, 332415 bytes |
| > Quarter- on-quarter change (in millions, unless specified) Combined MAU of Weixin and WeChat 1,439 1,411 2 % 1,432 0.5 % Mobile device MAU of QQ 520 532 -2 % | > Quarter- on-quarter change (in millions, unless specified) Combined MAU of Weixin and WeChat 1,439 1,411 2 % 1,432 0.5 % Mobile device MAU of QQ 520 532 -2 % |
| OK Tencent Q2 2026: combined Weixin and WeChat MAU 1,439 million | OK Tencent Q2 2026: combined Weixin and WeChat MAU 1,439 million |
| |
| == 6. Venues, preprints and the workshop == | == 6. Venues, preprints and the workshop == |
| GET https://superappsec.github.io/ -> 15133 bytes | GET https://superappsec.github.io/ -> HTTP 200, 15133 bytes |
| > p on Security and Safety of AI-Empowered Mobile Super Apps (SaTS '26) Co-located with ACM CCS 2026 » November 19th, 2026 cfp anchor In response to adapt to po | > p on Security and Safety of AI-Empowered Mobile Super Apps (SaTS '26) Co-located with ACM CCS 2026 » November 19th, 2026 cfp anchor In response to adapt to po |
| OK SaTS 26 co-located with CCS 2026 | OK SaTS 26 co-located with CCS 2026 |
| > of Agentic frameworks and assistants on Mobile (Super) Apps Agentic/LLM-based techniques for security analysis in Mobile (Super) Apps User-centric a | > of Agentic frameworks and assistants on Mobile (Super) Apps Agentic/LLM-based techniques for security analysis in Mobile (Super) Apps User-centric a |
| OK SaTS 26 topics include Agentic/LLM-based techniques | OK SaTS 26 topics include Agentic/LLM-based techniques |
| GET https://arxiv.org/abs/2306.07495 -> 41522 bytes | GET https://arxiv.org/abs/2306.07495 -> HTTP 200, 41522 bytes |
| > ment.documentElement.classList.add('js'); [2306.07495] SoK: Decoding the Super App Enigma: The Security Mechanisms, Threats, and Trade-offs in OS-ali | > ment.documentElement.classList.add('js'); [2306.07495] SoK: Decoding the Super App Enigma: The Security Mechanisms, Threats, and Trade-offs in OS-ali |
| OK SoK super app: arXiv 2306.07495, Yang Wang Zhang Lin | OK SoK super app: arXiv 2306.07495, Yang Wang Zhang Lin |
| > document.documentElement.classList.add('js'); [2306.07495] SoK: Decoding the Super App Enigma: The Security Mechanisms, Threats, and Trade-offs in OS-alike Apps Skip to main content Search Submit Donate Log in Search arXiv Press Enter to search · Advanced search --> Computer Science > Cryptography and Security arXiv:2306.07495 (cs) [Submitted on 13 Jun 2023] Title: SoK: Decoding the Super App Enigma: The Security Mechanisms, Threats, and Trade-offs in OS-alike Apps Authors: Yuqing Yang , Chao Wang , Yue Zhang , Zhiqiang Lin View a PDF of the paper titled SoK: Decoding the Super App Enigma: The Security Mechanisms, Threats, and Trade-offs in OS-alike Apps, by Yuqing Yang and 3 other authors View PDF HTML (experimental) Abstract: The super app paradigm, exemplified by platforms such as WeChat and AliPay, has revolutionized the mobile app landscape by enabling third-party developers to deploy add-ons within these apps. These add-ons, known as miniapps, leverage user data hosted by the super app platforms to provide a wide range of services, such as shopping and gaming. With the rise of miniapps, super apps have transformed into "operating systems", offering encapsulated APIs to miniapp developers as well as in-app miniapp stores for users to explore and download miniapps. In this paper, we provide the first systematic study to consolidate the current state of knowledge in this field from the security perspective: the security measures, threats, and trade-offs of this paradigm. Specifically, we summarize 13 security mechanisms and 10 security threats in super app platforms, followed by a root cause analysis revealing that the security assumptions still may be violated due to issues in underlying systems, implementation of isolation, and vetting. Additionally, we also systematize open problems and trade-offs that need to be addressed by future works to help enhance the security and privacy of this new paradigm. Subjects: Cryptography and Security (cs.CR) Cite as: arXiv:2306.07495 [cs.CR] (or arXiv:2306.07495v1 [cs.CR] for this version) https://doi.org/10.48550/arXiv.2306.07495 Focus to learn more arXiv-issued DOI via DataCite Submission history From: Yuqing Yang [ view email ] [v1] Tue, 13 Jun 2023 02:13:10 UTC (4,564 KB) Full-text links: Access Paper: View a PDF of the paper titled SoK: Decoding the Super App Enigma: The Security Mechanisms, Threats, and Trade-offs in OS-alike Apps, by Yuqing Yang and 3 other authors View PDF HTML (experimental) TeX Source view license Current browse context: cs.CR < prev | next > new | recent | 2023-06 Change to browse by: cs References & Citations NASA ADS Google Scholar Semantic Scholar export BibTeX citation Loading... BibTeX formatted citation × loading... Data provided by: Bookmark Bibliographic Tools Bibliographic and Citation Tools Bibliographic Explorer Toggle Bibliographic Explorer ( What is the Explorer? ) Connected Papers Toggle Connected Papers ( What is Connected Papers? ) Litmaps Toggle Litmaps ( What is Litmaps? ) scite.ai Toggle scite Smart Citations ( What are Smart Citations? ) Code, Data, Media Code, Data and Media Associated with this Article alphaXiv Toggle alphaXiv ( What is alphaXiv? ) Links to Code Toggle CatalyzeX Code Finder for Papers ( What is CatalyzeX? ) DagsHub Toggle DagsHub ( What is DagsHub? ) GotitPub Toggle Gotit.pub ( What is GotitPub? ) Huggingface Toggle Hugging Face ( What is Huggingface? ) ScienceCast Toggle ScienceCast ( What is ScienceCast? ) Demos Demos Replicate Toggle Replicate ( What is Replicate? ) Spaces Toggle Hugging Face Spaces ( What is Spaces? ) Spaces Toggle TXYZ.AI ( What is TXYZ.AI? ) Related Papers Recommenders and Search Tools Link to Influence Flower Influence Flower ( What are Influence Flowers? ) Core recommender toggle CORE Recommender ( What is CORE? ) Author Venue Institution Topic About arXivLabs arXivLabs: experimental projects with community collaborators arXivLabs is a framework that allows collaborators to develop and share new arXiv features directly on our website. Both individuals and organizations that work with arXivLabs have embraced and accepted our values of openness, community, excellence, and user data privacy. arXiv is committed to these values and only works with partners that adhere to them. Have an idea for a project that will add value for arXiv's community? Learn more about arXivLabs . Which authors of this paper are endorsers? | Disable MathJax ( What is MathJax? ) mathjaxToggle(); We gratefully acknowledge support from our major funders , member institutions , , and all contributors. About · Help · Contact · Subscribe · Copyright · Privacy · Accessibility · Operational Status (opens in new tab) Major funding support from | OpenAlex locations: [('arXiv (Cornell University)', 'repository'), ('arXiv (Cornell University)', 'repository')] |
| OK SoK super app: no journal-ref on the arXiv record | > nonrepo=0 total=2 |
| GET https://arxiv.org/abs/2607.08232 -> 43541 bytes | OK SoK super app: OpenAlex lists only repository locations (no venue) |
| | GET https://arxiv.org/abs/2608.17538 -> HTTP 200, 42857 bytes |
| | > s notable security risks. As we demonstrate, many Mini Apps store authentication materials---such as session tokens and wallet mnemonic phrases---in plaintext on client devices, exposing users to unauthorized access, i |
| | OK TENET preprint: Telegram Mini App (in)security, plaintext tokens and mnemonics |
| | GET https://arxiv.org/abs/2608.13390 -> HTTP 200, 43093 bytes |
| | > cumentElement.classList.add('js'); [2608.13390] TeleGapper: On the (un)reliability of Privacy Policies in Telegram Mini apps Skip to main content Search Submit Donate Log in Search arX |
| | OK TeleGapper preprint: privacy policies in Telegram Mini apps |
| | > asure their resource consumption, API usage, library usage, obfuscation rate, app categorization, and app ratings at an aggregated level |
| | OK SIGMETRICS 2021 abstract: measures obfuscation rate |
| | GET https://arxiv.org/abs/2607.08232 -> HTTP 200, 43541 bytes |
| > guidance and enhanced platform-level safeguards. Comments: Accepted by ACM CCS 2026 Subjects: Cryptography and Security (cs.CR) Cite as: arXiv: | > guidance and enhanced platform-level safeguards. Comments: Accepted by ACM CCS 2026 Subjects: Cryptography and Security (cs.CR) Cite as: arXiv: |
| OK CCS 2026 OAuth-misuse preprint: accepted by ACM CCS 2026 | OK CCS 2026 OAuth-misuse preprint: accepted by ACM CCS 2026 |
| howpublished = {arXiv:2607.08232, accepted at ACM CCS 2026}, | howpublished = {arXiv:2607.08232, accepted at ACM CCS 2026}, |
| url = {https://arxiv.org/abs/2607.08232}, | url = {https://arxiv.org/abs/2607.08232}, |
| | } |
| | |
| | @misc{ciccotelli2026_tenet, |
| | author = {Ciccotelli, Andrea and Zappone, Federico and Di Pietro, Roberto}, |
| | title = {{TENET}: Telegram Mini App (in)security}, |
| | year = {2026}, |
| | howpublished = {arXiv:2608.17538}, |
| | url = {https://arxiv.org/abs/2608.17538}, |
| | } |
| | |
| | @misc{ferrari2026_telegapper, |
| | author = {Ferrari, Luca and Ceccato, Mariano and Verderame, Luca}, |
| | title = {{TeleGapper}: On the (un)reliability of Privacy Policies in Telegram Mini apps}, |
| | year = {2026}, |
| | howpublished = {arXiv:2608.13390}, |
| | url = {https://arxiv.org/abs/2608.13390}, |
| } | } |
| </file> | </file> |