Parlons d'empreintes | Source : Everett Collection/Shutterstock
Si vous avez déjà eu à analyser des logs AWS WAF, vous avez peut-être remarqué les champs ja3fingerprint et (plus récemment) ja4fingerprint. Si vous vous demandez de quoi il s'agit, bienvenue ! Et si vous ne les aviez jamais croisés mais que la curiosité vous gagne… bienvenue aussi !
Dans cet article, nous verrons ce que sont ces empreintes, en quoi elles peuvent être utiles quel que soit le service cloud que vous utilisez, et comment les détecter, les analyser et les exploiter dans AWS, Google Cloud et Azure. Nous proposerons également quelques exemples de requêtes pour les logs AWS WAF.
Au juste, qu'est-ce qu'une empreinte JA3 ou JA4 ?
Les empreintes JA3 et JA4 (prononcées jah-trois et jah-quatre) sont des identifiants client calculés par des services tels qu'AWS WAF. Elles s'avèrent très utiles pour identifier des types de trafic, en particulier afin d'atténuer des attaques potentielles ou en cours.
Un peu d'histoire
Contrairement à ce que l'on pourrait croire, JA3 et JA4 n'ont pas été précédés de JA1 ni de JA2. Le nom JA3 provient des initiales des trois développeurs J.A. de l'outil :
- John Althouse
- Josh Atkins
- Jeff Atkinson
(Source : une excellente présentation de John Althouse et Jeff Atkinson eux-mêmes : Profiling And Detecting All Things SSL With JA3)
Leurs travaux s'appuient sur les recherches d'analyse des suites de chiffrement TLS menées par Ivan Ristić ainsi que par Lee Brotherston.
JA3 a été créé chez Salesforce, et JA4 en est le successeur direct, mis au point par FoxIO — une société cofondée par John Althouse et un quatrième(!) J.A., Josh Alexander.
Les deux empreintes sont open-source, mais FoxIO commercialise également une suite plus large d'empreintes baptisée JA4+, soumise à des conditions de licence distinctes. AWS ne prend actuellement en charge aucune fonctionnalité JA4+, mais de nombreux autres outils réseau et de sécurité le font.
Une explication courte (et simplifiée)
En une phrase : les empreintes JA3 et JA4 permettent d'identifier les clients (toute entité accédant à un service) à partir d'informations contenues dans le paquet Client Hello du handshake TLS initial envoyé à ces services, indépendamment de l'adresse IP, des ports, de la géolocalisation et des autres variables habituelles.

Schéma simplifié du handshake TLS 1.2 | Source : Wikimedia Commons
Calcul des empreintes JA3 et JA4
Les empreintes JA3 sont calculées (comme l'explique le dépôt open-source officiel) à partir des champs suivants du paquet Client Hello :
- Version TLS
- Suites de chiffrement acceptées
- Liste des extensions
- Courbes elliptiques
- Formats des points de courbe elliptique
Ces champs sont énumérés, ordonnés en une seule chaîne, puis cette chaîne est hachée en MD5 pour obtenir une chaîne plus courte.

Voici une capture Wireshark d'un handshake TLS 1.3 effectué depuis ma machine. Tiens, on y voit l'empreinte JA3 !
Les empreintes client JA4 exploitent les éléments suivants du Client Hello, comme détaillé dans le dépôt JA4 :
- Protocole (TCP ou QUIC)
- Version TLS
- Le SNI est-il utilisé ? (oui = d pour domaine, non = i pour IP)
- Suites de chiffrement (combien et lesquelles)
- Extensions (combien et lesquelles)
- Valeur de l'extension ALPN (Application-Layer Protocol Negotiation ; codes courts pour HTTP/2, HTTP/3, POP3, DNS-over-TLS, SPDY/3, et bien d'autres)
Une illustration claire détaillant le calcul de chaque partie d'une empreinte JA4 | Source : dépôt JA4 de FoxIO ; sous licence BSD-3-Clause.
Ces éléments ne sont pas hachés en MD5 ; certaines parties de la signature sont déjà hachées et tronquées, si bien que la signature ne fait que 36 caractères.
Une démo rapide
Le site https://ja4db.com affiche votre empreinte JA4 actuelle — essayez !
Pourquoi utiliser les empreintes JA3/JA4 ?
Cas d'usage 1 : limitation de débit
Traditionnellement, les règles de limitation de débit appliquées sur les WAF ou autres couches de protection reposent sur l'adresse IP, le chemin URI ou d'autres éléments des requêtes du client.
Limiter le débit en fonction de l'empreinte spécifique du client offre les avantages suivants :
- Éviter les faux positifs liés aux limitations basées sur l'IP ou à d'autres critères courants
- Limiter les attaquants partageant la même empreinte ou le même outil, indépendamment de leur adresse IP
Google Cloud Armor et AWS WAF prennent tous deux en charge cette fonctionnalité.

AWS permet d'utiliser les empreintes JA3 ou JA4 comme clés d'agrégation pour une règle de limitation de débit
Cas d'usage 2 : mise sur liste de blocage
Si vous connaissez déjà une ou plusieurs empreintes malveillantes, il suffit de les ajouter à une liste de blocage. Google Cloud Armor et AWS WAF prennent là encore tous deux en charge cette fonctionnalité.
Cas d'usage 3 : threat hunting
Le threat hunting est une pratique défensive qui consiste à détecter de manière proactive les menaces dans votre environnement. Par exemple, si vous apprenez que de nouvelles adresses IP de serveurs C2 ont été identifiées dans la nature, vous pouvez parcourir vos logs réseau à la recherche de communications avec ces IP.
De la même manière, si vous êtes en mesure de détecter des empreintes JA3/4 dans votre environnement réseau, vous pouvez consulter les logs réseau pour repérer celles de clients malveillants nouvellement identifiés. Ces empreintes sont simplement un outil de plus dans votre boîte à outils.
Empreintes ou adresses IP ?
Comme les empreintes JA3 et JA4 traquent des détails propres aux clients, elles s'avèrent dans certains cas bien plus utiles pour la défense que le suivi ou le blocage d'adresses IP :
- Un attaquant utilisant un script d'attaque sur mesure aura probablement une empreinte unique, dépendant des bibliothèques, du système d'exploitation, etc.
- Le trafic d'un malware présent sur plusieurs ordinateurs portables d'entreprise compromis présentera vraisemblablement la même empreinte, ou du moins un très petit ensemble d'empreintes.
- Les empreintes d'outils malveillants connus peuvent être partagées et bloquées automatiquement avant même que ce trafic ne soit détecté sur le réseau.
JA3 ou JA4 ?
Mieux vaut privilégier les empreintes JA4, mais les empreintes JA3 restent utiles si vous savez ce que vous cherchez. Voici quelques différences clés :
- Les empreintes JA4 reposent sur davantage d'informations que les empreintes JA3.
- JA3 a été créé et soutenu par Salesforce, mais n'est plus activement maintenu.
- Comme partout en cybersécurité, les recherches et méthodes d'évasion évoluent. JA3 existe depuis plus longtemps et compte davantage de méthodes connues pour contourner la détection.
- Certains clients (dont Chrome et Firefox) prennent désormais en charge l'option de mélanger des parties de leur paquet Client Hello. Cela modifie l'empreinte JA3, mais la méthode JA4 utilise un tri pour garder les empreintes cohérentes.
- Les deux types d'empreintes disposent de bases de données gérées par la communauté. La plus grande base JA3 publique que j'ai pu trouver compte un peu plus de 128 000 entrées d'après mon décompte. J'ai également recensé environ 105 000 entrées dans la base JA4+ au moment de la rédaction de cet article.
- JA3 a un héritage plus long, mais la prise en charge de JA4 est active et progresse vite. Pendant la rédaction de cet article, par exemple, AWS a annoncé que son service Network Firewall prend désormais en charge le filtrage JA4 !
Autres points d'attention
Faux positifs. Appliquer des règles de limitation de débit agressives basées sur la valeur de l'empreinte peut générer beaucoup de faux positifs, en particulier lorsque vous avez de nombreux clients similaires. Recourir à des données client supplémentaires, comme l'ordre des en-têtes détaillé dans cet article du blog AWS, peut aider à réduire les blocages d'utilisateurs légitimes.
Les bases de données s'enrichissent encore. Les bases JA3 et JA4 publiques sont maintenues par la communauté ; s'y fier exclusivement n'est donc pas idéal si vous avez besoin d'une détection des menaces de pointe. Les fournisseurs cloud et les services de sécurité managés tiennent probablement des bases privées d'empreintes malveillantes ; il peut donc être judicieux d'envisager des règles managées comme le groupe de règles Bot Control d'AWS.
L'ingéniosité des attaquants varie. Chez DoiT, nous avons aidé des clients à analyser des attaques qui paraissaient très simples — une empreinte unique sur plusieurs IP, signe d'un outil DoS basique — comme des attaques qu'il était impossible de rattacher à une empreinte JA3/4 cohérente. Les capacités, les ressources et la patience d'un attaquant varient.
Et Azure dans tout ça ? Azure mérite aussi sa place dans cette discussion ! Les outils d'Azure ne prennent pas en charge les fonctionnalités JA3 et JA4 personnalisées de la même manière directe qu'AWS et Google Cloud (pour l'instant), mais quelques-uns de ses outils de sécurité intègrent des capacités de fingerprinting :
- Le système de détection et de prévention d'intrusion (IDPS) d'Azure Firewall indique qu'il utilise le fingerprinting JA3 dans ses règles de signatures. Azure y consacre un bel article de blog.
- L'outil SIEM d'Azure, Sentinel, inclut des détails JA3 et JA3S (fingerprinting serveur) dans les données d'objets de menace (via STIX). Plus de précisions dans leur documentation.
Comment exploiter cela dans AWS ?
La journalisation et les règles fondées sur les empreintes JA3 et JA4 sont bien prises en charge dans AWS, et c'est sur les fonctionnalités AWS que va porter la section qui suit.
Journalisation des requêtes
La première étape consiste à pouvoir journaliser les empreintes JA3 et JA4 ! Les types de ressources AWS suivants prennent en charge les champs d'empreinte JA3 et JA4 dans leurs logs :
- Logs WAF (uniquement pour les logs liés aux ressources CloudFront et Application Load Balancer)
- Logs Network Firewall (uniquement dans certains cas — AWS fournit un exemple ici)

Exemple de logs AWS WAF affichant mes valeurs d'empreintes JA3 et JA4. Ne me bloquez pas !
Blocage et limitation de débit selon les valeurs d'empreintes
J'ai abordé cette fonctionnalité plus haut ; voici une liste pratique de la documentation citée :
- Blocage dans AWS WAF
- Limitation de débit dans AWS WAF
- Blocage dans Google Cloud Armor
- Limitation de débit dans Google Cloud Armor
Analyse des logs
Voici quelques requêtes CloudWatch Log Insights que j'ai utilisées par le passé pour étudier les empreintes JA3 et JA4 dans le trafic WAF.
Décompte des principales empreintes JA3
fields ja3Fingerprint
| stats count(*) as requestCount by ja3Fingerprint
| sort requestCount desc

1 097 ? Ça commence à faire beaucoup, non ?
Décompte des principales empreintes JA4, ventilé par chemin d'URL et user agent
parse @message /\{\"name\":\"[Uu]ser\-[Aa]gent\",\"value\"\:\"(?<useragent>[^"\}]*)/
| stats count(*) as requestCount by ja4Fingerprint, httpRequest.uri, useragent
| sort requestCount desc

Plus on ajoute d'informations, plus il devient facile de comprendre ce qui se passe !
Empreintes des requêtes bloquées par des règles de débit
Notez que cela porte sur l'ensemble des règles fondées sur le débit. C'est utile si vous avez mis en place des règles de débit basées sur l'IP et que vous souhaitez repérer d'éventuelles empreintes communes.
fields @timestamp, httpRequest.clientIp as ClientIP, terminatingRuleId as rule, httpRequest.country as Country, ja4Fingerprint
| filter action = "BLOCK"
| filter terminatingRuleType = "RATE_BASED"
| stats count(*) as count by ja4Fingerprint, ClientIP, rule, Country | sort by count desc

Plusieurs clients peuvent partager la même IP tout en ayant des empreintes différentes
AWS propose d'autres exemples dans cet article de blog et dans cet article re:Post. Il faudra les adapter pour intégrer les empreintes JA3/4, mais c'est un excellent point de départ pour découvrir ce qui pourrait être pertinent dans votre contexte.
Pour aller plus loin
Voici une sélection des sources et outils les plus utiles que j'ai trouvés sur le fingerprinting JA3 et JA4.
Sources officielles
- Dépôt GitHub JA3
- Dépôt GitHub JA4+
- TLS Fingerprinting with JA3 and JA3S (blog Salesforce)
- JA4+ Network Fingerprinting (blog FoxIO)
Outils
- ja3.me — la plus grande base d'empreintes JA3 ouverte que j'ai pu trouver
- JA3.ZONE — une autre base, non open-source
- La base d'empreintes JA4+
Articles de blog
- L'article original d'Ivan Ristić sur le fingerprinting TLS
- Les travaux originaux de Lee Brotherston sur le fingerprinting TLS, avec des liens vers ses présentations en conférence
- L'analyse de Cloudflare sur les empreintes JA3 et JA4, avec des précisions sur la façon dont elles sont parsées
- Unveiling Hidden Connections: JA4 Client Fingerprinting on VirusTotal
Présentations
- Profiling And Detecting All Things SSL With JA3 (YouTube ; John Althouse et Jeff Atkinson)
- JA4+ Intro (YouTube ; John Althouse)
- BSides DC 2019 — Using JA3. Asking for a friend? (YouTube ; Justin Warner et Ed Miles)
Les empreintes JA3 et JA4 constituent un complément extrêmement précieux aux différentes options de détection et d'analyse dont vous disposez peut-être déjà — que vous soyez analyste sécurité, ingénieur cloud, couteau suisse d'une petite équipe confrontée à une attaque DDoS, ou tout autre rôle endossé face à ce type de situation.
Vous avez des questions sur la sécurisation de votre environnement cloud ?
Contactez DoiT dès aujourd'hui pour échanger sur la manière dont nous pouvons vous aider à maximiser l'efficacité, la rentabilité et la sécurité de votre environnement cloud. Avec DoiT, vous accédez à une expertise cloud exclusivement senior pour le conseil, la montée en compétences et le support, et nous sommes là chaque fois que vous avez besoin d'un avis d'expert, d'un regard extérieur, d'aide pour adopter de nouvelles technologies ou pour gérer une urgence en production.
Et si vous souhaitez approfondir d'autres sujets de sécurité et d'architecture cloud, parcourez les articles de notre blog d'ingénierie cloud.