Sfruttamento di CVE-2021-21220
Da un comportamento JIT errato all'esecuzione remota di codice
Panoramica
Questa presentazione spiega lo sfruttamento di CVE-2021-21220, una vulnerabilità nel motore JavaScript V8 di Google Chrome causata da ipotesi errate del compilatore JIT durante l'ottimizzazione.
La presentazione illustra:
- Come V8 esegue la compilazione Just-In-Time (JIT)
- Come un bug di confusione tra tipi signed/unsigned si manifesta durante l'ottimizzazione
- Come il bug porta a una primitiva array out-of-bounds (OOB)
- Come gli attaccanti possono sfruttare l'accesso OOB per divulgare indirizzi e ottenere scritture arbitrarie in memoria
- Come WebAssembly (Wasm) diventa un bersaglio per l'esecuzione di codice nativo
- Mitigazioni esistenti e difese dei browser moderni
Obiettivi della Presentazione
L'obiettivo di questa presentazione è dimostrare come un sottile errore di ottimizzazione all'interno di un moderno motore JavaScript possa degenerare in:
- Corruzione della memoria
- Primitive di lettura/scrittura arbitraria
- Modifica del codice nativo
- Potenziale esecuzione remota di codice (RCE)
La catena di exploit evidenzia come i motori JIT bilancino prestazioni e sicurezza, e come ipotesi di ottimizzazione errate possano diventare sfruttabili.
Argomenti Trattati
1. Architettura di V8
La presentazione introduce i principali componenti di V8:
Interprete Ignition
- Esegue bytecode JavaScript
- Raccoglie feedback a runtime
- Memorizza le informazioni sui tipi nei vettori di feedback
Ottimizzatore TurboFan
- Costruisce grafi ottimizzati a partire dal feedback a runtime
- Inserisce ipotesi speculative e guardie
- Esegue passaggi di ottimizzazione aggressivi
Backend del codice macchina
- Emette istruzioni native della CPU
- Produce codice macchina ottimizzato per le funzioni "calde"
Il diagramma architetturale nella presentazione illustra come JavaScript si sposta da:
Parsing → Bytecode → Ottimizzazione → Esecuzione
2. Perché JavaScript è Difficile da Ottimizzare
JavaScript è impegnativo per l'esecuzione ad alte prestazioni perché:
- Le variabili cambiano tipo dinamicamente
- Gli array cambiano struttura e tipi di elementi
- Operatori come
+ possono avere molteplici significati
- I controlli a runtime sono costosi
V8 utilizza la compilazione JIT per ottimizzare i pattern di esecuzione comuni speculando sul comportamento a runtime.
3. Causa Principale di CVE-2021-21220
La vulnerabilità ha origine da una discrepanza tra interi con e senza segno durante l'ottimizzazione JIT.
Concetti chiave dimostrati:
Uint32Array
Word32Xor
- Propagazione errata del tipo
ChangeInt32ToInt64
- Selezione errata dell'istruzione assembly
L'exploit abusa del valore:
che imposta il bit di segno di un intero a 32 bit.
4. Discrepanza di Ottimizzazione
La vulnerabilità si verifica perché TurboFan ottimizza:
eliminandola completamente.
Durante questa ottimizzazione:
- L'operazione XOR scompare
- Le informazioni sul tipo vengono perse
- I valori con segno vengono interpretati come senza segno
- Il comportamento JIT diverge dal comportamento dell'interprete
Ciò comporta una generazione errata del codice macchina e valori controllati dall'attaccante.
5. Costruzione di una Primitiva OOB
L'exploit converte il risultato JIT errato in controllo sul comportamento dell'array.
La presentazione dimostra:
- Valore intero ottimizzato errato
- Conversione in variabile di controllo
i
- Discrepanza tra esecuzione di warmup e trigger
- Underflow della lunghezza di
Array.shift()
- Creazione di un array con capacità OOB
Importanti concetti di exploit mostrati:
- Ottimizzazione di warmup
- Ottimizzazione speculativa
- Confusione di tipo
- Corruzione della lunghezza dell'array
6. Accesso Fuori dai Limiti
Una volta che la lunghezza dell'array diventa -1, l'attaccante ottiene:
- Letture fuori dai limiti
- Scritture fuori dai limiti
- Accesso agli oggetti heap V8 adiacenti
L'exploit dimostra quindi:
- Divulgazione di puntatori
- Scoperta degli indirizzi degli oggetti
- Sovrapposizione di array
- Estrazione di puntatori V8 grezzi
7. Abuso di WebAssembly
La presentazione spiega come gli attaccanti possono prendere di mira:
- Pagine di codice compilato di WebAssembly
- Memoria eseguibile nativa generata da V8
Flusso dell'attacco:
- Creare una funzione Wasm
- Localizzare la memoria eseguibile
- Sovrascrivere il codice macchina compilato
- Rieseguire Wasm
- Ottenere esecuzione nativa arbitraria
Questo dimostra come un bug del motore JavaScript possa transitare verso l'esecuzione di codice a livello di processo.
Difese e Mitigazioni
L'ultima sezione copre le difese dei browser moderni:
Puntatori Compressi
Riduce l'esposizione diretta dei puntatori e la prevedibilità dell'heap.
Indirezione dei Puntatori
Impedisce l'accesso diretto agli indirizzi di memoria grezzi.
Sandboxing dell'Heap
Isola le regioni di memoria e riduce l'impatto dell'exploit.
W^X (Write XOR Execute)
Impedisce che le pagine siano scrivibili ed eseguibili simultaneamente.
La presentazione include anche il diff della patch V8 effettiva che mostra la correzione per il problema dell'estensione del segno.
Punti Chiave
Questa presentazione dimostra come:
- Piccoli errori di ottimizzazione possano diventare vulnerabilità critiche
- I compilatori JIT aumentino significativamente la complessità della superficie d'attacco
- La speculazione a runtime possa introdurre pericolose inconsistenze
- WebAssembly cambi il panorama dello sfruttamento
- I browser moderni richiedano molteplici livelli di difesa
Tecnologie Discusse
- JavaScript
- Motore Google V8
- TurboFan
- Ignition
- WebAssembly (Wasm)
- Compilazione JIT
- Corruzione della memoria
- Accesso fuori dai limiti
- Sfruttamento dei browser
Scopo Educativo
Questo materiale è destinato esclusivamente a:
- Ricerca sulla sicurezza
- Dimostrazioni educative
- Apprendimento dei meccanismi interni dei browser
- Analisi delle vulnerabilità
Non utilizzare queste informazioni contro sistemi di cui non sei proprietario o per i quali non hai autorizzazione per il test.
Riferimenti