
CVE-2025-6554 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, एक V8 JavaScript इंजन भेद्यता जो ऑप्शनल चेनिंग के माध्यम से अप्रारंभीकृत 'Hole' मानों तक अनधिकृत पहुंच की अनुमति देती है, जिससे टाइप कन्फ्यूजन और मेमोरी मैनिपुलेशन संभव होता है।
CVE-2025-6554 क्रोम के V8 (इंजन JavaScript) इंटरप्रेटर में एक कमज़ोरी है, जो वैकल्पिक चेनिंग (optional chaining) वाले एक्सप्रेशन्स में अनावश्यक वेरिएबल्स के भीतर '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 - टेम्पोरल डेड ज़ोन वेरिएबल्स के लिए संतरी) कहा जाता है, को कैप्चर करने की अनुमति मिली।
कोड में स्टेटमेंट सुलभ नहीं होना चाहिए क्योंकि Y अभी भी TDZ में है। लेकिन विफलता इसे अनुमति देती है।
return y;TDZ में वेरिएबल्स तक पहुँच को रोकने वाला तंत्र ThrowReferenceErrorIfHole है।
पैच से पहले, इस तंत्र को केवल एक बार delete x?.[y]?.a के दौरान लागू किया गया था।
V8 ने आंतरिक रूप से चिह्नित कर दिया कि वेरिएबल Y पहले से ही "होल नहीं है" के रूप में सत्यापित हो चुका है, लेकिन यह सत्यापन नियंत्रित स्कोप से बाहर हो गया, और इसलिए return y; के दौरान इसका पुनर्मूल्यांकन नहीं किया गया।
पैच return y; पर ThrowReferenceErrorIfHole का एक और अनिवार्य कॉल जोड़ता है, यह सुनिश्चित करते हुए कि Y तक पहुँचने का कोई भी प्रयास सही ढंग से एक एरर उत्पन्न करे। यह सत्यापन OptionalChainNullLabelScope के स्कोप द्वारा गारंटीकृत किया गया था, जिसे OptionalChainNullLabelScope के सभी कॉल्स में शामिल किया गया।
delete x?.[y]?.a; → Y तक पहुँचने का प्रयास (आरंभिक नहीं) → "Hole" जाँच में विफलता
→ Y मान के रूप में बच निकलता है → return y; → "Hole" का मान कैप्चर करें → %DebugPrint प्रकट करता है
हमलावर, जब इस "Hole" को कैप्चर करता है, तो V8 इंजन की आंतरिक स्थिति के बारे में अनुमान लगा सकता है, जिससे निम्नलिखित हमलों में सुविधा होती है: