FlawOpen

flawopen.com/Teardowns/cve-2024-27980-nodejs-windows-batch-injection

● CVE-2024-27980 · CVSS 8.1 · उच्च
सुरक्षा अनुसंधान · FlawOpen

CVE-2024-27980: Windows में Node.js

Windows पर shell विकल्प बंद होने पर भी batch फ़ाइल चलाते समय spawn() और spawnSync() से command injection संभव था।

💡 आसान भाषा में (ELI5)

मान लें कोई प्रोग्राम 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); दोनों सुधारों वाला संस्करण लगाएँ।

हमले का चरण-दर-चरण प्रवाह

चरण 1

ऐप process API बुलाता है

Windows पर ऐप child_process.spawn() या spawnSync() से .bat/.cmd फ़ाइल चलाता है; arguments बाहरी input से प्रभावित हो सकते हैं।

चरण 2

लक्ष्य batch फ़ाइल है

Batch फ़ाइलों पर shell के नियम लागू होते हैं; arguments की सूची metacharacters की व्याख्या अपने आप नहीं रोकती।

चरण 3

Windows arguments interpret करता है

कमज़ोर व्यवहार में shell: false होने पर भी argument command syntax बन सकता था।

चरण 4

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();
}

इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट

स्रोत