
يوثّق CVE-2026-52618 مع PoC لحقن أوامر نظام التشغيل في @webfer/mcp-ansible-drupal عبر executeDeployment extraVars، إلى جانب إرشادات الكشف والإجراءات التخفيفية.
executeDeployment الإضافيةspawn(cmd[0], cmd.slice(1), { shell: true }) يعيد دمج مصفوفة الوسائط في
سلسلة واحدة /bin/sh -c دون تهريب، لذا فإن أي حرف خاص بالصدفة (shell metacharacter) في
قيمة extraVars تُمرَّر إلى أداة MCP المسماة executeDeployment يُنفَّذ على
المضيف الذي يشغّل الخادم.
| 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 = 8.4 High (نقل stdio). AV:N → 9.8 Critical إذا كان الخادم مغلَّفًا بنقل شبكي. |
| أبلغ عنه | s1ko (github.com/s1ko، [email protected]) |
| تاريخ تعيين CVE | 2026-07-13، MITRE CNA-LR |
تم إصلاح هذه المشكلة. قم بالترقية إلى 2.0.3 أو أحدث.
وسائط أدوات MCP تتأثر بالمهاجم. فهي تُنتَج بواسطة LLM من
المحتوى الذي تعالجه الوكالة — المستندات وصفحات الويب ومخرجات الأدوات — لذا فإن
حقن الأوامر غير المباشر (indirect prompt injection) يمنح المهاجم السيطرة على القيم التي
يتلقاها معالج الأداة. أي معالج يمرّر أيًّا من تلك القيم إلى صدفة (shell) يحوّل
تلك السيطرة إلى تنفيذ شيفرة على المضيف الذي يشغّل خادم MCP. هذا هو
النموذج نفسه الخاص بالحالة السابقة aws-mcp-server / CVE-2026-5058.
النتيجة هي أن "المتصل هو LLM موثوق" ليس إجراءً تخفيفيًا. وسائط الأدوات هي مدخلات غير موثوقة.
src/helpers/runAnsible.ts في 2.0.0 بنى مصفوفة وسائط ثم شغّلها
مع تمكين الصدفة (shell):
const proc = spawn(ansibleCmd[0], ansibleCmd.slice(1), { shell: true });
مع shell: true، لا ينفّذ Node العنصر ansibleCmd[0] مع العناصر المتبقية كـ argv. بل يدمج المصفوفة بأكملها في سلسلة واحدة ويسلّمها إلى /bin/sh -c، دون تطبيق أي اقتباس أو تهريب على العناصر. لذلك فإن أي عنصر يحمل ; أو && أو | أو 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"
مصب ثانوي في الإصدار نفسه أدرج 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 متوقعة؛ أما shell أو مفسّر أو عميل شبكة فليس كذلك.executeDeployment على محارف
shell خاصة. سجّل وسائط الأدوات — معظم عمليات نشر 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 أبدًا عندما تكون مصفوفة الوسائط متاحة بالفعل. صيغة
المصفوفة موجودة تحديدًا لتجنّب shell.execFile/spawn مع متجه
وسائط صريح.z.string() في Zod تثبت أن القيمة نصية
ولا شيء عن محتواها. استخدم قائمة سماح حيث تكون مجموعة القيم معروفة؛ وارفض
محارف shell الخاصة حيث لا تكون كذلك.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 | نشر 2.0.3 على npm مع إزالة shell: true |
| 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.