JA3-Fingerprint vs. JA4: Leitfaden zu TLS-Fingerprinting
Was ein JA3-Fingerprint ist, worin sich JA4 unterscheidet, warum Chromes zufällige Extension-Reihenfolge JA3 aushebelte und wie Verteidiger Fingerprints nutzen.
Kurz gesagt. Ein TLS-Client-Fingerprint fasst zusammen, wie ein Client seinen ClientHello aufbaut: welche Versionen, Cipher Suites, Extensions und Parameter er anbietet. JA3 (2017) hasht fünf dieser Felder in Senderreihenfolge mit MD5. Als Chromium Anfang 2023 begann, die Reihenfolge der Extensions zu würfeln, erzeugte derselbe Browser plötzlich bei fast jeder Verbindung einen anderen JA3. JA4 (2023, FoxIO) sortiert Cipher Suites und Extensions vor dem Hashen und behält ein lesbares Präfix, bleibt also stabil und ist leichter zu interpretieren. Verteidiger nutzen beide, um Clients zu gruppieren, Tools zu erkennen, die nicht zum Rest einer Umgebung passen, und in Threat Intelligence zu pivotieren. Ein Fingerprint identifiziert einen TLS-Stack, keine Malware.
Warum TLS überhaupt fingerprinten
In einem Mitschnitt sind TLS-Nutzdaten verschlüsselt. Lesbar bleibt der Handshake, beginnend mit dem ClientHello. Er enthält den Servernamen (SNI), die gewünschten Anwendungsprotokolle (ALPN) und eine Liste von Optionen, die von der TLS-Bibliothek und deren Konfiguration durch die Anwendung abhängen. Zwei verschiedene Programme mit zwei verschiedenen Bibliotheken erzeugen selten identische ClientHellos; dasselbe Programm auf vielen Rechnern meistens schon.
Damit können Verteidiger sagen: „Diese 40 Verbindungen stammen von derselben Art Client", ohne etwas zu entschlüsseln.
JA3: fünf Felder und ein MD5
JA3, 2017 von Salesforce-Ingenieuren veröffentlicht, verkettet fünf ClientHello-Felder als Dezimalwerte:
TLSVersion,Ciphers,Extensions,EllipticCurves,EllipticCurvePointFormats
Werte innerhalb eines Felds werden mit Bindestrichen verbunden, GREASE-Werte ignoriert, und die gesamte Zeichenkette wird mit MD5 gehasht. Das serverseitige Gegenstück JA3S macht dasselbe mit Version, gewählter Cipher Suite und Extensions des ServerHello.
Hier der ClientHello aus dem fiktiven Beispielmitschnitt von PCAP Parser, eine TLS-1.3-Sitzung zu g.api.mega.co.nz:
771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,
0-23-65281-10-11-35-16-5-13-18-51-45-43-27,29-23-24,0
JA3 = 7f805430de1e7d98b1de033adb58cf46
Zwei Details fallen auf. Die Version lautet 771 (0x0303, TLS 1.2), obwohl die Sitzung TLS 1.3 nutzt: JA3 liest das Legacy-Versionsfeld, und TLS 1.3 handelt die tatsächliche Version in der Extension supported_versions (43) aus. Und die Extension-Liste wird in der vom Client gesendeten Reihenfolge übernommen – genau dort liegt die Schwäche von JA3.
Warum die zufällige Extension-Reihenfolge JA3 aushebelte
Anfang 2023 begannen Chromium-Browser, die Reihenfolge der TLS-Extensions in jedem ClientHello zu permutieren. Ziel war, dass Server und Middleboxes sich nicht auf eine feste Reihenfolge verlassen, die das TLS-Ökosystem schwerer veränderbar macht. Fastly hat den Effekt gemessen: Bei rund fünfzehn Extensions ist die Zahl möglicher Reihenfolgen so groß, dass praktisch jede Verbindung einen neuen JA3 erhält.
Der Browser hat nicht geändert, was er anbietet, nur die Reihenfolge. Weil JA3 aber die Reihenfolge mithasht, war der Fingerprint kein stabiles Merkmal für Chrome, Edge und andere Chromium-Browser mehr. FoxIOs JA4-Dokumentation nennt diese Änderung als einen der Gründe für das neue Design. Manche Tools sortieren als Workaround die Extensions vor der JA3-Berechnung, erhalten damit aber einen anderen Wert als den in bestehenden Intelligence-Feeds.
JA4: sortiert, gekürzt, lesbar
JA4 besteht aus drei durch Unterstriche verbundenen Teilen, a_b_c:
| Teil | Inhalt |
|---|---|
| a (lesbar) | Protokoll (t TCP, q QUIC, d DTLS), höchste TLS-Version, d bei vorhandener SNI-Domain oder sonst i, Anzahl Cipher Suites, Anzahl Extensions, erstes und letztes Zeichen des ersten ALPN-Werts |
| b | die ersten 12 Hex-Zeichen des SHA-256 der sortierten Cipher-Suite-Liste |
| c | die ersten 12 Hex-Zeichen des SHA-256 der sortierten Extension-Liste ohne SNI und ALPN, gefolgt von den Signaturalgorithmen in Senderreihenfolge |
GREASE-Werte werden durchgehend ignoriert. Dieselbe Beispielsitzung ergibt:
t13d1514h2_8daaf6152771_bc9a4605e104
Lesen Sie das Präfix: TLS über TCP, Version 1.3, SNI mit Domain, 15 Cipher Suites, 14 Extensions, ALPN h2. Die beiden anderen Sitzungen im Beispiel, vom selben Client, ergeben t13d1514h1_8daaf6152771_bc9a4605e104: Nur der ALPN-Teil ändert sich (http/1.1 wird zu h1), die beiden Hashes sind identisch. Das ist der praktische Vorteil: Sie können auf den gesamten Fingerprint, nur auf b und c oder auf das Präfix abgleichen und auf einen Blick sehen, warum sich zwei Werte unterscheiden.
Weil die Extensions sortiert werden, wirkt sich Chromiums Permutation nicht auf JA4 aus. Und weil die Version aus supported_versions stammt, erscheint TLS 1.3 als 13 statt als Legacy-Wert 771.
Zur Lizenz: Der JA4-TLS-Client-Fingerprint steht unter der BSD-3-Clause-Lizenz, die übrigen Methoden der JA4+-Familie unter der FoxIO License 1.1. Prüfen Sie das Repository, bevor Sie JA4+ in ein kommerzielles Produkt einbauen.
JA3 und JA4 auf einen Blick
| JA3 | JA4 | |
|---|---|---|
| Veröffentlicht | 2017, Salesforce | 2023, FoxIO |
| Felder | Version, Cipher Suites, Extensions, Kurven, Punktformate | Protokoll, Version, SNI-Typ, Anzahlen, ALPN, Cipher Suites, Extensions, Signaturalgorithmen |
| Reihenfolge | wie gesendet | Cipher Suites und Extensions sortiert |
| Hash | MD5 der gesamten Zeichenkette | gekürztes SHA-256 für zwei Teile, lesbares Präfix |
| Version bei TLS 1.3 | Legacy-Feld (771) | höchster supported_versions-Wert (13) |
| Stabil bei zufälliger Extension-Reihenfolge | nein | ja |
| QUIC | nicht definiert | definiert (Präfix q) |
Wie Verteidiger TLS-Fingerprints nutzen
Clients in einem Mitschnitt gruppieren
Gruppieren Sie TLS-Sitzungen nach JA4 und zählen Sie die Hosts pro Wert. In einem typischen Büronetz stammen die meisten Sitzungen von einer Handvoll Browser- und Betriebssystem-Stacks. Ein Fingerprint, der nur auf einem Arbeitsplatz auftaucht, zu Zielen, mit denen sonst niemand spricht, verdient einen genaueren Blick.
Widersprüche erkennen
Gibt sich der HTTP-Verkehr eines Hosts im User-Agent als Browser aus, tragen seine TLS-Sitzungen aber einen Fingerprint, der typisch für eine Bibliothek einer Skriptsprache ist, baut etwas anderes als der Browser Verbindungen auf. Dieselbe Überlegung gilt für einen Server, der plötzlich TLS mit einem neuen Stack initiiert.
Mit Threat Intelligence pivotieren – vorsichtig
Threat-Intelligence-Plattformen und Herstellerberichte veröffentlichen Fingerprints, die bestimmten Tools zugeordnet sind. Ein Treffer ist eine Spur, kein Urteil. Kombinieren Sie ihn mit SNI, dem JA3S des Servers, der Reputation des Ziels, dem Zeitablauf und Host-Spuren. Notieren Sie immer, welche Fingerprint-Variante ein Feed verwendet (roher JA3, sortierter JA3, JA4).
Eine Baseline Ihrer Umgebung erstellen
Erstellen Sie eine Liste der Fingerprints, die in Ihrem Netz üblicherweise vorkommen, nach Host-Rolle. Neue Werte fallen dann ohne externe Liste auf.
Grenzen, die Sie kennen sollten
- Nicht malwarespezifisch. Jedes Programm, das dieselbe Bibliothek mit denselben Einstellungen nutzt, hat denselben Fingerprint. Der eingebaute TLS-Stack von Windows etwa wird von vielen Anwendungen geteilt.
- Nachahmung ist möglich. Es gibt Bibliotheken, die den ClientHello eines Browsers nachbilden. Ein browserähnlicher Fingerprint beweist keinen Browser.
- Encrypted Client Hello. Mit ECH (RFC 9849) wird der echte ClientHello samt echtem Servernamen verschlüsselt in einem äußeren ClientHello mit unverfänglichen Werten transportiert. Beobachter fingerprinten die äußere Nachricht und sehen einen öffentlichen Namen, nicht das tatsächliche Ziel.
- QUIC. HTTP/3 läuft über QUIC, wo der ClientHello in verschlüsselten QUIC-Paketen steckt. JA4 definiert eine
q-Variante, aber ein Tool muss QUIC dekodieren, um sie zu berechnen; PCAP Parser dekodiert QUIC noch nicht.
JA3 und JA4 in einem Mitschnitt ansehen
PCAP Parser berechnet JA3 (Zeichenkette und MD5), JA4 und JA3S für jede TLS-Sitzung, die er über TCP findet, und zeigt sie zusammen mit SNI, ALPN sowie angebotener und ausgehandelter Version im TLS-Tab. Filtern Sie auf einen Fingerprint, um alle Sitzungen aufzulisten, die ihn teilen, und exportieren Sie die Ansicht. Der Rundgang zeigt die TLS-Ansicht, und der Tool-Vergleich nennt weitere Tools, die diese Fingerprints berechnen. Für die Namensauflösung derselben Untersuchung lesen Sie weiter bei DNS-Analyse in einer PCAP.
FAQ
Was ist der Unterschied zwischen JA3 und JA4?
JA3 ist ein MD5-Hash aus fünf ClientHello-Feldern in der Reihenfolge, in der der Client sie gesendet hat. JA4 ist ein dreiteiliger, teilweise lesbarer Fingerprint, der Cipher Suites und Extensions vor dem Hashen mit gekürztem SHA-256 sortiert und Protokoll, TLS-Version, SNI-Vorhandensein, Anzahlen und ALPN im Klartext festhält.
Warum funktioniert JA3 bei Chrome nicht mehr?
Seit Anfang 2023 würfeln Chromium-Browser die Reihenfolge der TLS-Extensions in jedem ClientHello neu. JA3 hasht die Extensions in Senderreihenfolge, daher erzeugt derselbe Browser bei fast jeder Verbindung einen anderen JA3. JA4 sortiert die Extensions zuerst, daher bleibt sein Wert stabil.
Identifiziert ein TLS-Fingerprint Malware?
Nein, er identifiziert eine TLS-Client-Implementierung und -Konfiguration. Viele voneinander unabhängige Programme nutzen dieselbe Bibliothek und damit denselben Fingerprint. Nutzen Sie Fingerprints zum Gruppieren und Priorisieren und bestätigen Sie mit Ziel, Zeitablauf, Host-Spuren und weiteren Indikatoren.