
Notepad++ v8.9.6.2 — HMAC रेस कंडीशन के माध्यम से हमलावर-नियंत्रित UserCommand निष्पादन
| GHSA | GHSA-qm4c-qg8p-qfcr |
| CVE | CVE-2026-52885 |
| गंभीरता | उच्च |
| प्रभावित | v8.9.6.2 |
| पैच किया गया | v8.9.6.4 |
| पैच कमिट | 4f7563c |
| प्रभावित फ़ाइल | PowerEditor/src/NppCommands.cpp :4328–4359 |
| प्लेटफ़ॉर्म | Windows 11 Pro x64 |
| आवश्यक विशेषाधिकार | सामान्य उपयोगकर्ता (shortcuts.xml तक लेखन पहुंच) |
| शोधकर्ता | v3s9er |
| खुलासा | 2026-06-05 |
Notepad++ v8.9.6.2 ने shortcuts.xml पर HMAC-SHA256 अखंडता जाँच शुरू की ताकि मनमानी UserCommand प्रविष्टियों के इंजेक्शन को रोका जा सके।
जाँच में TOCTOU दोष है: HMAC को ट्रिगर समय पर डिस्क पर मौजूद फ़ाइल के विरुद्ध सत्यापित किया जाता है, लेकिन जो कमांड निष्पादित होती है वह स्टार्टअप पर लोड किए गए इन-मेमोरी _userCommands वेक्टर से पढ़ी जाती है। ये दोनों स्रोत कभी पुनः-सिंक्रनाइज़ नहीं होते।
जो हमलावर shortcuts.xml में लिख सकता है, वह लॉन्च से पहले एक दुर्भावनापूर्ण कमांड रख सकता है, Notepad++ को उसे मेमोरी में लोड करने देता है, डिस्क पर वैध फ़ाइल को पुनर्स्थापित करता है, फिर कमांड ट्रिगर करता है। HMAC जाँच पास हो जाती है (डिस्क साफ है), लेकिन दुर्भावनापूर्ण पेलोड निष्पादित हो जाता है (मेमोरी पुरानी है)।
अखंडता तंत्र वर्तमान ऑन-डिस्क shortcuts.xml को मान्य करता है, जबकि कमांड निष्पादन पहले लोड किए गए इन-मेमोरी प्रतिनिधित्व का उपयोग करता है। क्योंकि दोनों डेटा स्रोत स्वतंत्र हैं, एक हमलावर स्टार्टअप से पहले फ़ाइल को बदल सकता है, उसे मेमोरी में पार्स होने देता है, फिर कमांड निष्पादन से पहले मूल फ़ाइल को पुनर्स्थापित कर देता है — जिससे HMAC जाँच पास हो जाती है जबकि दुर्भावनापूर्ण पेलोड चलता है।
NppCommands.cpp पंक्तियाँ 4328–4359:
// TIME OF CHECK — reads on-disk file
std::string currentHMAC = computeHMAC(
getMachineGUID(),
getFileContent(nppParams.getShortcutsPath().c_str())
);
if (currentHMAC != nppGUI._shortcutsXmlHmacInConfig) { return; }
// validated against DISK
// TIME OF USE — reads in-memory vector (loaded at startup, never refreshed)
int i = id - ID_USER_CMD;
const vector<UserCommand>& cmds = nppParams.getUserCommandList();
UserCommand ucmd = cmds[i];
Command cmd(string2wstring(ucmd.getCmd(), CP_UTF8));
cmd.run(_pPublicInterface->getHSelf()); // executes payload from MEMORY
| ऑपरेशन | स्रोत | समय |
|---|---|---|
| जाँच (HMAC) | डिस्क फ़ाइल | ट्रिगर समय पर |
| उपयोग (exec) | मेमोरी वेक्टर | स्टार्टअप पर लोड हुआ |
| अंतराल | हमलावर-नियंत्रित | स्टार्टअप → ट्रिगर |
पूर्व-शर्त: shortcuts.xml तक लेखन पहुंच
notepad++.exe के समान निर्देशिका%AppData%\Notepad++\चरण:
shortcuts.xml को दुर्भावनापूर्ण संस्करण से अधिलेखित करें (cmd = calc.exe)_userCommands दुर्भावनापूर्ण फ़ाइल से भर जाता हैshortcuts.xml को डिस्क पर पुनर्स्थापित करें — HMAC अब config.xml से मेल खाता हैWM_COMMAND(21000) (ID_USER_CMD+0) भेजें या Ctrl+Alt+P दबाएँ_userCommands[0] पढ़ता है → calc.exe चलता हैपरिणाम: वर्तमान उपयोगकर्ता के विशेषाधिकारों के अंतर्गत हमलावर-नियंत्रित कमांड का निष्पादन। कोई एडमिन नहीं, कोई UAC नहीं, कोई उपयोगकर्ता चेतावनी नहीं।
देखें poc_8962_toctou.ps1।
आवश्यकताएँ:
doLocalConf.xml मौजूद हो (पोर्टेबल मोड)config.xml में वैध shortcuts.xml के लिए मान्य HMAC हो.\poc_8962_toctou.ps1 -NppPath "C:\path\to\notepad++.exe"
सत्यापित: calc.exe स्पॉन हुआ (PID 35932), पूरे समय डिस्क वैध shortcuts.xml दिखाती है।
फिक्स (कमिट 4f7563c) HMAC सत्यापन को स्टार्टअप पर, प्रारंभिक फ़ाइल पार्स के साथ स्थानांतरित कर देता है। Check और Use अब एक ही समय में एक ही ऑब्जेक्ट पर कार्य करते हैं, जिससे TOCTOU विंडो समाप्त हो जाती है।
| v8.9.6.2 (असुरक्षित) | v8.9.6.4 (पैच किया गया) | |
|---|---|---|
| HMAC जाँच | ट्रिगर समय पर, डिस्क को फिर से पढ़ती है | स्टार्टअप पर, पार्स के समान बाइट्स |
| कमांड स्रोत | स्टार्टअप पर लोड की गई मेमोरी | स्टार्टअप पर मान्य की गई मेमोरी |
| TOCTOU विंडो | स्टार्टअप → ट्रिगर |
| समय | घटना | स्थिति |
|---|
| T+0.0s | हमलावर दुर्भावनापूर्ण shortcuts.xml लिखता है | disk=MALICIOUS |
| T+0.0s | हमलावर Notepad++ लॉन्च करता है | disk=MALICIOUS |
| T+0.1s | Notepad++ shortcuts.xml पढ़ता है → _userCommands[0]="calc.exe" | mem=MALICIOUS |
| T+4.2s | Notepad++ पूरी तरह लोड हो गया | mem=MALICIOUS |
| T+4.2s | हमलावर वैध shortcuts.xml पुनर्स्थापित करता है | disk=LEGIT / mem=MAL |
| T+4.7s | हमलावर WM_COMMAND(21000) भेजता है | |
| T+4.7s | HMAC जाँच: डिस्क से वैध फ़ाइल पढ़ती है → पास | CHECK OK |
| T+4.7s | निष्पादन: मेमोरी से _userCommands[0] पढ़ता है → calc.exe | EXPLOIT |
| T+4.7s | calc.exe स्पॉन हुआ (PID 35932) | CONFIRMED |
| प्रकार | मनमाना कमांड निष्पादन |
| एडमिन आवश्यक | नहीं |
| UAC संकेत | नहीं |
| पता लगाने की क्षमता | कम — डिस्क पूरे समय वैध फ़ाइल दिखाती है; पेलोड केवल मेमोरी में है |
| CVSS (अनुमानित) | AV:L / AC:H / PR:L / UI:N / S:U / C:H / I:H / A:H |
| समाप्त |