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

obscura/research/tls-fingerprinting

2 min de lecture

Aperçu

L'empreinte TLS identifie les clients par les paramètres qu'ils envoient lors de la poignée de main TLS (message ClientHello). Différents navigateurs et systèmes d'exploitation utilisent différentes configurations TLS.

Empreinte JA3

JA3 est un hachage calculé à partir du ClientHello TLS :

JA3 = MD5(Chiffrements + Extensions + CourbesElliptiques + FormatsDePointsCourbesElliptiques)

Où chaque champ est concaténé :

chiffrements : 49199,49196,52393,...  (liste des IDs de suites de chiffrement)
extensions : 0,23,65281,...           (liste des IDs de types d'extension)
courbes : 29,23,24,...                (liste des groupes supportés)
formats : 0                            (formats de points EC)

Exemples de Hachages JA3

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

Empreinte JA4 (Nouvelle Génération)

JA4 étend JA3 en analysant également :

  • Version TLS
  • Présence SNI
  • Protocoles ALPN
  • Paramètres HTTP/2

Format : tls_version.ciphers.extensions.sni.alpn

Empreinte HTTP/2

Les connexions HTTP/2 révèlent des empreintes supplémentaires via :

  • Paramètres de trame SETTINGS (MAX_CONCURRENT_STREAMS, INITIAL_WINDOW_SIZE, etc.)
  • Synchronisation WINDOW_UPDATE
  • Comportement des trames PING
  • Structure des trames PRIORITY

Usurpation d'Empreinte TLS

Des outils comme TLSMask et utls peuvent modifier le ClientHello pour imiter un autre navigateur :

ClientHello Réel  [Usurpateur TLS]  ClientHello Imité  Serveur

Approche

  1. Capturer un vrai ClientHello du navigateur/OS cible
  2. Stocker comme modèle
  3. Modifier le ClientHello sortant pour correspondre aux paramètres du modèle
  4. Transmettre à la destination

Implications pour Obscura :

  • L'usurpation TLS peut être faite au niveau proxy, contrairement à Canvas/WebGL/audio
  • Go a la bibliothèque utls (fork de crypto/tls avec personnalisation ClientHello)
  • Rust a tls-parser + implémentation TLS personnalisée
  • Le proxy doit de toute façon terminer TLS pour le MITM, donc l'empreinte TLS vue par le serveur sera celle de l'implémentation TLS Go/Rust du proxy sauf si elle est délibérément usurpée

Conclusions

  • L'empreinte TLS (JA3/JA4) est traitable au niveau proxy
  • La bibliothèque Go utls fournit une manipulation directe du ClientHello
  • Doit être une fonctionnalité centrale d'Obscura
  • Sans usurpation TLS, la propre bibliothèque TLS du proxy révélerait qu'un proxy est utilisé