
@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 मान में मौजूद कोई भी शेल मेटाकैरेक्टर सर्वर चलाने वाले होस्ट पर निष्पादित हो जाता है।
| 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 = 8.4 उच्च (stdio ट्रांसपोर्ट)। यदि सर्वर को नेटवर्क ट्रांसपोर्ट में लपेटा जाए तो AV:N → 9.8 क्रिटिकल। |
| रिपोर्ट करने वाला | s1ko (github.com/s1ko, [email protected]) |
| CVE आवंटित | 2026-07-13, MITRE CNA-LR |
यह समस्या ठीक कर दी गई है। 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 के रूप में निष्पादित नहीं करता है। यह पूरे array को एक स्ट्रिंग में जोड़ता है और उसे /bin/sh -c को सौंपता है, तत्वों पर कोई quoting या escaping लागू किए बिना। इसलिए ;, &&, |, backticks या $() वाला कोई भी तत्व इच्छित कमांड से बाहर निकल जाता है।
पहुँचने योग्य पथ executeDeployment MCP टूल (src/tools/executeDeployment.ts) है, जो कॉलर द्वारा दिए गए extraVars को array में --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 मार्कर के साथ पुनः मान्य किया गया। इसे केवल उसी अवसंरचना के विरुद्ध चलाएँ जिसका परीक्षण करने के लिए आप अधिकृत हैं।
ansible-playbook तक पहुँचने वाला कोई भी --extra-vars मान जिसमें ;, &&,
||, |, बैकटिक या $( हो। वैध 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।
| तिथि | घटना |
|---|---|
| 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 | यह लेख प्रकाशित |
aws-mcp-server)इसी शोध-चरण से सहयोगी सलाहकार: CVE-2026-52616, CVE-2026-52617.
MIT — देखें LICENSE।