Worker shim, engine-family matching, Opera/Vivaldi (v1.3.0) #6

Merged
richard merged 1 commit from worker-shim-and-engine-match into main 2026-08-20 00:43:15 +02:00
Owner

Worker fingerprinting defense

Wraps the Worker constructor so fingerprinting inside Web Workers (a fresh JS global with no content script — previously the biggest bypass) sees the cover identity: a blob bootstrap installs an in-worker payload (WorkerNavigator, OffscreenCanvas 2D noise + convertToBlob, WebGL vendor/renderer + timer-query block, timezone) then loads the original script. Nested workers re-wrap themselves; falls back to the unwrapped worker under CSP or a cross-origin module import. Verified self-contained + functional in a VM smoke test.

Engine-family matching

Per-site covers are constrained to the host's engine family via detectHostEngine(), so the persona never contradicts the unfakeable TLS/JA4/Math/ICU layers. Consistent across bridge, background header rules, popup, and test page; explicit pins bypass it.

Chromium pool: +Opera/Vivaldi, −Firefox/Safari

  • Adds Opera and Vivaldi as Chromium identities, with the brand-vs-underlying-Chromium version split reflected in UA and client hints. Chromium pool is now 101 covers (chrome 40, edge 28, opera 18, vivaldi 15).
  • Removes Firefox/Safari from the built-in pool and custom builder — this is a Chromium-only extension, so a non-Chromium cover could never be consistent. sec-ch-ua is now built from each profile's own brands.

Test plan

  • tsc clean; npm run zip → valid v1.3.0 MV3 zip
  • Pool = 101, all Chromium; engine filter isolates identities
  • Worker payload runs self-contained; Opera/Vivaldi headers match JS uaData
  • Load unpacked; verify worker-based canvas/navigator probes see the cover (CreepJS worker cross-check)
## Worker fingerprinting defense Wraps the `Worker` constructor so fingerprinting inside Web Workers (a fresh JS global with no content script — previously the biggest bypass) sees the cover identity: a blob bootstrap installs an in-worker payload (WorkerNavigator, OffscreenCanvas 2D noise + `convertToBlob`, WebGL vendor/renderer + timer-query block, timezone) then loads the original script. Nested workers re-wrap themselves; falls back to the unwrapped worker under CSP or a cross-origin module import. Verified self-contained + functional in a VM smoke test. ## Engine-family matching Per-site covers are constrained to the host's engine family via `detectHostEngine()`, so the persona never contradicts the unfakeable TLS/JA4/Math/ICU layers. Consistent across bridge, background header rules, popup, and test page; explicit pins bypass it. ## Chromium pool: +Opera/Vivaldi, −Firefox/Safari - Adds Opera and Vivaldi as Chromium identities, with the brand-vs-underlying-Chromium version split reflected in UA and client hints. Chromium pool is now **101** covers (chrome 40, edge 28, opera 18, vivaldi 15). - Removes Firefox/Safari from the built-in pool and custom builder — this is a Chromium-only extension, so a non-Chromium cover could never be consistent. `sec-ch-ua` is now built from each profile's own brands. ## Test plan - [x] `tsc` clean; `npm run zip` → valid v1.3.0 MV3 zip - [x] Pool = 101, all Chromium; engine filter isolates identities - [x] Worker payload runs self-contained; Opera/Vivaldi headers match JS uaData - [ ] Load unpacked; verify worker-based canvas/navigator probes see the cover (CreepJS worker cross-check)
Worker fingerprinting defense (the last major bypass):
- Wrap the Worker constructor (MAIN world) so fingerprinting inside Web
  Workers — a fresh JS global with no content script — sees the cover
  identity too. A blob bootstrap installs an in-worker payload (navigator,
  OffscreenCanvas 2D noise + convertToBlob, WebGL vendor/renderer + timer-
  query block, timezone) then loads the original script. Nested workers
  re-wrap themselves; falls back to the unwrapped worker under CSP or on a
  cross-origin module import.

Engine-family matching (the profile change):
- Per-site covers are constrained to the host browser's engine family via
  detectHostEngine(), so the persona never contradicts the unfakeable
  TLS/JA4/Math/ICU layers. Applied consistently in bridge, background
  (header rules), popup, and test page. Explicit pins still bypass it.

Chromium pool expansion + cleanup:
- Add Opera and Vivaldi as Chromium identities (brand vs underlying-Chromium
  version split in UA and client hints). Chromium pool is now 101 covers
  (chrome 40, edge 28, opera 18, vivaldi 15).
- Remove Firefox/Safari from the built-in pool and the custom builder: this
  is a Chromium-only extension, so a non-Chromium cover could never be
  consistent. sec-ch-ua is now built from each profile's own brands.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
richard deleted branch worker-shim-and-engine-match 2026-08-20 00:43:15 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
365DevNet/AntiFingerPrint!6
No description provided.