
Análise de causa raiz e exploit funcional para CVE-2026-78938, uma confusão de tipos no V8 TurboFan que leva a leitura/escrita arbitrária dentro do heap compactado. Inclui PoC de crash e primitivas endereçadas em tempo de execução.
Análise de causa-raiz e exploit para CVE-2026-78938, uma confusão de tipos na eliminação de cargas do TurboFan do V8 que foi corrigida no Chrome 152.0.7977.64 (V8 15.2.124.18). O bug foi reportado como explorado ativamente na natureza.
O exploit transforma o bug em um Float64Array fora dos limites e, a partir daí,
em addrof / fakeobj e leitura/escrita arbitrária sobre o heap compactado do V8.
Tudo após a escrita inicial é localizado em tempo de execução — não há
offsets de heap codificados no estágio de R/W.
50597b0bb48a — "[compiler] Invalidate tracked fields on
CheckMaps with instance migration"Testado em macOS arm64 contra um d8 compilado localmente de ambas as versões.
| arquivo | o que é |
|---|
pocs/crash.js | Gatilho mínimo. SIGBUS na build vulnerável, saída limpa na corrigida. |
pocs/rw_final.js | Exploit completo, estágio 1: gatilho + array OOB. Congelado — veja "Reproduzindo" abaixo. |
pocs/logic_final.js | Exploit completo, estágio 2: addrof/fakeobj/R\W arbitrário, carregado em tempo de execução pelo estágio 1. |
WRITEUP.md | Análise completa de causa-raiz e notas de exploração. |
Compile as duas versões do d8 (veja WRITEUP.md para os commits exatos e argumentos GN),
depois, a partir da raiz do repositório:
# PoC de crash: SIGBUS na vulnerável, limpo na corrigida
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: funciona na vulnerável, aborta limpo na corrigida
out/vuln/d8 --allow-natives-syntax --homomorphic-ic --max-valid-polymorphic-map-count=4 pocs/rw_final.js
Saída esperada na build vulnerável:
[+] OOB Float64Array len=0x7f000004
[+] after write: victim2.z = 2.5
[+] fakeobj(hn|1) typeof=number
[+] ALL PRIMITIVES VERIFIED
Duas coisas importam:
--homomorphic-ic --max-valid-polymorphic-map-count=4 moldam o feedback de mapas polimórficos para que
o caminho de migração seja percorrido no código otimizado. Sem elas, o gatilho
silenciosamente não faz nada.pocs/rw_final.js está congelado em bytes. A única escrita corruptora cai em um
offset relativo ao heap que depende de onde o array vítima é alocado,
que por sua vez depende dos bytes exatos e do caminho do script. Editar o arquivo
(ou renomeá-lo) invalida o offset embutido; WRITEUP.md documenta como
recalibrar. pocs/logic_final.js é carregado após o gatilho disparar, então
pode ser editado livremente.pocs/rw_final.js, pelas razões
acima.Este repositório é para fins educacionais e de pesquisa defensiva. O bug está corrigido no Chrome atual; os detalhes são públicos na árvore de fontes do V8.