Skip to content

Latest commit

 

History

History
102 lines (81 loc) · 4.99 KB

File metadata and controls

102 lines (81 loc) · 4.99 KB

SYNTEX Privacy Shield — Roadmap

v6 shipped (2026-04-21). See CHANGELOG.md.

125,039 compiled dNR rules from EasyList, EasyPrivacy, and uBlock's filters. Fingerprint noise (canvas / audio / WebGL / battery / motion) via content script. Link-bouncer stripping (Google, FB, IG, LinkedIn, YT, DDG, Reddit). sendBeacon / keepalive-fetch suppression. Referrer hard scrub on cross-origin requests. Popup shows real per-list rule counts and per-tab blocked counts. License bumped to GPL-3.0 to match filter-list licenses.

Where this extension was at v5

  • Blocklist: ~160 curated domains (data brokers, stalkerware, corporate spyware) + Disconnect.me tracker protection list (the same list Firefox Enhanced Tracking Protection uses). Fetched on install and refreshed every 24h, cached in browser.storage.local.
  • Blocking: webRequest.onBeforeRequest with <all_urls> filter, hostname → category lookup in a JS Map. Categorized stats in the popup.
  • Header obfuscation: two modes.
    • Blend in (normalize): fixed Accept-Language/Encoding matching Firefox defaults, Chromium Client Hints stripped, header order preserved. This is the Tor Browser / Firefox RFP philosophy — be indistinguishable from other anti-fingerprinting users.
    • Moving target (randomize): per-request variance across a small pool + header order shuffle. Defeats cross-request correlation on a single session but makes you detectable as "someone randomizing headers."
  • Tracking param stripping: ~45 common params (utm_*, fbclid, gclid, msclkid, mc_cid, etc.) stripped via redirectUrl. Host-scoped for ambiguous params (s, t only on twitter.com/x.com).
  • Fail-closed strict mode: if header obfuscation throws, the request is cancelled rather than leaking the un-obfuscated headers. Popup has a "turn this off if sites break" escape hatch — but default is on because a privacy tool that silently fails open is not a privacy tool.

Architecture notes

Firefox MV3 keeps webRequestBlocking. Chrome MV3 doesn't. This extension takes advantage of that: real redirect + cancel decisions per-request, rather than static declarativeNetRequest rules. The end-goal is a dNR path that works on Chromium-derived browsers too — see below.

Python lists in syntex_firewall/firewall/blocklist_updater.py are the source of truth. background/blocklist.js mirrors them. If you change one, change the other. The VPN-side and browser-side lists should stay locked together.

What's next

Phase A — declarativeNetRequest migration (cross-browser)

Move the static blocklist from JS Map lookups to dNR rules. This enables a Chromium build (Brave, Vivaldi, Chrome) without changing the manifest-3 permissions model. The curated list (66 + 61 + 33 = 160 domains) generates cleanly as dNR rules; the Disconnect.me fetched list gets emitted at install time via dNR.updateDynamicRules.

Keep webRequest only for header obfuscation and param stripping — the two things dNR can't do well today. dNR.modifyHeaders can remove headers but can't conditionally transform them, and its URL transform rules can strip query params but not under the same fail-closed semantics.

Phase B — Fingerprinting script heuristics

Disconnect.me's FingerprintingInvasive category is already included, but client-side fingerprinting (canvas, audio context, WebGL, font enumeration) isn't addressed by network blocking. The answer is probably a content-script Shield that hooks those APIs. Not in scope for v5.

Phase C — Per-site control

Right now protection is global. Per-site toggle (for sites that break) needs a storage schema change and popup UI for the current tab. Worth doing after dNR migration because dNR has a clean per-tab exception mechanism.

Phase D — Transparency

A "what did this extension do to the page you're on?" view. The engine already tracks per-category stats — surfacing per-tab stats is a straightforward extension of that.

What this tool does NOT do (and why)

  • We don't block CNAME-cloaked trackers. Firefox strips third-party cookies by default in Strict mode, which closes the biggest motivation for CNAME cloaking in the first place. Going further means DNS-level blocking, which is what syntex_firewall does on the VPN.
  • We don't do canvas/audio/WebGL spoofing. That belongs in a content script, and doing it poorly is worse than not doing it. Firefox RFP already does this well if you turn it on (privacy.resistFingerprinting).
  • We don't fight user-agent fingerprinting on Firefox. The Firefox UA is already the safest UA to send; changing it makes you stand out more, not less. This is the same reason Tor Browser doesn't randomize UAs.

Relationship to other SYNTEX components

  • syntex_firewall/firewall/ — VPN-side DNS + firewall using the same domain lists. Extension is the browser-side lens on the same data.
  • ART / Nemesis — unrelated. This is not a learning system, it's a static filter + live obfuscator. Simpler is the right answer here.