Do JavaScript à execução de código no renderer: três vulnerabilidades no V8 e duas flags do v8CTF

Usando a ferramenta dfs-large1, pesquisadores descobriram três vulnerabilidades no V8: duas vulnerabilidades de corrupção de memória e uma fuga do sandbox. Elas foram combinadas em duas cadeias de exploração separadas, cada uma alcançando execução de código no processo renderer do Chrome.
1. CVE-2026-78938 — uma vulnerabilidade de confusão de tipos em Promise.prototype.finally. As funções auxiliares internas não eram estritas e podiam ser construídas. Usar .caller tornou possível obter uma referência a uma dessas funções, enquanto invocá-la com new podia retornar um número. O TurboFan assumia que o resultado de new era sempre um objeto e eliminava a verificação. Isso permitiu que bits inteiros controlados pelo atacante fossem interpretados como um ponteiro em código otimizado. 2. CVE-2026-79236 — um bug de eliminação de carregamento no TurboFan. O otimizador manteve um ponteiro para o array de propriedades antigo depois que o objeto migrou e seu armazenamento de propriedades foi substituído. Uma escrita subsequente usou o ponteiro obsoleto, resultando em uma escrita de memória controlada. 3. Fuga do sandbox, issue 546253900 — uma vulnerabilidade envolvendo memória WebAssembly compartilhada. O backing store registrado não correspondia ao que foi realmente passado para o worker: backing store A, enquanto o backing store B foi registrado globalmente. Quando o worker terminou, a rotina de limpeza falhou em remover a referência ao seu Isolate nativo do backing store A, deixando um ponteiro pendente. Uma chamada subsequente a memory.grow(0) acionou um use-after-free nativo fora do sandbox do V8.
Caminho de ataque • Ambas as vulnerabilidades de corrupção de memória foram inicialmente usadas para obter acesso controlado à memória dentro da cage de compressão de ponteiros, que então foi usada para construir as primitivas padrão addrof e fakeobj. • Para acessar memória mapeada em outro lugar no sandbox, objetos DataView genuínos foram localizados e seus ponteiros de dados sandboxed foram redirecionados. • Após escapar do sandbox, o Isolate liberado foi recuperado com uma mensagem WebSocket carregando um payload do tamanho apropriado. O endereço da mensagem foi verificado antes que o ponteiro pendente fosse desreferenciado. • O exploit então seguiu uma cadeia de callbacks compatível com integridade de fluxo de controle (CFI), pivotou a pilha para uma cadeia ROP e alcançou execução de código no processo renderer.
Pesquisadores
Fornecedor
Produto
Mais