
Proof-of-Concept-Exploit für CVE-2025-6554, eine Sicherheitslücke in der V8-JavaScript-Engine, die unbefugten Zugriff auf nicht initialisierte 'Hole'-Werte über optionales Chaining ermöglicht, was Typverwirrung und Speichermanipulation ermöglicht.
CVE-2025-6554 ist eine Schwachstelle in Chromes V8 (JavaScript-Engine)-Interpreter (Hole-Check 'unzureichende Kontrolle in unbeabsichtigten Variablen in Ausdrücken mit optionaler Verkettung). POC (CVE-2025-6554-POC.JS) untersucht einen Fehler im "Hole"-Verifikationsmechanismus in Variablen vor der Verwendung, der das Lesen nicht initialisierter Werte ermöglicht – ein Verhalten, das normalerweise durch eine Referenz blockiert wird.
function leak_hole() {
let x;
delete x?.[y]?.a;
return y;
let y;
}
function pwn() {
let hole = leak_hole();
%DebugPrint(hole);
}
pwn();
let x; und let y; deklarieren Variablen im lokalen Gültigkeitsbereich.
Die delete x?.[y]?. Zeile verwendet optionale Verkettung, um sicher auf eine verschachtelte Eigenschaft zuzugreifen.
Problem: Variable y wird verwendet, bevor sie deklariert wurde, was einen Referenzfehler auslösen sollte, aber in der V8-Vorabversion schlug dies still fehl, sodass der spezielle Wert "The Hole" (Sentinel für TDZ-Variablen – Temporal Dead Zone) erfasst werden konnte.
Der Rückgabewert (return y) im Code sollte nicht zugänglich sein, da y sich noch im TDZ befindet. Der Fehler ermöglicht es jedoch.
Der Mechanismus, der den Zugriff auf Variablen im TDZ verhindert, ist ThrowReferenceErrorIfHole.
Vor dem Patch wurde dieser Mechanismus nur einmal während delete x?.[y]?. aufgerufen.
V8 intern markierte, dass die Variable y bereits als "kein Hole" verifiziert worden sei, aber diese Verifikation entzog sich dem kontrollierten Gültigkeitsbereich und wurde daher bei return y nicht erneut ausgewertet.
Der Patch fügt einen weiteren obligatorischen Aufruf von ThrowReferenceErrorIfHole bei return y hinzu, um sicherzustellen, dass jeder Versuch, auf y vor der Deklaration zuzugreifen, korrekt einen Fehler auslöst.
Diese Verifikation wurde durch den Scope‑Check OilpanCheckEscapeScope gewährleistet, der in alle Aufrufe von OptionalChainNullLabelScope aufgenommen wurde.
delete x?.[y]?. → Versuche, auf y zuzugreifen (nicht initialisiert) → Fehlschlag des "Hole"-Checks
→ y entkommt als Wert → return y; → Erfasse den "Hole"-Wert → DebugPrint enthüllt ihn
Der Angreifer kann durch das Erfassen dieses "Hole" Rückschlüsse auf den internen Zustand der V8-Engine ziehen, was Angriffe wie die folgenden erleichtert: