Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!
CVE-2021-21220 — Presentazione educativa che dettaglia lo sfruttamento di CVE-2021-21220, una type confusion JIT V8 che porta ad accesso OOB e RCE tramite WebAssembly, con analisi di mitigazione. | Kitploit
Presentazione educativa che dettaglia lo sfruttamento di CVE-2021-21220, una type confusion JIT V8 che porta ad accesso OOB e RCE tramite WebAssembly, con analisi di mitigazione.
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:
root@kitploit:~
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:
root@kitploit:~
0x80000000
che imposta il bit di segno di un intero a 32 bit.
4. Discrepanza di Ottimizzazione
La vulnerabilità si verifica perché TurboFan ottimizza:
root@kitploit:~
x ^ 0
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.