Google hat mehrere Prototypen von Exploits veröffentlicht, die die Möglichkeit der Ausnutzung von Sicherheitsanfälligkeiten der Klasse Spectre zeigen, indem JavaScript-Code im Browser ausgeführt wird, um zuvor hinzugefügte Schutzmethoden zu umgehen. Die Exploits können verwendet werden, um auf den Speicher des Prozesses zuzugreifen, der Web-Inhalte im aktuellen Tab verarbeitet. Zum Testen der Funktionalität des Exploits wurde die Website leaky.page gestartet, und der Code mit der Beschreibung der Funktionsweise wurde auf GitHub veröffentlicht.
Der vorgeschlagene Prototyp ist für Angriffe auf Systeme mit Intel Core i7-6500U-Prozessoren in einer Umgebung mit Linux und Chrome 88 ausgelegt. Für die Anwendung des Exploits auf anderen Umgebungen sind Änderungen erforderlich. Die Ausnutzungsmethode ist nicht spezifisch für Intel-Prozessoren – nach entsprechender Anpassung wurde die Funktionalität des Exploits auch auf Systemen mit CPUs anderer Hersteller bestätigt, einschließlich Apple M1 auf ARM-Architektur. Nach geringfügigen Anpassungen ist der Exploit auch in anderen Betriebssystemen und in anderen Browsern, die auf der Chromium-Engine basieren, funktionstüchtig.
In einer Umgebung mit dem Standard-Chrome 88 und Intel Skylake-Prozessoren gelang es, Daten aus dem Prozess, der für die Verarbeitung von Web-Inhalten im aktuellen Chrome-Tab verantwortlich ist (Renderer-Prozess), mit einer Geschwindigkeit von 1 Kilobyte pro Sekunde abzuleiten. Darüber hinaus wurden alternative Prototypen entwickelt, zum Beispiel ein Exploit, der durch eine Verringerung der Stabilität die Geschwindigkeit der Datenableitung auf 8 kB/s erhöhen kann, indem der Timer performance.now() mit einer Genauigkeit von 5 Mikrosekunden (0,005 Millisekunden) verwendet wird. Außerdem wurde eine Variante vorbereitet, die bei einer Timer-Genauigkeit von einer Millisekunde arbeiten kann und dazu verwendet werden kann, den Speicher eines anderen Prozesses mit einer Geschwindigkeit von etwa 60 Byte pro Sekunde zugänglich zu machen.
Der veröffentlichte Democode besteht aus drei Teilen. Der erste Teil kalibriert den Timer zur Schätzung der Ausführungszeit von Operationen, die erforderlich sind, um die im Prozessor-Cache verbleibenden Daten, die durch spekulative Ausführung der CPU-Anweisungen entstanden sind, wiederherzustellen. Der zweite Teil bestimmt die Speicheranordnung, die beim Platzieren eines JavaScript-Arrays verwendet wird.
Der dritte Teil nutzt direkt die Schwachstelle Spectre aus, um den Inhalt des Speichers des aktuellen Prozesses zu ermitteln, indem Bedingungen für die spekulative Ausführung bestimmter Operationen geschaffen werden, deren Ergebnisse vom Prozessor nach Feststellung einer Fehlvorhersage verworfen werden. Die Spuren der Ausführung bleiben jedoch im allgemeinen Cache und können mit Methoden zur Bestimmung des Cache-Inhalts über Seitenkanäle rekonstruiert werden, die die Veränderung der Zugriffszeiten auf gecachte und nicht gecachte Daten analysieren.
Die vorgeschlagene Ausbeutetechnik ermöglicht es, ohne hochpräzise Timer auszukommen, die über die API performance.now() verfügbar sind, sowie ohne Unterstützung des Typs SharedArrayBuffer, der die Erstellung von Arrays im gemeinsamen Speicher ermöglicht. Der Exploit enthält einen Spectre-Gadget, der eine kontrollierte spekulative Ausführung von Code hervorruft, und einen Analyse-Tool zur Erkennung von Cache-Lecks, das die durch spekulative Ausführung gecachten Daten ermittelt.
Der Gadget wird durch ein JavaScript-Array realisiert, in dem versucht wird, auf einen Bereich außerhalb der Puffergrenzen zuzugreifen, was den Zustand des Übergangsprognoseblocks beeinflusst, aufgrund der von dem Compiler hinzugefügten Puffergrößenüberprüfung (der Prozessor führt spekulativ einen Zugriff durch, rollt aber den Zustand nach der Prüfung zurück). Um den Cache-Inhalt unter Bedingungen ungenauer Timer zu analysieren, wird eine Methode vorgeschlagen, die die in Prozessoren angewandte Datenverdrängungsstrategie Tree-PLRU überlistet und es ermöglicht, die Unterschiedliche Zeit bei der Rückgabe eines Wertes aus dem Cache und bei Abwesenheit eines Wertes im Cache durch Erhöhung der Anzahl der Zyklen erheblich zu vergrößern.
Es wird angemerkt, dass Google einen Prototyp eines Exploits veröffentlicht hat, um die Realisierbarkeit von Angriffen unter Verwendung von Sicherheitsschwächen des Typs Spectre zu demonstrieren und Webentwickler dazu zu ermutigen, Techniken anzuwenden, die das Risiko solcher Angriffe minimieren. Dabei ist Google der Auffassung, dass ohne eine umfassende Überarbeitung des vorgeschlagenen Prototyps keine universellen Exploits erstellt werden können, die nicht nur zur Demonstration, sondern auch für den breiten Einsatz geeignet sind.
Um das Risiko zu minimieren, wird Website-Besitzern empfohlen, in letzter Zeit umgesetzte Header wie Cross-Origin Opener Policy (COOP), Cross-Origin Embedder Policy (COEP), Cross-Origin Resource Policy (CORP), Fetch Metadata Request, X-Frame-Options, X-Content-Type-Options und SameSite Cookie zu verwenden. Diese Mechanismen bieten keinen direkten Schutz vor Angriffen, helfen jedoch dabei, die Daten der Website von einer möglichen Leckage in Prozesse zu isolieren, in denen JavaScript-Code des Angreifers ausgeführt werden kann (die Leckage erfolgt aus dem Speicher des aktuellen Prozesses, in dem neben dem Code des Angreifers auch die Daten einer anderen Website verarbeitet werden können, die im selben Tab geöffnet ist). Die grundlegende Idee besteht darin, die Ausführung des Codes der Website in verschiedenen Prozessen vom Code Dritter zu trennen, der aus unsicheren Quellen stammt, beispielsweise über iFrame eingebunden wird.

Quelle: opennet.ru
