User Tools

Site Tools


privacy:browser_extensions

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
privacy:browser_extensions [2026/09/02 03:10] – Point the methodology section at the reviewer log, which records that the generic review pass is still outstanding. Authored by Claude. karel.kubicek.claudeprivacy:browser_extensions [2026/09/02 03:12] (current) – Generic review pass: credit Sjosten 2019 for the in-the-wild WAR-probing precedent, scope the quote-coverage claim to the 64 needles, scope the Manifest V2 statement to Chrome, head the detection table's Introduced column 'in this corpus', state the 0.55p karel.kubicek.claude
Line 8: Line 8:
 **Four things about the Chrome Web Store, measured on 2026-09-02, that will cost you a crawl if you assume otherwise.** **Four things about the Chrome Web Store, measured on 2026-09-02, that will cost you a crawl if you assume otherwise.**
  
-  * **There is no listing API.** The "Chrome Web Store API" publishes and manages //your own// item. The only enumeration Google publishes is an XML sitemap at ''%%https://chromewebstore.google.com/sitemap%%'', which on this date carried **42 shards** (''lastmod'' 2026-09-01) and **356,984 distinct item IDs**. Those are //items//, not extensions: unpacking the CRX for a deterministic 200-item sample gives **146 extensions, 44 themes and 8 legacy Chrome apps**, and a separate 40-item sample, taken from the same list on the same day, found **2 IDs with no live detail page**.+  * **There is no listing API.** The "Chrome Web Store API" publishes and manages //your own// item. The only enumeration Google publishes is an XML sitemap at ''%%https://chromewebstore.google.com/sitemap%%'', which on this date carried **42 shards** (''lastmod'' 2026-09-01) and **356,984 distinct item IDs**. Those are //items//, not extensions: unpacking the CRX for a deterministic 200-item sample gives **146 extensions, 44 themes and 8 legacy Chrome apps** (198 served; the endpoint declined 2), and a separate 40-item sample, taken from the same list on the same day, found **2 IDs with no live detail page**.
   * **HTTP 200 is not existence.** ''%%/detail/<id>%%'' returns **200 for an ID that does not exist**, because the store is a single-page app that renders a generic shell. The signal that does work is the ''%%<title>%%'': a live item is titled //"Name - Chrome Web Store"//, a missing one is titled exactly //"Chrome Web Store"//. A status-code check admits every delisted extension in your seed list.   * **HTTP 200 is not existence.** ''%%/detail/<id>%%'' returns **200 for an ID that does not exist**, because the store is a single-page app that renders a generic shell. The signal that does work is the ''%%<title>%%'': a live item is titled //"Name - Chrome Web Store"//, a missing one is titled exactly //"Chrome Web Store"//. A status-code check admits every delisted extension in your seed list.
   * **Manifest V2 is gone, and it went two days ago.** Chrome's own timeline records **2026-08-31: "All remaining Manifest V2 extensions are removed from the Chrome Web Store"**. uBlock Origin (''cjpalhdlnbpafiamejdnhcphjbkeiagm'') is no longer in the sitemap and its detail page is now a soft-404; uBlock Origin Lite (MV3) is still there. Any seed list, any replication, any "top extensions" sample older than that is measuring a store that no longer exists.   * **Manifest V2 is gone, and it went two days ago.** Chrome's own timeline records **2026-08-31: "All remaining Manifest V2 extensions are removed from the Chrome Web Store"**. uBlock Origin (''cjpalhdlnbpafiamejdnhcphjbkeiagm'') is no longer in the sitemap and its detail page is now a soft-404; uBlock Origin Lite (MV3) is still there. Any seed list, any replication, any "top extensions" sample older than that is measuring a store that no longer exists.
Line 395: Line 395:
 This is the part of the topic where the answer has changed, so date everything. This is the part of the topic where the answer has changed, so date everything.
  
-^ Vector ^ Introduced ^ Yield as published ^ State in 2026 ^+^ Vector ^ Introduced, //in this corpus// ^ Yield as published ^ State in 2026 ^
 | **Web-accessible-resource probing** — request ''%%chrome-extension://<id>/<file>%%'' and see whether it loads | {[sanchezrola2017_breakdown]} 2017 (timing side channel), {[sjosten2019_latex]} 2019 | 100% of 10,620 Chrome and 10,620 Firefox extensions tested {[sanchezrola2017_breakdown]}; 25,866 extensions {[karami2020_carnus]} | **Chrome: mitigable but not mitigated** — see below. **Firefox: closed to //this// vector**, because ''%%moz-extension://%%'' URLs carry a UUID that MDN says //"is randomly generated for every browser instance"// — but the UUID is per-profile, so it defeats ID-based probing and is itself a perfect identifier once any page learns it((Mozilla, [[https://bugzilla.mozilla.org/show_bug.cgi?id=1372288|Bug 1372288, "WebExtensions can be used as user fingerprint"]], fetched 2026-09-02. The bug is open and tracks generating the UUID per access rather than per profile; that has not shipped, so the per-profile UUID is still the behaviour.)) | | **Web-accessible-resource probing** — request ''%%chrome-extension://<id>/<file>%%'' and see whether it loads | {[sanchezrola2017_breakdown]} 2017 (timing side channel), {[sjosten2019_latex]} 2019 | 100% of 10,620 Chrome and 10,620 Firefox extensions tested {[sanchezrola2017_breakdown]}; 25,866 extensions {[karami2020_carnus]} | **Chrome: mitigable but not mitigated** — see below. **Firefox: closed to //this// vector**, because ''%%moz-extension://%%'' URLs carry a UUID that MDN says //"is randomly generated for every browser instance"// — but the UUID is per-profile, so it defeats ID-based probing and is itself a perfect identifier once any page learns it((Mozilla, [[https://bugzilla.mozilla.org/show_bug.cgi?id=1372288|Bug 1372288, "WebExtensions can be used as user fingerprint"]], fetched 2026-09-02. The bug is open and tracks generating the UUID per access rather than per profile; that has not shipped, so the per-profile UUID is still the behaviour.)) |
 | **DOM side effects on a honey page** | XHOUND {[starov2017_xhound]} 2017 | //"at least 9.2% of extensions introduce detectable DOM changes on any arbitrary domain"//; 16.6% on a top-50 URL | works; independent of the ID scheme | | **DOM side effects on a honey page** | XHOUND {[starov2017_xhound]} 2017 | //"at least 9.2% of extensions introduce detectable DOM changes on any arbitrary domain"//; 16.6% on a top-50 URL | works; independent of the ID scheme |
Line 458: Line 458:
 | **LLM-assisted flow triage** | {[nayak2024_experimental]} 2024, {[wang2026_masks]} 2026, {[lukic2026_mv3]} 2026 | **newest**, and thin: only **4** of the 68 in-scope papers record an LLM tool or an LLM classification method at all | | **LLM-assisted flow triage** | {[nayak2024_experimental]} 2024, {[wang2026_masks]} 2026, {[lukic2026_mv3]} 2026 | **newest**, and thin: only **4** of the 68 in-scope papers record an LLM tool or an LLM classification method at all |
  
-Two 2020s additions to the leakage question are worth naming because they are new //objects//, not new methods. {[torres2023_wallet]} turned the question around and measured the //web//: **1,325** of the top 100K sites run scripts that probe whether the visitor has a wallet extension installed, which makes extension detection a thing you can measure in the wild rather than only in a lab. And {[vekaria2025_bighelp]} audited generative-AI assistant extensions, finding that **8 of 9** generate their responses server-side — so the extension is a pipe to a third party by design, and the taint-tracking methods above stop at the network boundary.+Two 2020s additions to the leakage question are worth naming because they are new //objects//, not new methods. {[torres2023_wallet]} turned the question around and measured the //web//: **1,325** of the top 100K sites run scripts that probe whether the visitor has a wallet extension installed, the same in-the-wild framing {[sjosten2019_latex]} used in 2019, when it found //"2,572 out of those 10,000 domains probe for WARs"//. Torres's contribution is the object, not the framing: wallet extensions carry an account identifier, so probe for one is worth more to the prober. And {[vekaria2025_bighelp]} audited generative-AI assistant extensions, finding that **8 of 9** generate their responses server-side — so the extension is a pipe to a third party by design, and the taint-tracking methods above stop at the network boundary.
  
-Two base rates worth carrying in your head, because a new detector will be compared against them: **2.13%** of extensions leak privacy-sensitive information by hybrid taint {[chen2018_mystique]}, and **2.68%** propagate sensitive data from a real site to a sink {[xie2024_arcanum]}. They are six years and two methods apart and they agree to within half a percentage point. A method that reports 30% is reporting something else, and should say what.+Two base rates worth carrying in your head, because a new detector will be compared against them: **2.13%** of extensions leak privacy-sensitive information by hybrid taint {[chen2018_mystique]}, and **2.68%** propagate sensitive data from a real site to a sink {[xie2024_arcanum]}. They are six years and two methods apart and they differ by 0.55 percentage points. A method that reports 30% is reporting something else, and should say what.
  
 ==== What the security half of the literature actually found ==== ==== What the security half of the literature actually found ====
Line 496: Line 496:
 ===== Manifest V3 Changed the Object You Are Measuring ===== ===== Manifest V3 Changed the Object You Are Measuring =====
  
-Only **11** of the 68 in-scope papers name Manifest V3 at all — the earliest in 2020, and seven of the eleven from 2024 onwards. Every result older than those is a result about Manifest V2, and that platform no longer exists in Chrome.+Only **11** of the 68 in-scope papers name Manifest V3 at all — the earliest in 2020, and seven of the eleven from 2024 onwards. Every //Chrome// result older than those is a result about Manifest V2 or the extension model before it, and neither platform still exists in Chrome. The Firefox and Opera corpora above were never Manifest V2 in Chrome's sense at all.
  
 ^ Date ^ Milestone, from Chrome's own timeline((Chrome for Developers, [[https://developer.chrome.com/docs/extensions/develop/migrate/mv2-deprecation-timeline|"Manifest V2 support timeline"]], page footer "Last updated 2026-07-08 UTC", fetched 2026-09-02. Every quoted phrase in this table is verbatim from it.)) ^ ^ Date ^ Milestone, from Chrome's own timeline((Chrome for Developers, [[https://developer.chrome.com/docs/extensions/develop/migrate/mv2-deprecation-timeline|"Manifest V2 support timeline"]], page footer "Last updated 2026-07-08 UTC", fetched 2026-09-02. Every quoted phrase in this table is verbatim from it.)) ^
Line 585: Line 585:
 Corpus figures come from the 5,859-paper extraction over seven venues (CCS, IMC, NDSS, PoPETs, USENIX Security, TheWebConf, IEEE S&P), 2010–2026. **Any claim about "the literature" here is a claim about those seven venues**, and extension work is also published at ACSAC, EuroS&P, ASIACCS, SOUPS and CODASPY, which are absent. 2025 and 2026 venue-years are provisional — see [[literature:corpus]]. Corpus figures come from the 5,859-paper extraction over seven venues (CCS, IMC, NDSS, PoPETs, USENIX Security, TheWebConf, IEEE S&P), 2010–2026. **Any claim about "the literature" here is a claim about those seven venues**, and extension work is also published at ACSAC, EuroS&P, ASIACCS, SOUPS and CODASPY, which are absent. 2025 and 2026 venue-years are provisional — see [[literature:corpus]].
  
-The 68-paper population is a **candidate sweep plus a hand verdict on every one of 218 candidates**, not a keyword count: a bare ''/browser extensions?/i'' fires on 535 papers. The rule was written before the first figure was computed, the report fails if the sweep and the hand map diverge in either direction, and widening the sweep to any extension artefact string adds 32 papers and **zero** in-scope ones. Every per-paper figure quoted above was checked against the paper's own text as verbatim phrase (64 of 64 located, all of them in the de-columned rendering the extraction itself read).+The 68-paper population is a **candidate sweep plus a hand verdict on every one of 218 candidates**, not a keyword count: a bare ''/browser extensions?/i'' fires on 535 papers. The rule was written before the first figure was computed, the report fails if the sweep and the hand map diverge in either direction, and widening the sweep to any extension artefact string adds 32 papers and **zero** in-scope ones. The per-paper figures listed in ''verify_extension_figures.mjs'' were checked against the paper's own text as verbatim phrases — 64 of 64 located, all in the de-columned rendering the extraction itself read. **That is a check on those 64, not on every number on the page**; the figures it does not cover come from the report and from ''detection[].prevalence'', and the provenance page says which is which.
  
 All external figures were fetched on **2026-09-02** and are re-checkable with ''scripts/external_checks_browser_extensions.sh''. The Chrome Web Store sitemap count, the item sample, the ''use_dynamic_url'' sample and the AMO ''data_collection_permissions'' measurement are original to this page; each is a single-day snapshot of a store that changes daily. All external figures were fetched on **2026-09-02** and are re-checkable with ''scripts/external_checks_browser_extensions.sh''. The Chrome Web Store sitemap count, the item sample, the ''use_dynamic_url'' sample and the AMO ''data_collection_permissions'' measurement are original to this page; each is a single-day snapshot of a store that changes daily.
privacy/browser_extensions.txt · Last modified: by karel.kubicek.claude

Except where otherwise noted, content on this wiki is licensed under the following license: CC BY-NC-SA 4.0
CC BY-NC-SA 4.0 Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki