Skip to content

feat(privacy): block Web Audio fingerprinting by default - #236

Closed
seonghobae wants to merge 34 commits into
feat/privacy-presentation-identityfrom
feat/block-web-audio-fingerprinting
Closed

feat(privacy): block Web Audio fingerprinting by default#236
seonghobae wants to merge 34 commits into
feat/privacy-presentation-identityfrom
feat/block-web-audio-fingerprinting

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Superseded by #245 after the original stacked branch diverged from the live predecessor and could no longer be safely restacked without conflicts. The Web Audio privacy delta was replayed non-destructively onto current feat/stealth-profile-coherence as one clean commit, preserving the 18 intended files and requiring fresh exact-head checks. Historical #236 remains evidence for the original TDD/browser work; it is not treated as current-head verification.

Add CanvasNoise classes, canonicalized WebGL renderer tokens, standard Web
Audio normalization, bounded WebRTC interface policy, and a fail-closed
Canvas/WebGL/WebAudio/WebRtc surface-admission contract. Test-first: the
stealth_noise_surface integration tests fail against an empty crate and
pass once the module lands. Production functions, lines, regions, and
branches remain fully covered by the workspace coverage gate.
Add ADR 0111 for the bounded canvas/WebGL/WebAudio/WebRtc enumerated
classes and fail-closed surface admission, and index it as a Proposed
branch-only decision in both the ADR index and the documentation index.
The Python ADR-provenance contract now also guards ADR 0111 placement.
Extend the browser-fingerprinting section with the render/media surface
re-identification basis (Laperdrix et al., 2020) and the bounded-class
over per-session-randomization decision (W3C, 2025), and guard ADR 0111
provenance in the Python documentation contract.
Add the stealth surface slice to the changelog Added section and to the
product-technical-gap-baseline active workstream table as Proposed
ADR 0111 control-plane evidence with no real-browser or anti-evasion
claim.
Add UaBrand, HintsArchitecture, HintsBitness, HintsPlatform, and
UaClientHints contracts bound to the User-Agent Client Hints draft
(WICG, 2026): at-most-32-char ASCII brand names, enumerated
architecture/bitness/platform tokens, required non-empty brand list, and
the spec rule that a non-mobile user agent reports an empty model.
Test-first: ua_client_hints_surface fails on unresolved imports and
passes once the module lands; production functions, lines, regions, and
branches remain 100% covered.
Add ADR 0112 for the bounded UA-CH surface (ASCII brand grammar with a
32-char name bound, enumerated architecture/bitness/platform tokens,
non-empty brand list, empty-model rule for non-mobile user agents) and
index it as Proposed branch-only in both documentation indexes. The
Python ADR-provenance contract now guards ADR 0112 placement.
Add the WICG User-Agent Client Hints Draft Community Group Report (2026)
reference and the legacy-User-Agent fingerprinting rationale to
doctoring, and record the UA-CH slice in the changelog and product gap
baseline.
Add PresentationPlatform::hints_platform as the single source of truth for
the presentation-to-hints platform mapping and require_hints_coherence,
which fails closed when a UaClientHints platform contradicts the presented
presentation platform. This closes the classic cross-surface reidentification
hole where a page reconciles navigator.platform, userAgentData.platform, and
the profile into one identity. Test-first: profile_coherence_surface fails on
unresolved imports and passes once the module lands; production functions,
lines, regions, and branches remain 100% covered.
Add ADR 0113 for the presentation-platform/UA-token/UA-CH-platform triad
agreement and index it as Proposed branch-only in both documentation
indexes. The Python ADR-provenance contract now guards ADR 0113 placement.
Add the platform-coherence slice to doctoring, the changelog, and the
product gap baseline as Proposed ADR 0113 control-plane evidence with no
real-browser claim.
@coderabbitai

coderabbitai Bot commented Aug 27, 2026

Copy link
Copy Markdown

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
  auto_review:
    drafts: true

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@seonghobae

seonghobae commented Aug 28, 2026

Copy link
Copy Markdown
Contributor Author

Exact-head maintenance audit for 5abd124 (base bcda885):\n\n- CodeGraph trace confirms the bounded path from WebAudioFingerprintPolicy through deterministic guard rendering to the checked-in MV3 MAIN-world document_start asset; current source includes all-frame and about:blank/origin-fallback matching.\n- Local evidence on Rust 1.97.1: fingerprint guard tests 7 passed, workspace clippy with -D warnings passed, fmt check passed, git diff --check passed; Python Web Audio contract tests 6 passed.\n- Hosted exact-head checks are successful: Rust contracts, Production coverage, and Pinned Chrome for Testing MV3 fixture.\n- No unresolved non-outdated review threads or formal approvals are present. The PR remains draft, so it is intentionally not marked ready or merged.

@seonghobae
seonghobae changed the base branch from feat/stealth-profile-coherence to feat/privacy-presentation-identity August 29, 2026 11:54
@seonghobae seonghobae closed this Aug 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant