Ausnutzung von CVE-2021-21220
Von falschem JIT-Verhalten zu Remote Code Execution
Übersicht
Diese Präsentation erklärt die Ausnutzung von CVE-2021-21220, einer Schwachstelle in Googles Chrome V8 JavaScript-Engine, die durch falsche JIT-Compiler-Annahmen während der Optimierung verursacht wurde.
Die Präsentation führt durch:
- Wie V8 Just-In-Time (JIT)-Kompilierung durchführt
- Wie ein Vorzeichen-/Vorzeichenlos-Typkonfusionsfehler während der Optimierung auftritt
- Wie der Fehler zu einer Out-of-Bounds (OOB)-Array-Primitive führt
- Wie Angreifer OOB-Zugriff nutzen können, um Adressen zu leaken und beliebige Speicherschreibvorgänge zu erreichen
- Wie WebAssembly (Wasm) ein Ziel für native Codeausführung wird
- Vorhandene Gegenmaßnahmen und moderne Browserabwehr
Präsentationsziele
Das Ziel dieser Präsentation ist es zu zeigen, wie ein subtiler Optimierungsfehler in einer modernen JavaScript-Engine eskalieren kann zu:
- Speicherkorruption
- Beliebigem Lesen/Schreiben
- Native Code-Modifikation
- Potenzieller Remote Code Execution (RCE)
Die Exploit-Kette verdeutlicht, wie JIT-Engines Leistung und Sicherheit ausbalancieren und wie falsche Optimierungsannahmen ausnutzbar werden können.
Behandelte Themen
1. V8-Architektur
Die Präsentation stellt die wichtigsten V8-Komponenten vor:
Ignition Interpreter
- Führt JavaScript-Bytecode aus
- Sammelt Laufzeit-Feedback
- Speichert Typinformationen in Feedback-Vektoren
TurboFan Optimizer
- Erstellt optimierte Graphen aus Laufzeit-Feedback
- Fügt spekulative Annahmen und Guards ein
- Führt aggressive Optimierungsdurchläufe durch
Machine Code Backend
- Erzeugt native CPU-Befehle
- Produziert optimierten Maschinencode für „heiße“ Funktionen
Das Architekturdiagramm in der Präsentation veranschaulicht, wie JavaScript sich bewegt von:
Parsing → Bytecode → Optimization → Execution
2. Warum JavaScript schwer zu optimieren ist
JavaScript ist für Hochleistungsausführung herausfordernd, weil:
- Variablen dynamisch ihren Typ ändern
- Arrays ihre Struktur und Elementtypen ändern
- Operatoren wie
+ mehrere Bedeutungen haben können
- Laufzeitprüfungen teuer sind
V8 verwendet JIT-Kompilierung, um häufige Ausführungsmuster durch Spekulation über das Laufzeitverhalten zu optimieren.
3. Grundursache von CVE-2021-21220
Die Schwachstelle entsteht durch eine Nichtübereinstimmung zwischen vorzeichenbehafteten und vorzeichenlosen Integer-Werten während der JIT-Optimierung.
Schlüsselkonzepte, die gezeigt werden:
Uint32Array
Word32Xor
- Falsche Typweiterleitung
ChangeInt32ToInt64
- Falsche Auswahl von Assembler-Befehlen
Der Exploit missbraucht den Wert:
0x80000000
der das Vorzeichenbit eines 32-Bit-Integer setzt.
4. Optimierungsfehler
Die Schwachstelle tritt auf, weil TurboFan die Operation:
x ^ 0
vollständig weg optimiert.
Während dieser Optimierung:
- Die XOR-Operation verschwindet
- Typinformationen gehen verloren
- Vorzeichenbehaftete Werte werden als vorzeichenlos interpretiert
- Das JIT-Verhalten weicht vom Interpreter-Verhalten ab
Dies führt zu falscher Maschinencode-Generierung und angreiferkontrollierten Werten.
5. Aufbau einer OOB-Primitive
Der Exploit wandelt das falsche JIT-Ergebnis in Kontrolle über das Array-Verhalten um.
Die Präsentation zeigt:
- Falscher optimierter Integer-Wert
- Umwandlung in Kontrollvariable
i
- Unterschied zwischen Warmup und Trigger-Ausführung
Array.shift()-Längenunterlauf
- Erstellung eines OOB-fähigen Arrays
Wichtige Exploit-Konzepte, die gezeigt werden:
- Warmup-Optimierung
- Spekulative Optimierung
- Typkonfusion
- Array-Längen-Korruption
6. Zugriff außerhalb der Grenzen
Sobald die Array-Länge -1 wird, erhält der Angreifer:
- Lesezugriffe außerhalb der Grenzen
- Schreibzugriffe außerhalb der Grenzen
- Zugriff auf benachbarte V8-Heap-Objekte
Der Exploit demonstriert dann:
- Pointer-Leaks
- Objektadressen-Erkennung
- Überlappende Arrays
- Extraktion roher V8-Pointer
7. Missbrauch von WebAssembly
Die Präsentation erklärt, wie Angreifer Folgendes angreifen können:
- Kompilierte WebAssembly-Codeseiten
- Von V8 erzeugten nativen ausführbaren Speicher
Angriffsablauf:
- Erstellen einer Wasm-Funktion
- Lokalisieren des ausführbaren Speichers
- Überschreiben des kompilierten Maschinencodes
- Erneutes Ausführen von Wasm
- Erreichen beliebiger nativer Codeausführung
Dies zeigt, wie ein JavaScript-Engine-Fehler zu Codeausführung auf Prozessebene eskalieren kann.
Verteidigung und Gegenmaßnahmen
Der letzte Abschnitt behandelt moderne Browserabwehr:
Compressed Pointers
Reduzieren direkte Pointer-Exposition und Heap-Vorhersagbarkeit.
Pointer Indirection
Verhindern direkten Zugriff auf rohe Speicheradressen.
Heap Sandboxing
Isolieren Speicherbereiche und verringern Exploit-Auswirkungen.
W^X (Write XOR Execute)
Verhindern, dass Seiten gleichzeitig beschreibbar und ausführbar sind.
Die Präsentation enthält auch den eigentlichen V8-Patch-Diff, der den Fix für das Vorzeichenerweiterungsproblem zeigt.
Wichtige Erkenntnisse
Diese Präsentation zeigt, wie:
- Kleine Optimierungsfehler zu kritischen Schwachstellen werden können
- JIT-Compiler die Komplexität der Angriffsfläche erheblich erhöhen
- Laufzeitspekulation gefährliche Inkonsistenzen einführen kann
- WebAssembly die Exploit-Landschaft verändert
- Moderne Browser mehrere abgestufte Verteidigungen benötigen
Besprochene Technologien
- JavaScript
- Google V8 Engine
- TurboFan
- Ignition
- WebAssembly (Wasm)
- JIT Compilation
- Memory Corruption
- Out-of-Bounds Access
- Browser Exploitation
Bildungszweck
Dieses Material ist ausschließlich bestimmt für:
- Sicherheitsforschung
- Bildungsdemonstrationen
- Lernen über Browser-Interna
- Schwachstellenanalyse
Verwenden Sie diese Informationen nicht gegen Systeme, die Sie nicht besitzen oder für die Sie keine Testberechtigung haben.
Referenzen