Saltar al contenido principal
de/blog/obscura/research/tls-fingerprinting/

obscura/research/tls-fingerprinting

2 Min. Lesezeit

Übersicht

TLS-Fingerprinting identifiziert Clients anhand der Parameter, die sie während des TLS-Handshakes (ClientHello-Nachricht) senden. Verschiedene Browser und Betriebssysteme verwenden unterschiedliche TLS-Konfigurationen.

JA3-Fingerprint

JA3 ist ein Hash, der aus dem TLS-ClientHello berechnet wird:

JA3 = MD5(Ciphers + Extensions + EllipticCurves + EllipticCurvePointFormats)

Wobei jedes Feld konkateniert wird:

ciphers: 49199,49196,52393,...  (Liste der Cipher-Suite-IDs)
extensions: 0,23,65281,...       (Liste der Erweiterungstyp-IDs)
curves: 29,23,24,...             (Liste der unterstützten Gruppen)
formats: 0                       (EC-Punktformate)

Beispiel-JA3-Hashes

Browser JA3
Chrome 120 (Windows 11) 6734f37431670b3ab4292b8f60f29984
Firefox 121 (Windows 11) d1b8d7e1c7c8b0a6b1a2c3d4e5f6a7b8
Safari 17 (macOS 14) 9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d
Chrome 120 (Android 14) b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6

JA4-Fingerprint (Nächste Generation)

JA4 erweitert JA3 durch zusätzliche Analyse von:

  • TLS-Version
  • SNI-Präsenz
  • ALPN-Protokolle
  • HTTP/2-Einstellungen

Format: tls_version.ciphers.extensions.sni.alpn

HTTP/2-Fingerprinting

HTTP/2-Verbindungen geben zusätzliche Fingerprints preis über:

  • SETTINGS-Frame-Parameter (MAX_CONCURRENT_STREAMS, INITIAL_WINDOW_SIZE, etc.)
  • WINDOW_UPDATE-Timing
  • PING-Frame-Verhalten
  • Priority-Frame-Struktur

TLS-Fingerprint-Spoofing

Tools wie TLSMask und utls können das ClientHello modifizieren, um einen anderen Browser nachzuahmen:

Echtes ClientHello  [TLS-Spoofer]  Nachgeahmtes ClientHello  Server

Ansatz

  1. Ein echtes ClientHello des Zielbrowsers/-betriebssystems erfassen
  2. Als Vorlage speichern
  3. Ausgehendes ClientHello so modifizieren, dass es den Vorlagenparametern entspricht
  4. An das Ziel weiterleiten

Auswirkungen auf Obscura:

  • TLS-Spoofing kann auf Proxy-Ebene durchgeführt werden, anders als Canvas/WebGL/Audio
  • Go hat die utls-Bibliothek (Fork von crypto/tls mit ClientHello-Anpassung)
  • Rust hat tls-parser + eigene TLS-Implementierung
  • Der Proxy muss TLS ohnehin für MITM terminieren, sodass der vom Server gesehene TLS-Fingerprint die Go-/Rust-TLS-Implementierung des Proxys wäre, wenn nicht bewusst gespooft wird

Schlussfolgerungen

  • TLS-Fingerprinting (JA3/JA4) ist auf Proxy-Ebene handhabbar
  • Go's utls-Bibliothek ermöglicht direkte ClientHello-Manipulation
  • Muss ein Kernfeature von Obscura sein
  • Ohne TLS-Spoofing würde die eigene TLS-Bibliothek des Proxys verraten, dass ein Proxy verwendet wird