
Exploit proof-of-concept per CVE-2025-6554, una vulnerabilità del motore JavaScript V8 che consente l'accesso non autorizzato a valori 'Hole' non inizializzati tramite optional chaining, provocando confusione di tipo e manipolazione della memoria.
CVE-2025-6554 è una vulnerabilità nell'interprete V8 (Engine JavaScript) di Chrome (Hole Check 'controllo inadeguato in variabili non intenzionali all'interno di espressioni con optional chaining). Il POC (CVE-2025-6554-POC.JS) esplora un difetto nel meccanismo di verifica del "Hole" nelle variabili prima dell'uso, consentendo la lettura di valori non inizializzati — un comportamento normalmente bloccato da un riferimento.
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; dichiarano variabili nell'ambito locale.
La riga delete x?.[y]?.a utilizza optional chaining per accedere in modo sicuro a una proprietà annidata.
Problema: la variabile y viene utilizzata prima della sua dichiarazione, il che dovrebbe generare un errore di riferimento, ma nelle versioni precedenti di V8 questo falliva silenziosamente, permettendo di catturare il valore speciale chiamato "The Hole" (segnaposto per variabili in TDZ — Temporal Dead Zone).
Il valore di ritorno () nel codice non dovrebbe essere accessibile perché è ancora in TDZ. Ma il fallimento lo consente.
return yyIl meccanismo che impedisce l'accesso a variabili in TDZ è ThrowReferenceErrorIfHole.
Prima della patch, questo meccanismo veniva invocato una sola volta durante delete x?.[y]?.
V8 internamente marcava che la variabile y era già stata verificata come "non essere un hole", ma questa verifica sfuggiva dall'ambito controllato, e quindi non veniva rivalutata durante return y.
La patch aggiunge un'altra chiamata obbligatoria a ThrowReferenceErrorIfHole su return y, assicurando che qualsiasi tentativo di accedere a y prima della dichiarazione generi correttamente un errore.
Questa verifica è stata garantita dallo scope OilCheckEtscope, che è stato incluso in tutte le chiamate a OptionalChainNullLabelScope.
```Js
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
L'attaccante, catturando questo "Hole", può inferire sullo stato interno del motore V8, facilitando attacchi come: