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

obscura/research/tls-fingerprinting

2 min di lettura

Panoramica

Il fingerprinting TLS identifica i client in base ai parametri che inviano durante l'handshake TLS (messaggio ClientHello). Browser e sistemi operativi diversi utilizzano configurazioni TLS diverse.

Fingerprint JA3

JA3 è un hash calcolato dal ClientHello TLS:

JA3 = MD5(Cifratura + Estensioni + CurveEllittiche + FormatiPuntoCurveEllittiche)

Dove ogni campo è concatenato:

cifratura: 49199,49196,52393,...  (elenco ID suite di cifratura)
estensioni: 0,23,65281,...        (elenco ID tipi di estensione)
curve: 29,23,24,...               (elenco gruppi supportati)
formati: 0                        (formati punto EC)

Esempi di Hash JA3

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

Fingerprint JA4 (Nuova Generazione)

JA4 estende JA3 analizzando anche:

  • Versione TLS
  • Presenza SNI
  • Protocolli ALPN
  • Impostazioni HTTP/2

Formato: tls_version.cifratura.estensioni.sni.alpn

Fingerprinting HTTP/2

Le connessioni HTTP/2 rivelano fingerprint aggiuntivi tramite:

  • Parametri frame SETTINGS (MAX_CONCURRENT_STREAMS, INITIAL_WINDOW_SIZE, ecc.)
  • Temporizzazione WINDOW_UPDATE
  • Comportamento frame PING
  • Struttura frame Priority

Spoofing del Fingerprint TLS

Strumenti come TLSMask e utls possono modificare il ClientHello per imitare un altro browser:

ClientHello Reale  [Spoofer TLS]  ClientHello Imitato  Server

Approccio

  1. Cattura un ClientHello reale dal browser/SO target
  2. Salva come modello
  3. Modifica il ClientHello in uscita per corrispondere ai parametri del modello
  4. Inoltra alla destinazione

Implicazioni per Obscura:

  • Lo spoofing TLS può essere fatto a livello di proxy, a differenza di Canvas/WebGL/audio
  • Go ha la libreria utls (fork di crypto/tls con personalizzazione ClientHello)
  • Rust ha tls-parser + implementazione TLS personalizzata
  • Il proxy deve comunque terminare TLS per il MITM, quindi il fingerprint TLS visto dal server sarà l'implementazione TLS Go/Rust del proxy a meno che non venga consapevolmente falsificato

Conclusioni

  • Il fingerprinting TLS (JA3/JA4) è affrontabile a livello di proxy
  • La libreria utls di Go fornisce la manipolazione diretta del ClientHello
  • Deve essere una funzionalità principale di Obscura
  • Senza spoofing TLS, la libreria TLS del proxy rivelerebbe che un proxy è in uso