
Análisis de causa raíz y exploit funcional para CVE-2026-78938, una confusión de tipos en V8 TurboFan que conduce a lectura/escritura arbitraria dentro del heap comprimido. Incluye PoC de crash y primitivas direccionadas en tiempo de ejecución.
Análisis de causa raíz y exploit para CVE-2026-78938, una confusión de tipos en la eliminación de cargas de TurboFan en V8 que se corrigió en Chrome 152.0.7977.64 (V8 15.2.124.18). El fallo se reportó como explotado en estado salvaje.
El exploit convierte el fallo en un Float64Array fuera de límites y desde ahí
en addrof / fakeobj y lectura/escritura arbitraria sobre el heap comprimido de V8.
Todo lo posterior a la escritura inicial se localiza en tiempo de ejecución; no hay
desplazamientos de heap codificados en la etapa de R/W.
50597b0bb48a — "[compiler] Invalidate tracked fields on
CheckMaps with instance migration"Probado en macOS arm64 contra un d8 compilado localmente de ambas versiones.
| archivo | qué es |
|---|
pocs/crash.js | Disparador mínimo. SIGBUS en la compilación vulnerable, salida limpia en la corregida. |
pocs/rw_final.js | Exploit completo, etapa 1: disparador + array OOB. Congelado — ver "Reproducción" abajo. |
pocs/logic_final.js | Exploit completo, etapa 2: addrof/fakeobj/R\W arbitraria, cargado en tiempo de ejecución por la etapa 1. |
WRITEUP.md | Análisis completo de causa raíz y notas de explotación. |
Compila las dos versiones de d8 (consulta WRITEUP.md para los commits exactos y los argumentos de GN),
luego desde la raíz del repositorio:
# PoC de crash: SIGBUS en vulnerable, limpio en corregido
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 en vulnerable, aborta limpiamente en corregido
out/vuln/d8 --allow-natives-syntax --homomorphic-ic --max-valid-polymorphic-map-count=4 pocs/rw_final.js
Salida esperada en la compilación vulnerable:
[+] OOB Float64Array len=0x7f000004
[+] after write: victim2.z = 2.5
[+] fakeobj(hn|1) typeof=number
[+] ALL PRIMITIVES VERIFIED
Dos cosas importan:
--homomorphic-ic --max-valid-polymorphic-map-count=4 dan forma a la retroalimentación de mapas polimórficos para que
se tome la ruta de migración en código optimizado. Sin ellas, el disparador
no hace nada silenciosamente.pocs/rw_final.js está congelado por bytes. La única escritura corruptora aterriza en
un desplazamiento relativo al heap que depende de dónde se asigna el array víctima,
lo que a su vez depende de los bytes exactos y la ruta del script. Editar el archivo
(o renombrarlo) invalida el desplazamiento incorporado; WRITEUP.md documenta cómo
recalibrarlo. pocs/logic_final.js se carga después de que se dispara el trigger, por lo que
puede editarse libremente.pocs/rw_final.js, por las razones
anteriores.Este repositorio es con fines educativos y de investigación defensiva. El fallo está corregido en Chrome actual; los detalles son públicos en el árbol de fuentes de V8.