
POC disponibile presto
Una vulnerabilità critica di esecuzione remota di codice in Google Chrome (versioni 123 e precedenti) che interessa la gestione dei tipi di garbage collection di WebAssembly (WASM). Il bug consente una confusione di tipo che può essere escalata a lettura/scrittura arbitraria della memoria e, infine, all'esecuzione di codice.
La vulnerabilità deriva dalla confusione tra gli ID di tipo canonico isorecursivi di WASM e le rappresentazioni wasm::HeapType / wasm::ValueType utilizzate nelle funzioni di conversione da JavaScript a WASM.
Fondamentalmente, un ID di tipo canonico non è vincolato in alcun modo a kV8MaxWasmTypes – può crescere tanto quanto la memoria dell'host lo consente.
La classe ValueType codifica i tipi heap in un campo a 20 bit, ma gli ID di tipo canonico possono superare questo limite. Quando un ID di tipo canonico come:
tn = t0 + 0x100000 * n
viene troncato a 20 bit, crea un alias con t0, abilitando un attacco di confusione di tipo.
Inoltre, gli ID di tipo canonico che corrispondono a kAny + 0x100000 * n (dove kAny = 1000005) bypassano i controlli di tipo e consentono una confusione di tipo WASM arbitraria.
L'avviso descrive lo sfruttamento in tre fasi:
Creando moduli WASM con più di 1.000.000 di tipi, gli ID di tipo canonico si avvolgono, consentendo la confusione tra tipi struct e tipi riferimento. I tipi struct creati per sovrapporsi a kAny bypassano i controlli di tipo da JS a WASM.
Modificando i campi di ArrayBuffer che memorizzano il backing-store, l'attaccante ottiene una scrittura arbitraria a un indirizzo in cui il valore scritto è l'indirizzo del metadato. Questo sfrutta le strutture SlotSpanMetadata per divulgare indirizzi di chrome.dll e ottenere scritture arbitrarie in memoria.
L'exploit dirotta la CodePointerTable e sposta l'esecuzione su una catena ROP che contrassegna le regioni di shellcode come eseguibili.
La PoC dimostra:
kAny per bypassare i controlli di tipo JS-WASM.Si tratta di una variante di CVE-2024-2887, scoperta da Manfred Paul e presentata al Pwn2Own Vancouver 2024. Sfrutta una debolezza simile nella canonizzazione dei tipi attraverso un vettore diverso.
Google Chrome 123 e precedenti.
Corretto in Google Chrome 124.
Seunghyun Lee (Xion, @0x10n), partecipante a TyphoonPWN 2024.