Zurück zum Blog

Folgen und abonnieren

Der aktuelle Stand beim TLS-Fingerprinting: was funktioniert, was nicht und was als Nächstes kommt

Fastly Security Research Team

Fastly Security Research Team, Fastly

Xavier Stevens

Staff Security Researcher, Fastly

Übersicht

TLS-Fingerprinting hat sich zu einem weit verbreiteten Tool entwickelt, mit dem Sicherheitsverantwortliche feststellen können, welche Clients mit ihrer Serverinfrastruktur kommunizieren. Die Idee geht ursprünglich auf Lee Brotherstons Forschung aus dem Jahr 2015 zurück, die in einem Blogpost und einem anschließenden Vortrag auf der Derbycon vorgestellt wurde. Demnach lassen sich TLS-Handshakes an der Art und Weise unterscheiden, wie einzelne Clients (und Server) diese handhaben. Seit der Veröffentlichung wurde diese Idee mehreren Methodik- und Protokollanpassungen unterzogen. 

In diesem Blogpost stellen wir Ihnen drei Fingerprinting-Methoden vor und erläutern die Vor- und Nachteile der einzelnen Ansätze.

Der Vorreiter: JA3

Im Jahr 2017 veröffentlichte ein Forschertrio von Salesforce, bestehend aus John Althouse, Jeff Atkinson und Josh Atkins, eine passive Methode für TLS-Fingerprinting namens JA3. JA3 wird für das Fingerprinting eines TLS-Clients verwendet und JA3S ist das entsprechende Gegenstück für Server. Diese Methode hat sich als nützlich erwiesen, um nicht nur Malware-Clients und -Server, sondern auch Web-API-Clients und -Browser zu identifizieren.

Um den JA3-Fingerprint zu berechnen, empfangen oder beobachten wir ein TLS Client-Hello-Paket und extrahieren die TLS-Version, die akzeptierten Chiffren, die Liste der Erweiterungen, die unterstützten Gruppen und die elliptischen Kurvenformate. Der Extraktionsprozess ist recht einfach: Wir verketten die Dezimalwerte der Bytes dieser Felder entsprechend der Spezifikation für diese Methode.

Beispiel eines JA3-Fingerprints und -Hashs

Dieser Fingerprint wird manchmal auch als JA3-String bezeichnet. Um die gemeinsame Nutzung zu erleichtern und die Größe zu reduzieren, berechnen JA3-Implementierungen einen MD5-Hash dieses Fingerprints, der bei Suchvorgängen in Datenbanken wesentlich kompakter ist.

JA3S beruht auf einem ähnlichen Verfahren: Anstelle des Client-Hello-Pakets verwendet es das Server-Hello-Paket, um die TLS-Version, die Chiffren und die Erweiterungen zu extrahieren. Es sollte erwähnt werden, dass das Server-Hello-Paket je nach genutztem Client-Hello-Paket variiert. Daher bietet es nicht die gleiche Eindeutigkeit des Fingerprints wie sein Pendant, ist aber in Verbindung mit dem JA3-Client-Hash dennoch nützlich.

JA3 hat in gewisser Weise ähnliche Eigenschaften wie der User Agent eines Browsers. Wie im Blogpost des JA3-Teams erwähnt, kann es zu False Positives kommen. Dies kann darauf zurückzuführen sein, dass sich die Clients in so ähnlicher Weise verhalten, dass sie den gleichen Hash haben, oder es mag sich um eine absichtliche Täuschung handeln. Denn Angreifer und Bot-Entwickler sind sich des Fingerprintings bewusst und versuchen möglicherweise, den TLS-Handshake eines „guten“ Clients zu imitieren, um nicht entdeckt zu werden. Allerdings ist es für Angreifer immer noch mit erhöhtem Aufwand verbunden, Kontrollmechanismen, die JA3 verwenden, zu täuschen.

Öffentliche JA3-Datenbanken: bequem, aber mit Vorsicht zu genießen

Die Möglichkeit, einen De-facto-Standard-Fingerprint unter Teams oder Unternehmen auszutauschen, ist für das Detection Engineering und die Bedrohungsforschung von großem Nutzen. Heutzutage wird JA3 von vielen Plattformen und Services unterstützt. Ein häufig genutzter Service und eine Datenbank, auf die wir immer wieder verweisen, ist ja3er.com.

Diese Datenbanken sind jedoch nicht mangelfrei. Im Oktober 2021 bemerkte das SOC Team von Fastly eine Unstimmigkeit zwischen JA3ER und einer internen Implementierung, die für die Berechnung von JA3-Fingerprints entwickelt wurde. Nach einer gründlichen Untersuchung konnte das Team den Fehler auf die Handhabung der TLS Application-Layer Protocol Settings Extension eingrenzen, die noch nicht bei IANA registriert ist, aber in Googles BoringSSL Implementierung enthalten ist. Der JA3ER-Service unterschlägt diesen Erweiterungswert, was dazu führt, dass in seinem System ein ungültiger Fingerprint berechnet wird.

Die Inkonsistenz bei der Berechnung von Fingerprints macht das Teilen von Fingerprints unter Unternehmen nicht länger praktikabel. Um zu verstehen, wie weit verbreitet dieses Problem ist, haben wir ein Experiment durchgeführt, das zeigen soll, ob es noch andere Parameter gibt, die zu Unstimmigkeiten führen können. Zu diesem Zweck haben wir einen nutzerdefinierten Client mit uTLS implementiert, mit dem wir genau kontrollieren konnten, welche Parameter wir während des TLS-Handshakes senden. Dann haben wir den Client sowohl auf JA3ER als auch auf unseren eigenen Server gerichtet, um die Ergebnisse vergleichen zu können. Auch wir konnten bestätigen, dass die Hashes nicht übereinstimmten.

Wir haben Wireshark zu Hilfe gezogen, um zu überprüfen, ob die Ausgabe mit unserer übereinstimmt und ob die einzelnen Feldwerte korrekt sind. Als wir den vollständigen JA3-Fingerprint unseres Systems mit der Ausgabe von JA3ER verglichen, stellten wir fest, dass eine einzige elliptische Kurve, x448, für die Diskrepanz verantwortlich war. Im IANA Registry wird dieses Feld durch den Dezimalwert 30 dargestellt. Aus uns unbekannten Gründen gibt JA3ER für dieses Feld einen Dezimalwert von 1035 aus.

Ausgabe aus dem JA3-Diff-Skript

Nicht lange nach dieser Entdeckung sahen wir uns das offizielle JA3-Repository auf Github an und stellten fest, dass ein anderer Nutzer im Oktober letzten Jahres ebenso Unstimmigkeiten entdeckt hatte. Er hatte bereits ein Problem gemeldet und versucht, den Autor über mehrere Kanäle zu kontaktieren – scheinbar ohne Erfolg.

Wir können bestätigen, dass dieses Problem zum Zeitpunkt der Redaktion dieses Artikels immer noch besteht. Angesichts dessen empfehlen wir, sich beim Cyberschutz nicht auf die Ergebnisse von JA3ER oder der Datenbank zu verlassen.

Leider gibt es keine einschlägigen Alternativen. abuse.ch verfügt über eine Datenbank mit JA3-Fingerprints, die sich aber vorwiegend auf Malware-Clients konzentriert. Das ursprüngliche JA3-Repository enthält Verweise auf Listen, die jedoch jahrelang nicht mehr aktualisiert wurden und nicht umfassend sind. Ohne ein Repository eines Drittanbieters sollten Sie in Erwägung ziehen, eines für Ihren eigenen Anwendungsfall zu erstellen.

Verbessertes Server-Fingerprinting: JARM

Im November 2020 veröffentlichte John Althouse zusammen mit Andrew Smart, RJ Nunnally und Mike Brady eine weitere Methode für das TLS-Fingerprinting von Servern – die JARM Methode. JARM wird zum Scannen und Identifizieren von Servern verwendet und bietet im Vergleich zu JA3S mehr Individualität. Im Gegensatz zu JA3S, das auf passiver Beobachtung beruht, wird bei JARM aktiv gescannt, um Informationen von Servern zu erhalten. JARM sendet 10 speziell gestaltete TLS-Client-Hello-Pakete und führt einen Hash über bestimmte Attribute der Antworten durch. Da bei dieser Methode gescannt wird, ist es möglich, dass JARM proaktiv einen Fingerprint von großen Teilen des Internets erstellt. Diese Fähigkeit, nach dem Fingerprint zu scannen, hat zu einer breiten Akzeptanz in der Branche geführt und wird von vielen Tools und Services unterstützt.

Beispiel eines JARM-Fingerprints

Ähnlich wie bei JA3/JA3S sollten Sie sich beim Cyberschutz nicht allein auf einen JARM-Hash verlassen. Ein konkretes Beispiel dafür ist, dass der JARM-Fingerprint von Cobalt Strike eigentlich der JARM-Fingerprint von Java ist. Das bedeutet, dass Teams, die den Fingerprint einer böswilligen Cobalt Strike Installation als Mittel zum Blockieren von Verbindungen verwenden, möglicherweise auch andere, nicht böswillige Java Software blockieren. Raphael Mudge hat einen hilfreichen Artikel zu diesem Thema geschrieben. Wenn Sie speziell nach Cobalt Strike Servern suchen, müssen Sie weitere Nachforschungen anstellen, um zu bestätigen, dass Sie definitiv oder zumindest mit hoher Wahrscheinlichkeit auf einen böswilligen Server gestoßen sind.

Die modernste Option: CYU

Ein paar Jahre nach der Vorstellung von JA3 wurde das QUIC-Protokoll immer beliebter. Dort gab es allerdings eine Schwachstelle, die die Erstellung eines ähnlichen passiven Fingerprints für entsprechende Verbindungen erforderte. Caleb Yu schlug im Rahmen seines Praktikums bei Salesforce eine Lösung namens CYU-Hash vor. Derzeit sind Implementierungen von CYU weniger verbreitet als JA3, obwohl man sie in einigen beliebten Tools wie Zeek und Suricata finden kann. Wir gehen davon aus, dass jetzt, wo HTTP/3 als offizieller Standard gilt, CYU oder eine ähnliche Methode zunehmend Verbreitung finden wird.

Die von Yu und Althouse veröffentlichte Arbeit enthält ein Beispiel für ein einzelnes Angriffstool, das QUIC verwendet: Merlin C2. Da aber in vielen Standard-Webclients QUIC-Unterstützung implementiert ist (einschließlich für Webbrowser und curl), erwarten wir, dass diese Zahl mit der Zeit zunehmen wird.

Nächste Schritte

John Althouse und sein Team waren in den letzten Jahren maßgeblich an der Entwicklung des verschlüsselten Channel Fingerprinting beteiligt. Sie haben hervorragende Arbeit geleistet und wir sprechen ihnen unsere Anerkennung für ihre Bemühungen aus. Um die Herausforderungen derartiger Lösungen auch in Zukunft bewältigen zu können, bedarf es unserer Meinung nach allerdings einer stärkeren Beteiligung der Community. Selbstverständlich brauchen diese Bemühungen nicht das Niveau eines eigentlichen Standardisierungsgremiums erreichen. Schriftliche Spezifikationen und einheitliche Testsuiten wären jedoch hilfreich, um sicherzustellen, dass die einzelnen Implementierungen unter Berücksichtigung verschiedener Eingaben korrekte Ergebnisse liefern.

Wir legen Sicherheitsteams nahe, Fingerprinting als ein weiteres Tool in ihrem Programm zu betrachten, um böswillige Clients und Server identifizieren und tracken zu können. Der Austausch der identifizierten Fingerprints zwischen den Teams unterstützt die Arbeit aller, die sich gegen böswillige Angriffe im Internet verteidigen. Vergessen Sie aber nicht, sich zu vergewissern, dass jeder in der Gruppe, der Fingerprints austauscht, die Ergebnisse seiner Tools validiert hat oder zumindest gebräuchliche Tools zum Generieren der Fingerprints verwendet. Denn ohne verlässliche Fingerprint-Daten führt das Teilen möglicherweise nicht zum gewünschten Erfolg.

Wenn Sie mit JA3-Hashes auf der Fastly Plattform arbeiten möchten, können Sie über VCL und Compute Bibliotheken darauf zugreifen.