
Эксплойт для проверки концепции для CVE-2025-6554, уязвимость движка V8 JavaScript, позволяющая несанкционированный доступ к неинициализированным значениям 'Hole' через опциональную цепочку, что приводит к путанице типов и манипуляции памятью.
CVE-2025-6554 — это уязвимость в интерпретаторе V8 (движок JavaScript) браузера Chrome, связанная с неадекватной проверкой "дыр" (Hole Check) в непредназначенных переменных внутри выражений с опциональной цепочкой (optional chaining). POC (CVE-2025-6554-POC.JS) исследует недостаток механизма проверки "дыр" (Hole) в переменных перед их использованием, что позволяет читать неинициализированные значения — поведение, обычно блокируемое ссылочной ошибкой.
function leak_hole() {
let x;
delete x?.[y]?.a;
return y;
let y;
}
function pwn() {
let hole = leak_hole();
%DebugPrint(hole);
}
pwn();
let x; и let y; объявляют переменные локальной области видимости.
Строка delete x?.[y]?.a использует опциональную цепочку для безопасного доступа к вложенному свойству.
Проблема: переменная y используется до её объявления, что должно вызывать ссылочную ошибку, но в предварительной версии V8 это происходило молча, позволяя захватить специальное значение, называемое "The Hole" (страж для переменных в TDZ — временной мёртвой зоне).
Оператор return y; в коде не должен быть доступен, так как y всё ещё находится в TDZ. Но сбой позволяет это.
Механизм, предотвращающий доступ к переменным в TDZ, — это ThrowReferenceErrorIfHole.
До патча этот механизм вызывался только один раз во время delete x?.[y]?.
V8 внутренне отмечал, что переменная y уже была проверена как "не являющаяся дырой", но эта проверка выходила за пределы контролируемой области, и поэтому не переоценивалась во время return y.
Патч добавляет ещё один обязательный вызов ThrowReferenceErrorIfHole при return y, гарантируя, что любая попытка доступа к y до её объявления корректно вызовет ошибку.
Эта проверка была обеспечена областью видимости OilpanCheckEtscope, которая была включена во все вызовы OptionalChainNullLabelScope.
delete x?.[y]?. → Попытка доступа к y (неинициализирован) → Сбой проверки "Hole"
→ y утекает как значение → return y; → Захват значения "Hole" → DebugPrint раскрывает
Атакующий, захватывая это значение "Hole", может сделать выводы о внутреннем состоянии движка V8, что облегчает такие атаки, как:
Путаница типов (Type Confusion)
Манипуляция стеком (Stack Manipulation)
Обход проверок области видимости (Scope Check Circumvention)