flawopen.com/Teardowns/cve-2024-27980-nodejs-windows-batch-injection
CVE-2024-27980: Windows में Node.js
Windows पर shell विकल्प बंद होने पर भी batch फ़ाइल चलाते समय spawn() और spawnSync() से command injection संभव था।
मान लें कोई प्रोग्राम batch फ़ाइल को arguments देता है, लेकिन Windows उसे command interpreter के ज़रिए चलाता है। interpreter arguments को command syntax समझ सकता है। Node.js ने हर argument को सुरक्षित रूप से escape करने का अनुमान लगाने के बजाय batch फ़ाइल का सीधा execution रोककर इसे ठीक किया।
इस पेज के मुख्य शब्द
child_process.spawn()- Executable और arguments की सूची देकर process शुरू करने वाला Node.js asynchronous API.
Batch फ़ाइल- Windows shell द्वारा interpret की जाने वाली .bat या .cmd फ़ाइल; यह सामान्य executable जैसी सार्वभौमिक argv parsing नहीं करती।
Shell metacharacter- ऐसा character जिसका अर्थ command interpreter पर निर्भर होता है और जो command structure बदल सकता है।
EINVAL- Batch फ़ाइल के असुरक्षित direct execution को रोकते समय Node.js का error code.
फ्रेमवर्क मैपिंग
- इस गाइड में बताई गई कमजोरी के लिए CWE संदर्भ: CWE-77
मूल कारण विश्लेषण (Root Cause)
Windows पर .bat और .cmd फ़ाइलें shell द्वारा interpret होती हैं; arguments को हमेशा अस्पष्टता-रहित तरीके से escape नहीं किया जा सकता। Node.js advisory के अनुसार, shell सक्षम न होने पर भी child_process.spawn() और spawnSync() में दुर्भावनापूर्ण command-line argument commands inject कर सकता था। upstream patch case की परवाह किए बिना .bat या .cmd पर समाप्त फ़ाइल पहचानता है और uv_spawn() से पहले EINVAL लौटाता है। यह patch sanitizeBatchArg() लागू नहीं करता और न ही shell: true को सुरक्षित साबित करता है। बाद की advisory ने अन्य batch extensions के लिए अधूरे सुधार की पहचान की (CVE-2024-36138); दोनों सुधारों वाला संस्करण लगाएँ।
हमले का चरण-दर-चरण प्रवाह
ऐप process API बुलाता है
Windows पर ऐप child_process.spawn() या spawnSync() से .bat/.cmd फ़ाइल चलाता है; arguments बाहरी input से प्रभावित हो सकते हैं।
लक्ष्य batch फ़ाइल है
Batch फ़ाइलों पर shell के नियम लागू होते हैं; arguments की सूची metacharacters की व्याख्या अपने आप नहीं रोकती।
Windows arguments interpret करता है
कमज़ोर व्यवहार में shell: false होने पर भी argument command syntax बन सकता था।
Node.js सीधा execution रोकता है
Patch सीधे .bat/.cmd execution पर EINVAL देता है। CVE-2024-36138 ने अन्य extensions में बची कमी दिखाई; दोनों fixes वाले संस्करण पर जाएँ।
सोर्स कोड: कमज़ोर बनाम सुरक्षित कार्यान्वयन
// सुरक्षा patch से पहले src/process_wrap.cc का अंश
node::Utf8Value file(env->isolate(), file_v);
options.file = *file;
// batch files को अस्वीकार किए बिना filename uv_spawn() को दिया जाता था।
// CVE-2024-27980 के upstream patch का अंश
node::Utf8Value file(env->isolate(), file_v);
options.file = *file;
// batch arguments को हमेशा स्पष्ट रूप से escape नहीं किया जा सकता।
if (IsWindowsBatchFile(options.file))
err = UV_EINVAL;
if (err == 0) {
err = uv_spawn(env->event_loop(), &wrap->process_, &options);
wrap->MarkAsInitialized();
}
इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट
- ✓Node.js के समर्थित संस्करण में अपडेट करें जिसमें
CVE-2024-27980औरCVE-2024-36138दोनों के fixes हों। - ✓बाहरी input के साथ batch scripts न चलाएँ; validated arguments के साथ executable को सीधे invoke करें।
- ✓Shell अनिवार्य हो तो shell: true को command execution मानें और strict validation तथा authorization लागू करें।
- ✓Windows regression tests में
spawn(),spawnSync()और batch extensions जाँचें तथा EINVAL से सुरक्षित rejection सत्यापित करें।