Ü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
- Ein echtes ClientHello des Zielbrowsers/-betriebssystems erfassen
- Als Vorlage speichern
- Ausgehendes ClientHello so modifizieren, dass es den Vorlagenparametern entspricht
- 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 voncrypto/tlsmit 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