
PoC disponible próximamente
Una vulnerabilidad crítica de ejecución remota de código en Google Chrome (versiones 123 y anteriores) que afecta el manejo de tipos de recolección de basura (garbage collection) de WebAssembly (WASM). El fallo permite una confusión de tipos que puede escalarse a lectura/escritura arbitraria de memoria y, finalmente, a ejecución de código.
La vulnerabilidad se origina de una confusión entre los IDs de tipo canónico isorecursivos de WASM y las representaciones wasm::HeapType / wasm::ValueType utilizadas en las funciones de conversión de JavaScript a WASM.
Es importante destacar que un ID de tipo canónico no está ligado de ninguna manera a kV8MaxWasmTypes; puede crecer tanto como lo permita la memoria del host.
La clase ValueType codifica los tipos de heap en un campo de 20 bits, pero los IDs de tipo canónico pueden superar este límite. Cuando un ID de tipo canónico como el siguiente:
tn = t0 + 0x100000 * n
se trunca a 20 bits, se alía con t0, lo que permite un ataque de confusión de tipos.
Adicionalmente, los IDs de tipo canónico que coinciden con kAny + 0x100000 * n (donde kAny = 1000005) omiten las comprobaciones de tipo y permiten confusión arbitraria de tipos WASM.
El aviso describe la explotación en tres fases:
La elaboración de módulos WASM con más de 1.000.000 de tipos hace que los IDs de tipo canónico se desborden (wraparound), permitiendo confusión entre tipos de estructura y tipos de referencia. Los tipos de estructura diseñados para alienarse con kAny omiten las comprobaciones de tipos de JS a WASM.
Al modificar los campos de almacenamiento subyacente (backing store) de ArrayBuffer, el atacante obtiene una escritura en una dirección arbitraria donde el valor escrito es la dirección de los metadatos. Esto explota las estructuras SlotSpanMetadata para filtrar direcciones de chrome.dll y lograr escrituras arbitrarias de memoria.
El exploit secuestra la CodePointerTable y pivota la ejecución hacia una cadena ROP que marca como ejecutables las regiones de shellcode.
La PoC demuestra:
kAny para omitir las comprobaciones de tipos JS-WASM.Esta es una variante de CVE-2024-2887, descubierta por Manfred Paul y presentada en Pwn2Own Vancouver 2024. Explota una debilidad similar de canonización de tipos a través de un vector diferente.
Google Chrome 123 y anteriores.
Corregido en Google Chrome 124.
Seunghyun Lee (Xion, @0x10n), participante en TyphoonPWN 2024.