Saltar al contenido principal
de/blog/obscura/research/uncontrollable/index/

obscura/research/uncontrollable/index

13 Min. Lesezeit

Eine technische Analyse von Hardware-, Verhaltens- und inhärenten Browser-Signalen, die auf Netzwerkebene nicht gespooft werden können

Obscura Forschung – Juli 2026


Zusammenfassung

Netzwerkebenen-Datenschutztools wie Obscura können HTTP-Header, TLS-Fingerprints, DNS-Abfragen und JavaScript-zugängliche Browser-Eigenschaften effektiv spoofen. Eine bedeutende Klasse von Fingerprinting-Vektoren operiert jedoch unterhalb, oberhalb oder außerhalb der Reichweite des Proxys. Diese Vektoren leiten sich von physikalischen Hardware-Eigenschaften, Browser-Implementierungsdetails, Benutzerverhaltensmustern und der inhärenten Asymmetrie des Erkennungswettrüstens ab.

Dieses Papier katalogisiert diese unkontrollierbaren Vektoren, analysiert ihre Stärken und Schwächen aus Angreiferperspektive und schlägt Abschwächungsstrategien vor – sowohl innerhalb von Obscuras Umfang als auch durch komplementäre Tools.


1. Einleitung

1.1 Die Proxy-Lücke

Obscura operiert auf den OSI-Schichten 3-7 (Netzwerk bis Anwendung). Signale, die ihren Ursprung haben bei:

  • Schicht 0-2 (physische Hardware, GPU, Audio-Chip, CPU)
  • Schicht 7+ (Browser-Rendering-Engine, Benutzerverhalten)
  • Schichtübergreifende Inkonsistenzen (Abweichungen zwischen gespooften und nicht gespooften Signalen)

...liegen außerhalb der direkten Kontrolle des Proxys.

1.2 Klassifikation

Kategorie Vektoren Ursache Proxy-Einfluss
GPU/Hardware Canvas, WebGL, WebGPU-Rendering Physische Rendering-Pipeline Keiner
Audio-Hardware AudioContext, Latenz Audio-DSP, Treiber Keiner
CPU/Plattform Mathe-Präzision, Wasm-Features, SIMD Mikroarchitektur Keiner
Browser-inhärent Feature-Unterstützung, CSS-Media, Bugs, Eigenarten Engine-Implementierung Keiner (nur DNS-Blockierung)
Verhalten Maus, Tastatur, Scroll, Timing Benutzer Keiner
Netzwerk-Residual TCP/IP, Clock Skew, RTT OS/Container-Stack Teilweise
Schichtübergreifend Profil-Inkonsistenz, Erkennungsheuristiken Logik Indirekt

1.3 Das Asymmetrie-Problem

Die grundlegende Asymmetrie: der Fingerprinting-Dienst benötigt nur einen erfolgreichen Vektor, um einen Benutzer zu identifizieren oder zu korrelieren. Der Verteidiger muss alle Vektoren blockieren.

Dieses Papier erhebt nicht den Anspruch, diese Asymmetrie zu lösen. Es dokumentiert das Restrisiko.


2. GPU- & Rendering-Pipeline-Fingerprinting

Vollständiges Dokument: gpu-rendering.md

2.1 Warum es funktioniert

Die GPU-Rendering-Pipeline ist physisch deterministisch – die gleiche Eingabe erzeugt auf der gleichen Hardware immer die gleiche Ausgabe. Unterschiede entstehen durch:

  • GPU-Mikroarchitektur (ALU-Anzahl, Rasterizer-Einheiten, TMUs, ROPs)
  • Treiberversion und Compiler-Optimierungen
  • Gleitkomma-Präzisionsunterschiede in Shadern
  • Anti-Aliasing-Algorithmen
  • Subpixel-Rendering-Reihenfolge (RGB vs. BGR)
  • Farbraumkonvertierungsmatrizen

2.2 Vektoren

Vektor Entropie Erkennbar wenn blockiert
Canvas toDataURL()-Hash ~5-7 Bits Ja
WEBGL_debug_renderer_info.UNMASKED_RENDERER ~20 Bits (genaues GPU-Modell) Ja
WebGL-Szenen-Render-Hash ~10-15 Bits Ja
WebGPU adapterInfo (Anbieter, Architektur, Gerät, Treiber) ~25+ Bits Ja
WebGPU-Limits (50+ numerische Fähigkeiten) ~30+ Bits Ja
WebGL-Erweiterungsliste ~8-12 Bits Ja

2.3 Angreifervorteile

  • Keine Netzwerkabhängigkeit: Rendering ist lokal, keine Anfrage nötig
  • Hardware-gebunden: Kann nicht ohne andere Hardware geändert werden
  • Browserübergreifend: Gleiche GPU erzeugt ähnliche Fingerprints über Chrome/Firefox/Safari hinweg
  • Passiv: Benutzer kann nicht erkennen, dass er gefingerprintet wird

2.4 Schwächen (aus Angreiferperspektive)

  • Blockieren ist für den Benutzer einfach: Firefox-Flags privacy.resistFingerprinting und CanvasBlocker funktionieren
  • Tor Browser besiegt es: Software-Rendering (SwiftShader) normalisiert alle Ausgaben
  • Treiberupdates ändern den Fingerprint: Periodische Instabilität
  • Rausch-Injektion funktioniert: CanvasBlocker's zufällige Pixel-Injektion bricht Wiederholbarkeit
  • Statistische Erkennung von Manipulation ist unvollkommen: Angreifer können nur raten, ob Rauschen injiziert wird

2.5 Vorgeschlagene Abschwächungen

Abschwächung Effektivität Auswirkung Implementierung
WebGL/WebGPU vollständig blockieren Hoch Bricht 3D-Inhalte JS-Injection
Canvas-Rausch-Injektion Mittel-Hoch Erkennbar JS-Injection (CanvasBlocker-Algorithmus)
Konsistentes, zufälliges Rauschen pro Sitzung Mittel Sitzungskorrelation möglich JS-Injection
WEBGL_debug_renderer_info blockieren Mittel Blockiert GPU-Modell-Leck JS-Injection
Software-GPU-Rendering (SwiftShader) Sehr hoch Massive Leistungseinbuße Nur clientseitig (Tor Browser)
Canvas-Abmessungen auf Raster runden Niedrig Reduziert Entropie JS-Injection

Bestes, was Obscura tun kann: Blockieren + Rausch-Injektion per JS. Kann nicht mit Tor Browsers Software-Rendering mithalten.


3. Audio-Hardware-Fingerprinting

Vollständiges Dokument: audio-hardware.md

3.1 Warum es funktioniert

Audioverarbeitung umfasst:

  • Audio-Treiber-Implementierung (ALSA, PulseAudio, PipeWire, CoreAudio, WASAPI)
  • Hardware-DAC/ADC-Charakteristiken
  • Abtastraten-Konvertierungsalgorithmen
  • Dynamikkompressionsverhalten
  • Audio-Puffer-Handling

Diese erzeugen konsistente, messbare Unterschiede in der Oszillatorausgabe und im Kompressorverhalten.

3.2 Vektoren

Vektor Entropie Anmerkungen
AudioContext getChannelData auf DynamicsCompressor-Ausgabe ~8-12 Bits Häufigste
AudioContext-Basislatenz ~4-6 Bits Hardwareabhängig
Abtastratenunterstützung ~2-3 Bits Variiert je nach Hardware
Maximale Kanalanzahl ~1-2 Bits Stereo vs. Surround

3.3 Angreifervorteile

  • Konsistent über Sitzungen hinweg: Gleiche Hardware – gleicher Audio-Fingerprint
  • Schwer zu erkennende Manipulation: Die Website kann mehrere Lesevorgänge vergleichen
  • Funktioniert im Hintergrund: Keine Benutzerinteraktion nötig

3.4 Schwächen

  • DynamicsCompressor-Verhalten ändert sich über Browserversionen
  • Kann vollständig blockiert werden (Firefox resistFingerprinting blockiert AudioContext)
  • Glätten der Ausgabe ist erkennbar, kann aber nicht von echter Hardware mit identischem Verhalten unterschieden werden

3.5 Vorgeschlagene Abschwächungen

Abschwächung Effektivität Auswirkung
AudioContext vollständig blockieren Hoch Bricht audioabhängige Apps
Kompressorausgabe glätten (alle -100dB zurückgeben) Mittel Erkennbares Muster
Periodisches Rauschen in Ausgabepuffer injizieren Mittel-Hoch Komplex, erkennbar
Abtastrate auf festen Wert setzen Niedrig Nur ein Signal

Bestes, was Obscura tun kann: AudioContext per JS-Injection blockieren.


4. CPU- & Plattform-Fingerprinting

Vollständiges Dokument: cpu-platform.md

4.1 Warum es funktioniert

Die CPU ist die grundlegendste Systemkomponente. Ihr Verhalten ist deterministisch und über JavaScript messbar:

  • Gleitkomma-Arithmetik-Präzision (IEEE-754-Konformität variiert geringfügig)
  • performance.now()-Auflösung (abhängig von Hardware-Timer, OS)
  • Wasm-basierte Feature-Erkennung (SIMD, AES-NI, AVX, BMI1/BMI2, POPCNT)
  • Cache-Timing-Seitenkanäle (wenn auch in Browsern abgeschwächt)
  • WebAssembly-Ausführungsgeschwindigkeit (relativer Leistungsbenchmark)

4.2 Vektoren

Vektor Entropie Anmerkungen
Mathe-Fingerprint (FPU-Präzision) ~4-6 Bits Subtil, überraschend identifizierend
Wasm-Feature-Erkennung ~8-12 Bits CPU-Fähigkeiten
performance.now()-Auflösung ~2-3 Bits OS/CPU-abhängig
navigator.hardwareConcurrency ~3-4 Bits Kernanzahl (per JS spoofbar)

4.3 Angreifervorteile

  • Hardware-gebunden: CPU-Features ändern sich nicht
  • Wasm ist schnell: Binäre Feature-Erkennung in <1ms
  • Kann auf Proxy-Ebene nicht gespooft werden: Wasm läuft lokal

4.4 Schwächen

  • performance.now()-Präzision in Browsern reduziert (1ms → 100μs → 5μs → siehe-saw)
  • Wasm-Feature-Erkennung hängt davon ab, ob der Browser sie offenlegt
  • hardwareConcurrency ist per JS spoofbar – bereits als kontrollierbar gelistet
  • Mathe-Fingerprint hat sehr niedrige Entropie – nur in Kombination nützlich

4.5 Vorgeschlagene Abschwächungen

Abschwächung Effektivität Auswirkung
performance.now()-Präzision per JS reduzieren Niedrig Angreifer verwenden Wasm-Timing
Wasm vollständig blockieren Hoch Bricht viele Websites
hardwareConcurrency überschreiben Hoch Trivial per JS-Injection
Mathe-FPU-Fingerprint akzeptieren Keine Zu niedrige Entropie allein

Bestes, was Obscura tun kann: Akzeptieren oder Wasm blockieren (drastisch).


5. Inhärente Browser-Features & Implementierungs-Eigenarten

Vollständiges Dokument: browser-features-quirks.md

5.1 Warum es funktioniert

Jede Browser-Engine (Blink, Gecko, WebKit) hat eine einzigartige Menge von:

  • Unterstützten Web-APIs (100+ binäre Features)
  • CSS-Eigenschaftsunterstützung
  • Implementierungsfehlern und Eigenarten
  • Standardeinstellungen (Schriftgröße, Scrollbalkenbreite, Formularstyling)
  • Unicode-Darstellungsverhalten
  • Emoji-Unterstützungsversion

5.2 Vektoren

Vektor Entropie Anmerkungen
Feature-Unterstützungsvektor (~100 Features) ~10-15 Bits Stark korreliert
CSS-Rendering-Eigenarten ~5-8 Bits Engine-spezifisch
Unicode/Emoji-Darstellung ~3-5 Bits OS+Browser abhängig
Scrollbalkenbreite ~2-3 Bits OS-abhängig
Standardschriftmetriken ~4-6 Bits OS+Browser abhängig

5.3 Angreifervorteile

  • Kann nicht geändert werden: Diese sind dem Browser/OS inhärent
  • Keine Berechtigung nötig: Keine Benutzerzustimmung erforderlich
  • Schwer zu blockieren: Blockieren von Features ändert den Feature-Vektor selbst

5.4 Schwächen

  • Identifiziert hauptsächlich Browser-Familie + Version, nicht einzelne Benutzer
  • Niedrige Entropie innerhalb derselben Browserversion (alle Chrome-120-Benutzer sehen ähnlich aus)
  • Feature-Erkennungsskripte können DNS-blockiert werden, bevor sie laden

5.5 Vorgeschlagene Abschwächungen

Abschwächung Effektivität Auswirkung
DNS-Blockierung von Fingerprinting-Skript-Domains Hoch Stoppt Feature-Aufzählung vollständig
Akzeptieren – niedrige individuelle Entropie Passiv Kann dennoch mit anderen Signalen korrelieren
Browser patchen (nicht auf Proxy-Ebene) Sehr hoch Erfordert eigenen Browser-Build

Bestes, was Obscura tun kann: DNS-Blockierung bekannter Fingerprinting-Domains.


6. Verhaltensbiometrie

Vollständiges Dokument: behavioral-biometrics.md

6.1 Warum es funktioniert

Benutzerverhaltensmuster sind höchst individuell:

  • Mausbewegungsbahnen (Geschwindigkeit, Beschleunigung, Zittern)
  • Tastendynamik (Tastenhaltedauer, Inter-Tasten-Intervalle, Fehlermuster)
  • Scrollmuster (Geschwindigkeit, Beschleunigung, Pausenverhalten)
  • Touch-Gesten (bei Mobilgeräten: Wischwinkel, Druck, Geschwindigkeit)
  • Lesemuster (Scrollen-dann-Pause-Rhythmus)
  • Klick-/Tipp-Timing und Positionspräferenzen

6.2 Vektoren

Vektor Entropie Anmerkungen
Tastendynamik ~15-25 Bits Hochgradig individuell
Mausbewegung ~10-20 Bits Weniger stabil über Zeit
Scrollverhalten ~8-12 Bits Inhaltsabhängig
Touch-Gesten ~12-18 Bits Mobilgeräte-spezifisch

6.3 Angreifervorteile

  • Kontinuierliche Authentifizierung: Keine Momentaufnahme, sondern fortlaufend
  • Schwer zu fälschen: Das Verhalten eines anderen Benutzers nachzuahmen ist extrem schwierig
  • Keine JS-API-Einschränkung: Alles aus JS-Event-Listenern lesbar

6.4 Schwächen

  • Erfordert signifikante Benutzerinteraktion: Kann nicht passiv fingerprinted werden
  • Hohe Varianz: Verhalten ändert sich mit Stimmung, Müdigkeit, Kontext
  • Lange Erfassungszeit: Benötigt Minuten der Interaktion
  • Maschinelles Lernen erforderlich: Einfaches Hashing funktioniert nicht
  • Leicht zu stören: Jedes Skript, das das Timing beeinflusst, bricht es

6.5 Vorgeschlagene Abschwächungen

Abschwächung Effektivität Auswirkung
Maus-/Touch-Event-Listener per JS-Überschreibung blockieren Mittel Bricht interaktive Websites
Synthetisches Timing-Rauschen injizieren Niedrig Kann herausgefiltert werden
Tor Browser für hochsensible Sitzungen verwenden Sehr hoch Praktischste Lösung
Akzeptieren – Verhalten ist kontextabhängig Passiv Funktioniert nur bei eingeloggten Sitzungen

Bestes, was Obscura tun kann: Sehr begrenzt. Tor Browser ist die praktikable Lösung.


7. Residuale Netzwerk-Fingerprints

Vollständiges Dokument: residual-network.md

7.1 Warum es funktioniert

Selbst mit TLS- und HTTP-Spoofing bleiben residuale Netzwerksignale bestehen:

  • TCP/IP-Stack-Parameter (vom Container-OS geerbt)
  • Netzwerk-Umlaufzeit (RTT) und ihre Varianz
  • MTU-Pfadfindung
  • Paket-TTL (verrät ungefähre Hop-Anzahl)
  • Clock Skew zwischen Client und Server
  • HTTP/3-QUIC-Transportparameter (wenn nicht blockiert)

7.2 Vektoren

Vektor Entropie Anmerkungen
TCP-Fenstergröße ~2-4 Bits Container-OS-spezifisch
Initialer TTL ~1-2 Bits 64 vs. 128
RTT + Varianz ~5-8 Bits Netzwerkpfadabhängig
Clock Skew ~4-8 Bits Hardware-Clock-Drift
HTTP/2-SETTINGS (falls nicht gespooft) ~6-10 Bits Proxy-Bibliothek-spezifisch

7.3 Angreifervorteile

  • Immer vorhanden: Netzwerksignale sind unvermeidbar
  • Können kombiniert werden: Kreuzreferenzierung mehrerer schwacher Signale erhöht Entropie
  • Stabil: Netzwerkpfad ändert sich selten

7.4 Schwächen

  • Niedrige individuelle Entropie: TCP/IP allein identifiziert selten
  • Geteilte Container-Umgebung: Mehrere Benutzer hinter demselben Container sehen ähnlich aus
  • TLS-Spoofing eliminiert das identifizierendste Signal

7.5 Vorgeschlagene Abschwächungen

Abschwächung Effektivität Auswirkung
TLS-Fingerprint-Spoofing (JA3/JA4 via utls) Sehr hoch Kritisch für Obscura
HTTP/2-SETTINGS-Spiegelung Hoch Komplexe Implementierung
TCP-Parameter normalisieren Keine Container erbt Host
Über VPN/Tor-Upstream routen Hoch Ändert Netzwerkcharakteristiken

Bestes, was Obscura tun kann: TLS + HTTP/2-Spoofing. TCP/IP wird akzeptiert.


8. Erkennung von Proxy- & Spoofing-Inkonsistenzen

Vollständiges Dokument: proxy-detection.md

8.1 Warum es funktioniert

Der Akt des Spoofings erzeugt erkennbare Muster:

  • Profil-Inkonsistenz: Chrome-User-Agent + Go-TLS-Stack + Win32-Plattform + Nicht-Windows-Schriften
  • Fehlende Signale: Blockierte APIs (WebGL gibt null zurück) erzeugen einen einzigartigen "blockiert"-Fingerprint
  • Timing-Anomalien: MITM fügt messbare Latenz hinzu
  • Zertifikats-Fingerprints: Selbstsignierte CA-Zertifikate sind erkennbar
  • Header-Normalisierung: Zu saubere/konsistente Header (echte Browser haben Variation)
  • JavaScript-Override-Erkennung: Object.getOwnPropertyDescriptor() kann Object.defineProperty-Überschreibungen erkennen

8.2 Erkennungstechniken

Technik Was sie erkennt Zuverlässigkeit
TLS-Fingerprint-Diskrepanz Proxy-Software vs. behaupteter Browser Sehr hoch
Feature-Blockierung Nutzung von Datenschutztools Hoch
JS-Override-Erkennung Injizierte Skripte Mittel
Zertifikatsprüfung MITM-Proxy Hoch
Timing-Analyse Proxy-Latenz Mittel
Signalübergreifende Korrelation Profil-Inkonsistenz Sehr hoch

8.3 Angreifervorteile

  • Spoofing vergrößert die erkennbare Oberfläche: Je mehr du änderst, desto mehr gibt es zu erkennen
  • Statistische Analyse: Vergleich mit großen Datensätzen zeigt Anomalien
  • Maschinelles Lernen: Kann Muster finden, die Menschen übersehen

8.4 Schwächen

  • Erkennung ist probabilistisch, nicht deterministisch
  • Falschpositive: Legitime Browser-Updates sehen aus wie Spoofing
  • Datenschutztools werden von Millionen genutzt: Als "Datenschutzbenutzer" erkannt zu werden, ist nicht einzigartig
  • Katz-und-Maus: Überschreibungserkennung kann durch tiefere Überschreibungen konterkariert werden

8.5 Vorgeschlagene Abschwächungen

Abschwächung Effektivität Auswirkung
Perfekte Profilkonsistenz Sehr hoch Erfordert kontinuierliche Profil-Updates
Einige echte Signale preisgeben Kontraintuitiv Macht Profil natürlicher
Echtes CA-Zertifikat verwenden Mittel Vermeidet Selbstsignierungs-Erkennung
Timing runden statt entfernen Mittel Weniger verdächtig als Null-Latenz
Nicht blockieren, sondern spoofen Hoch Schwerer zu erkennen als Blockieren

Bestes, was Obscura tun kann: Strenge Profilkonsistenzprüfung und kontinuierliche Updates.


9. Das Aggregationsproblem

9.1 Individuelle vs. kombinierte Entropie

Eine entscheidende Erkenntnis: Einzelne unkontrollierbare Vektoren haben niedrige Entropie allein, aber kombiniert werden sie identifizierend.

Htotal=i=1nHiHcorrelationH_{total} = \sum_{i=1}^{n} H_i - H_{correlation}

Wobei HiH_i die individuelle Entropie und HcorrelationH_{correlation} die Abhängigkeiten zwischen Vektoren berücksichtigt.

Für unkontrollierbare Vektoren allein (GPU + Audio + CPU + Features + Netzwerk + Verhalten):

Huncontrollable5+8+4+12+6+1550 bitsH_{uncontrollable} \approx 5 + 8 + 4 + 12 + 6 + 15 \approx 50 \text{ bits}

Dies reicht aus, um einen Benutzer unter ~101510^{15} eindeutig zu identifizieren.

9.2 Auswirkungen

  • Selbst perfektes Proxy-Spoofing kontrollierbarer Vektoren ist unzureichend, wenn die unkontrollierbaren bestehen bleiben
  • DNS-Blockierung ist kritisch: Sie verhindert, dass die Fingerprinting-Bibliothek die unkontrollierbaren Vektoren sieht
  • Verteidigung in der Tiefe: Jeder blockierte Vektor reduziert die aggregierte Entropie

10. Vorgeschlagene Forschungsrichtungen

10.1 Kurzfristig (Obscura v1)

  1. Perfekte Profilkonsistenz: Automatisierte Validierungstools
  2. DNS-Blocklisten-Pflege: Fingerprinting-Domain-Feed
  3. Canvas-Rausch-Injektion: Algorithmus von CanvasBlocker
  4. WebGL/WebGPU-Debug-Info-Blockierung: JS-Injection
  5. AudioContext-Blockierung: JS-Injection

10.2 Mittelfristig

  1. Maschinelles Lernen zur Anomalieerkennung: Erkennen, wenn Obscuras Modifikationen erkennbare Muster erzeugen
  2. Adaptive Profilauswahl: Das Profil wählen, das am besten zur echten Hardware des Benutzers passt (nicht Safari auf Windows behaupten)
  3. Graceful Degradation: Auf weniger aggressives Spoofing zurückfallen, wenn das Erkennungsrisiko hoch ist

10.3 Langfristig / Außerhalb des Bereichs

  1. Browser-Modifikation: Eigener Browser-Build, der Fingerprints normalisiert (Tor-Browser-Ansatz)
  2. Hardware-Level-GPU-Normalisierung: Treiberebenen-Rendering-Interception
  3. Verhaltensverschleierung: KI-generierte Maus-/Tastaturmuster
  4. Quantenresistentes Fingerprinting: Zukunftssicher gegen neue Techniken

11. Fazit

Die hier dokumentierten unkontrollierbaren Vektoren stellen die grundlegende Grenze des Anti-Fingerprintings auf Netzwerkebene dar. Kein Proxy kann sie vollständig eliminieren, da sie herrühren von:

  • Physik: GPU-Rendering, Audioverarbeitung, Clock-Drift
  • Biologie: Benutzerverhaltensmuster
  • Technik: Browser-Implementierungsentscheidungen

Obscuras Ansatz ist pragmatisch:

  1. Kontrollieren, was kontrolliert werden kann (Header, TLS, DNS, JS-APIs) – ~55 % der Oberfläche
  2. Blockieren, was nicht gespooft werden kann (Canvas, Audio, WebGL) – verhindert Beobachtung
  3. Das Restrisiko akzeptieren – dokumentieren und überwachen

Die Alternative – perfekter Schutz – erfordert Tor Browser, der dies erreicht, indem er jedes Signal normalisiert, auf Kosten von Funktionalität, Leistung und Bequemlichkeit. Beide Ansätze haben ihre Berechtigung.


Referenzen

  1. Acar, G. et al. (2014). "The Web Never Forgets: Persistent Tracking Mechanisms in the Wild." CCS 2014.
  2. Mowery, K. & Shacham, H. (2012). "Pixel Perfect: Fingerprinting Canvas in HTML5." WOOT 2012.
  3. Eckersley, P. (2010). "How Unique Is Your Web Browser?" PETS 2010.
  4. Englehardt, S. & Narayanan, A. (2016). "Online Tracking: A 1-million-site Measurement and Analysis." CCS 2016.
  5. Tor Browser Design Document (2024). "The Design and Implementation of the Tor Browser."
  6. FingerprintJS (2026). "Browser Fingerprinting Techniques." fingerprintjs.com.
  7. FoxIO (2024). "JA4: TLS Client Fingerprinting." GitHub.
  8. Laperdrix, P. et al. (2020). "Browser Fingerprinting: A Survey." ACM TOIT.