
@webfer/mcp-ansible-drupal में executeDeployment extraVars के माध्यम से OS कमांड इंजेक्शन के लिए PoC सहित CVE-2026-52618 का दस्तावेज़ीकरण करता है, साथ ही पहचान मार्गदर्शन और शमन उपाय भी प्रदान करता है।
executeDeployment extra vars के माध्यम से OS कमांड इंजेक्शनspawn(cmd[0], cmd.slice(1), { shell: true }) तर्क सरणी को बिना एस्केप किए एक ही /bin/sh -c स्ट्रिंग में पुनः जोड़ता है, इसलिए executeDeployment MCP टूल को आपूर्ति किए गए extraVars मान में मौजूद कोई भी शेल मेटाकैरेक्टर सर्वर चला रहे होस्ट पर निष्पादित हो जाता है।
यह समस्या ठीक कर दी गई है। 2.0.3 या उसके बाद के संस्करण में अपग्रेड करें।
MCP टूल तर्क हमलावर-प्रभावित होते हैं। वे एक LLM द्वारा एजेंट द्वारा संसाधित सामग्री — दस्तावेज़, वेब पेज, टूल आउटपुट — से उत्पन्न होते हैं, इसलिए अप्रत्यक्ष प्रॉम्प्ट इंजेक्शन हमलावर को उन मानों पर नियंत्रण दे देता है जो टूल हैंडलर प्राप्त करता है। जो हैंडलर उन मानों में से किसी को शेल में डालता है, वह उस प्रभाव को MCP सर्वर चला रहे होस्ट पर कोड निष्पादन में बदल देता है। यह वही मॉडल है जो पूर्व मामले aws-mcp-server / CVE-2026-5058 में था।
परिणाम यह है कि "कॉल करने वाला एक विश्वसनीय LLM है" कोई शमन नहीं है। टूल तर्क अविश्वसनीय इनपुट हैं।
2.0.0 में src/helpers/runAnsible.ts एक तर्क सरणी बनाता था और फिर उसे शेल सक्षम करके चलाता था:
const proc = spawn(ansibleCmd[0], ansibleCmd.slice(1), { shell: true });
shell: true के साथ Node ansibleCmd[0] को शेष तत्वों के साथ argv के रूप में निष्पादित नहीं करता। यह पूरी सरणी को एक स्ट्रिंग में जोड़कर /bin/sh -c को सौंप देता है, बिना तत्वों पर कोई कोटिंग या एस्केपिंग लागू किए। इसलिए ;, &&, |, बैकटिक या $() ले जाने वाला कोई भी तत्व इच्छित कमांड से बाहर निकल जाता है।
पहुँच योग्य मार्ग executeDeployment MCP टूल (src/tools/executeDeployment.ts) है, जो कॉलर द्वारा आपूर्ति किए गए extraVars को --extra-vars key=value के रूप में सरणी में अग्रेषित करता है। ; touch /tmp/marker ; का मान देता है:
/bin/sh -c "ansible-playbook -i inv.ini play.yml ... --extra-vars deploy_env=; touch /tmp/marker ; echo INJECTED"
उसी संस्करण में एक द्वितीयक सिंक ने projectRoot को execSync('ansible-vault encrypt ' + vaultPath) में इंटरपोलेट किया।
poc/driver.mjs एक निर्मित extraVars मान के साथ runAnsible को सीधे कॉल करता है और मार्कर फ़ाइल की जाँच करता है। ansible-playbook को स्थापित होने की आवश्यकता नहीं है — इंजेक्ट किया गया कमांड उसी /bin/sh -c स्ट्रिंग में चलता है, चाहे अग्रणी बाइनरी मिले या न मिले।
npm pack @webfer/[email protected] && tar xf webfer-mcp-ansible-drupal-2.0.0.tgz
node poc/driver.mjs
प्रभावित संस्करण पर अपेक्षित:
{"target":"@webfer/mcp-ansible-drupal 2.0.0","sink":"runAnsible -> spawn(cmd[0], cmd.slice(1), {shell:true})","vector":"executeDeployment extraVars value","marker":"/tmp/PWNED_ansible","created":true,"verdict":"CONFIRMED - command injection executed"}
2026-06-01 को एक पृथक कंटेनर में मान्य किया गया और 2026-06-13 को एक हानिरहित touch मार्कर के साथ पुनः मान्य किया गया। इसे केवल उन्हीं अवसंरचनाओं पर चलाएँ जिनके परीक्षण के लिए आप अधिकृत हैं।
--extra-vars मान जो ansible-playbook तक पहुँचता है और जिसमें ;, &&, ||, |, बैकटिक या $( हो। वैध Ansible वेरिएबल मान अनिवार्य रूप से ऐसा कभी नहीं करते।sh -c प्रक्रिया जिसकी कमांड लाइन में ansible-playbook और विभाजक के बाद एक दूसरा कमांड हो — एक प्रक्रिया-वृक्ष संकेत (auditd, eBPF, Falco, EDR) जो एप्लिकेशन लॉगिंग पर निर्भर नहीं करता।ansible-playbook, git और ansible-vault अपेक्षित हैं; शेल, इंटरप्रेटर या नेटवर्क क्लाइंट नहीं।executeDeployment तर्कों में शेल मेटाकैरेक्टर हों। टूल तर्कों को लॉग करें — अधिकांश MCP डिप्लॉयमेंट ऐसा नहीं करते, और एप्लिकेशन की दृष्टि से इंजेक्ट किया गया मान दिखने का यही एकमात्र स्थान है।MITRE ATT&CK T1059.004 Command and Scripting Interpreter: Unix Shell।
@webfer/mcp-ansible-drupal 2.0.3 या उसके बाद के संस्करण में अपग्रेड करें। वर्तमान स्रोत spawn(ansibleCmd[0], ansibleCmd.slice(1), { … }) को बिना shell विकल्प के कॉल करता है, इसलिए सरणी argv के रूप में पारित होती है और मेटाकैरेक्टर अपना अर्थ खो देते हैं।
MCP टूल हैंडलर के लिए सामान्य नियम, और यह फिक्स यहाँ वही लागू करता है:
shell: true कभी सक्षम न करें। सरणी रूप का अस्तित्व ही शेल से बचने के लिए है।execFile/spawn का उपयोग करें।z.string() यह सिद्ध करता है कि मान एक स्ट्रिंग है, लेकिन यह नहीं कि उसमें क्या है। जहाँ मान सेट ज्ञात हो वहाँ अनुमतिपत्र (allowlist) का उपयोग करें; जहाँ नहीं, वहाँ शेल मेटाकैरेक्टर अस्वीकार करें।NIST SP 800-53r5 SI-10; OWASP ASVS v4 §5.3.8; CWE-78 शमन M1 और M2।
| दिनांक | घटना |
|---|
aws-mcp-server)इसी शोध अभियान से जुड़ी सह-सलाहकार: CVE-2026-52616, CVE-2026-52617।
MIT — LICENSE देखें।
| CVE | CVE-2026-52618 |
| CWE | CWE-78 (OS कमांड में प्रयुक्त विशेष तत्वों का अनुचित न्यूट्रलाइज़ेशन) |
| पैकेज | @webfer/mcp-ansible-drupal (npm) |
| प्रभावित | 2.0.0 |
| स्थिर संस्करण | 2.0.3 (2026-06-01 को प्रकाशित) |
| CVSS v3.1 | AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H = 7.8 उच्च (stdio ट्रांसपोर्ट)। AV:N → 9.8 गंभीर यदि सर्वर नेटवर्क ट्रांसपोर्ट में लपेटा गया हो। |
| रिपोर्टकर्ता | s1ko (github.com/s1ko, [email protected]) |
| CVE आवंटन | 2026-07-13, MITRE CNA-LR |
| 2026-06-01 | 2.0.0 के विरुद्ध भेद्यता की गतिशील रूप से पुष्टि की गई |
| 2026-06-01 | shell: true हटाकर 2.0.3 npm पर प्रकाशित किया गया |
| 2026-06-13 | दूसरे होस्ट पर पुनः मान्य किया गया |
| 2026-07-13 | MITRE CNA-LR ने CVE-2026-52618 आवंटित किया, s1ko को खोजकर्ता के रूप में श्रेय दिया गया |
| 2026-08-22 | यह लेख प्रकाशित किया गया |