
يوثّق CVE-2026-52618 مع PoC لحقن أوامر نظام التشغيل في @webfer/mcp-ansible-drupal عبر executeDeployment extraVars، إلى جانب إرشادات الكشف والإجراءات التخفيفية.
executeDeploymentspawn(cmd[0], cmd.slice(1), { shell: true }) يعيد ضم مصفوفة وسائط في سلسلة /bin/sh -c واحدة دون تهريب (escaping)، ولذلك فإن أي حرف خاص بالصدفة (shell metacharacter) في قيمة extraVars مقدَّمة إلى أداة MCP executeDeployment يُنفَّذ على المضيف الذي يشغّل الخادم.
تم إصلاح هذه المشكلة. قم بالترقية إلى 2.0.3 أو أحدث.
وسائط أدوات MCP متأثرة بالمهاجم. تُنتَج بواسطة نموذج لغوي كبير (LLM) من المحتوى الذي يعالجه الوكيل (agent) — المستندات، صفحات الويب، مخرجات الأدوات — لذلك فإن حقن التعليمات غير المباشر (indirect prompt injection) يمنح المهاجم التحكم في القيم التي يستقبلها معالج الأداة. أي معالج يُدخل أيًا من تلك القيم إلى صدفة يحوّل هذا التأثير إلى تنفيذ تعليمات برمجية على المضيف الذي يشغّل خادم 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، دون أي اقتباس (quoting) أو تهريب (escaping) للعناصر. لذلك فإن أي عنصر يحمل ; أو && أو | أو backticks أو $() يخرج من الأمر المقصود.
المسار القابل للوصول هو أداة MCP executeDeployment (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"
مسار استهلاك ثانوي (sink) في النسخة نفسها كان يُدرج projectRoot داخل execSync('ansible-vault encrypt ' + vaultPath).
يستدعي poc/driver.mjs الدالة runAnsible مباشرة بقيمة extraVars مصنوعة بعناية ويتحقق من وجود ملف العلامة. لا يلزم تثبيت 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 تحتوي على ; أو && أو || أو | أو backtick أو $(. قيم متغيرات Ansible المشروعة لا تحتوي ذلك أبدًا تقريبًا.sh -c يحتوي سطر أوامرها على ansible-playbook و أمر ثانٍ بعد فاصل — وهي إشارة في شجرة العمليات (auditd أو eBPF أو Falco أو EDR) لا تعتمد على تسجيل التطبيق.ansible-playbook وgit وansible-vault متوقعة؛ أما الصدفة أو المفسِّر (interpreter) أو عميل الشبكة فليست كذلك.executeDeployment على أحرف صدفة خاصة. سجّل وسائط الأدوات — فمعظم عمليات نشر MCP لا تفعل ذلك، وهو المكان الوحيد الذي تكون فيه القيمة المحقونة مرئية من منظور التطبيق.MITRE ATT&CK T1059.004 مفسِّر الأوامر والبرمجة النصية: Unix Shell.
قم بالترقية إلى @webfer/mcp-ansible-drupal 2.0.3 أو أحدث. يستدعي الكود المصدري الحالي spawn(ansibleCmd[0], ansibleCmd.slice(1), { … }) دون خيار shell، لذا تُمرَّر المصفوفة كـ argv وتفقد أحرف الصدفة الخاصة معناها.
القاعدة العامة لمعالجات أدوات MCP، وما يطبّقه الإصلاح هنا:
shell: true أبدًا عندما تكون مصفوفة الوسائط متاحة أصلًا. صيغة المصفوفة موجودة تحديدًا لتجنّب الصدفة.execFile/spawn مع متجه وسائط صريح.z.string() من Zod تُثبت أن القيمة نص، ولا تُثبت شيئًا عمّا بداخلها. استخدم قائمة مسموح بها (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 (تحييد غير صحيح للعناصر الخاصة المستخدمة في أمر نظام التشغيل) |
| الحزمة | @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 حرجة إذا كان الخادم مغلَّفًا في ناقل شبكي (network transport). |
| أبلغ عنه | s1ko (github.com/s1ko، [email protected]) |
| تاريخ إسناد CVE | 2026-07-13، MITRE CNA-LR |
| 2026-06-01 |
| التحقق الديناميكي من الثغرة ضد الإصدار 2.0.0 |
| 2026-06-01 | نشر 2.0.3 على npm مع إزالة shell: true |
| 2026-06-13 | إعادة التحقق على مضيف ثانٍ |
| 2026-07-13 | MITRE CNA-LR يسند CVE-2026-52618، مع نسب الاكتشاف إلى s1ko |
| 2026-08-22 | نشر هذا التقرير |