
Analisi delle cause profonde ed exploit funzionante per CVE-2026-78938, una type confusion in V8 TurboFan che porta a lettura/scrittura arbitraria all'interno dell'heap compresso. Include PoC di crash e primitive indirizzate a runtime.
Analisi delle cause profonde ed exploit per CVE-2026-78938, una confusione di tipo nell'eliminazione dei carichi di TurboFan di V8, corretta in Chrome 152.0.7977.64 (V8 15.2.124.18). Il bug è stato segnalato come sfruttato in natura.
L'exploit trasforma il bug in un Float64Array fuori dai limiti e da lì in addrof / fakeobj e lettura/scrittura arbitraria sull'heap compresso di V8. Tutto ciò che segue la scrittura iniziale viene individuato a runtime — non ci sono offset di heap hardcoded nella fase R/W.
50597b0bb48a — "[compiler] Invalidate tracked fields on CheckMaps with instance migration"Testato su macOS arm64 contro una d8 compilata localmente di entrambe le versioni.
| file | cosa contiene |
|---|
pocs/crash.js | Trigger minimale. SIGBUS sulla build vulnerabile, uscita pulita su quella corretta. |
pocs/rw_final.js | Exploit completo, fase 1: trigger + array OOB. Congelato — vedi "Riproduzione" sotto. |
pocs/logic_final.js | Exploit completo, fase 2: addrof/fakeobj/R\W arbitraria, caricato a runtime dalla fase 1. |
WRITEUP.md | Analisi completa delle cause profonde e note sullo sfruttamento. |
Compila le due versioni di d8 (vedi WRITEUP.md per i commit esatti e gli argomenti GN), poi dalla radice del repository:
# PoC di crash: SIGBUS su vuln, pulito su patched
out/vuln/d8 --allow-natives-syntax --homomorphic-ic --max-valid-polymorphic-map-count=4 pocs/crash.js
out/patched/d8 --allow-natives-syntax --homomorphic-ic --max-valid-polymorphic-map-count=4 pocs/crash.js
# R/W completo: funziona su vuln, esce pulito su patched
out/vuln/d8 --allow-natives-syntax --homomorphic-ic --max-valid-polymorphic-map-count=4 pocs/rw_final.js
Output atteso sulla build vulnerabile:
[+] OOB Float64Array len=0x7f000004
[+] after write: victim2.z = 2.5
[+] fakeobj(hn|1) typeof=number
[+] ALL PRIMITIVES VERIFIED
Due cose contano:
--homomorphic-ic --max-valid-polymorphic-map-count=4 modellano il feedback delle mappe polimorfiche così che il percorso di migrazione venga seguito nel codice ottimizzato. Senza di essi il trigger non fa silenziosamente nulla.pocs/rw_final.js è congelato byte per byte. L'unica scrittura corruttrice atterra su un offset relativo all'heap che dipende da dove viene allocato l'array vittima, che a sua volta dipende dai byte esatti e dal percorso dello script. Modificare il file (o rinominarlo) invalida l'offset incorporato; WRITEUP.md documenta come ricalibrarlo. pocs/logic_final.js viene caricato dopo che il trigger scatta, quindi può essere modificato liberamente.pocs/rw_final.js, per i motivi sopra indicati.Questo repository è a scopo di ricerca educativa e difensiva. Il bug è corretto nel Chrome attuale; i dettagli sono pubblici nell'albero dei sorgenti di V8.