
Exploit de prova de conceito para CVE-2025-6554, uma vulnerabilidade no motor JavaScript V8 que permite acesso não autorizado a valores 'Hole' não inicializados via encadeamento opcional, possibilitando confusão de tipos e manipulação de memória.
CVE-2025-6554 é uma vulnerabilidade no interpretador V8 (Engine JavaScript) do Chrome (Hole Check 'controle inadequado em variáveis não intencionais dentro de expressões com encadeamento opcional. O POC (CVE-2025-6554-POC.JS) explora uma falha no mecanismo de verificação "Hole" em variáveis antes do uso, permitindo a leitura de valores não inicializados - comportamento que normalmente é bloqueado por uma referência.
function leak_hole() {
let x;
delete x?.[y]?.a;
return y;
let y;
}
function pwn() {
let hole = leak_hole();
%DebugPrint(hole);
}
pwn();
let x; e let y; declaram variáveis de escopo local.
A linha delete x?.[y]?.a usa encadeamento opcional para acessar uma propriedade aninhada com segurança.
Problema: A variável Y é usada antes de ser declarada, o que deveria lançar um erro de referência, mas no V8 sem a correção, isso falhava silenciosamente, permitindo capturar o valor especial chamado "The Hole" (sentinel para variáveis em TDZ - Zona Morta Temporal).
O valor de retorno () no código não deveria ser acessível porque Y ainda está em TDZ. Mas a falha permite.
return yO mecanismo que evita o acesso a variáveis em TDZ é ThrowReferenceErrorIfHole.
Antes da correção, esse mecanismo era invocado apenas uma vez durante delete x?.[y]?.
O V8 internamente marcava que a variável Y já havia sido verificada como "não sendo um hole", mas essa verificação escapava do escopo controlado e, portanto, não era reavaliada durante o return y.
A correção adiciona outra chamada obrigatória para ThrowReferenceErrorIfHole no return y, garantindo que qualquer tentativa de acessar Y antes da declaração dispare corretamente um erro.
Essa verificação foi garantida pelo escopo oilchecketscope, que foi incluído em todas as chamadas para optionalchainnulllabelscope.
Delete x?. [Y]?. → Try to access Y (not initialized) → Failure to check "Hole"
→ Y escapes as value → return y; → Capture the value of "Hole" → Debugprint reveals
O atacante, ao capturar esse "Hole", pode inferir sobre o estado interno do Engine V8, facilitando ataques como:
Confusão de Exploração de Tipo
Manipulação de Pilha
Circunstância de verificação de escopo