CVE-2025-6554 是 Chrome 的 V8(JavaScript 引擎)解释器中的一个漏洞(Hole Check:对可选链表达式中的意外变量控制不足)。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 中变量的机制是 ThrowReferenceerrofhole。
在补丁之前,该机制仅在 delete x?.[y]?.a 期间被调用一次。
V8 在内部将变量 y 标记为已经过“非 hole”验证,但该验证逸出了受控作用域,因此在 return y; 时不会被重新评估。
该补丁在 return y; 上增加了另一个强制性的 ThrowReferenceerrorifhole 调用,确保在语句执行前任何访问 y 的尝试都会正确触发错误。
此验证由作用域 oilchecketscope 保证,该作用域包含在对 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
攻击者在捕获这个“Hole”后,可以推断 V8 引擎的内部状态,从而有助于以下攻击: