
استغلال إثبات المفهوم لـ CVE-2025-6554، وهي ثغرة في محرك V8 JavaScript تسمح بالوصول غير المصرح به إلى قيم 'Hole' غير المهيأة عبر الربط الاختياري، مما يتيح ارتباك النوع والتلاعب بالذاكرة.
CVE-2025-6554 هي ثغرة أمنية في مُفسِّر V8 (محرك JavaScript) في Chrome (فحص "Hole" 'تحكم غير كافٍ في متغيرات غير مقصودة ضمن تعبيرات مع الربط الاختياري). يستكشف 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).
لا ينبغي أن تكون القيمة المُرجَعة () في الكود قابلة للوصول لأن لا يزال في TDZ. لكن الفشل يسمح بذلك.
return yyالآلية التي تمنع الوصول إلى المتغيرات في TDZ هي ThrowReferenceErrorIfHole.
قبل التصحيح، تم استدعاء هذه الآلية مرة واحدة فقط أثناء delete x?.[y]?.
حدد V8 داخلياً أن المتغير y قد تم التحقق منه بالفعل على أنه "ليس Hole"، لكن هذا التحقق كان يفلت من النطاق المُتحكَّم به، وبالتالي لم يتم إعادة تقييمه أثناء return y.
يضيف التصحيح استدعاءً إلزامياً آخر لـ ThrowReferenceErrorIfHole عند return y، مما يضمن أن أي محاولة للوصول إلى y قبل تعريفه تطلق خطأ بشكل صحيح.
تم ضمان هذا التحقق بواسطة نطاق OptionalChainingNullLabelScope، الذي تم تضمينه في جميع استدعاءات OptionalChainingNullLabelScope.
delete x?.[y]? → محاولة الوصول إلى y (غير مهيأ) ← فشل التحقق من "Hole"
→ y يهرب كقيمة ← return y; ← التقاط قيمة "Hole" ← DebugPrint يكشف
المهاجم، عند التقاط هذا "Hole"، يمكنه استنتاج الحالة الداخلية لمحرك V8، مما يسهِّل هجمات مثل:
استغلال خلط الأنواع (Type Confusion)
التلاعب بالمكدس (Stack Manipulation)
التحايل على نطاق التحقق (Scope Check Circumvention)