
POC disponível em breve
Uma vulnerabilidade crítica de execução remota de código no Google Chrome (versões 123 e anteriores) que afeta o tratamento de tipos de coleta de lixo (garbage collection) do WebAssembly (WASM). O bug permite confusão de tipos (type confusion), que pode ser escalada para leitura/escrita arbitrária de memória e, por fim, execução de código.
A vulnerabilidade decorre da confusão entre os IDs de tipo canônicos isorrecursivos do WASM e as representações wasm::HeapType / wasm::ValueType usadas nas funções de conversão de JavaScript para WASM.
Criticamente, um ID de tipo canônico não está vinculado a kV8MaxWasmTypes de forma alguma — ele pode crescer tanto quanto a memória do host permitir.
A classe ValueType codifica tipos de heap em um campo de 20 bits, mas IDs de tipo canônicos podem exceder esse limite. Quando um ID de tipo canônico como:
tn = t0 + 0x100000 * n
é truncado para 20 bits, ele se torna um alias com t0, permitindo um ataque de confusão de tipos.
Além disso, IDs de tipo canônicos que correspondem a kAny + 0x100000 * n (onde kAny = 1000005) contornam as verificações de tipo e permitem confusão arbitrária de tipos no WASM.
O aviso descreve a exploração em três fases:
A criação de módulos WASM com mais de 1.000.000 de tipos faz com que os IDs de tipo canônicos sofram wraparound, permitindo confusão entre tipos de struct e tipos de referência. Tipos de struct criados para fazer alias com kAny contornam as verificações de tipo de JS para WASM.
Ao modificar os campos de backing store do ArrayBuffer, o atacante obtém uma escrita em endereço arbitrário onde o valor escrito é o endereço dos metadados. Isso explora estruturas SlotSpanMetadata para vazar endereços de chrome.dll e conseguir escritas arbitrárias de memória.
O exploit sequestra o CodePointerTable e redireciona a execução para uma cadeia de ROP que marca regiões de shellcode como executáveis.
O PoC demonstra:
kAny para contornar as verificações de tipo de JS para WASM.Esta é uma variante do CVE-2024-2887, descoberto por Manfred Paul e apresentado no Pwn2Own Vancouver 2024. Ela explora uma fraqueza semelhante de canonicalização de tipos por meio de um vetor diferente.
Google Chrome 123 e anteriores.
Corrigido no Google Chrome 124.
Seunghyun Lee (Xion, @0x10n), participante do TyphoonPWN 2024.