
سلسلة إثبات مفهوم (PoC) واستغلال بلغة Python للثغرة CVE-2026-82531: تسميم ذاكرة التخزين المؤقت لقالب Smarty عبر علامات SmartyNocache المزوّرة مما يؤدي إلى تنفيذ شيفرة PHP، مع أداة فحص وحمولة ومختبر Docker.
Python 3 PoC لـ CVE-2026-82531 — smarty-php/smarty — حقن كود (CWE-94) عبر علامات SmartyNocache المزوّرة في extends + إعادة توليد ذاكرة التخزين المؤقت للقالب → تنفيذ كود عن بُعد (RCE) عند include() لذاكرة التخزين المؤقت.
| الحقل | القيمة |
|---|---|
| CVE | CVE-2026-82531 |
| المنتج | Smarty محرك قوالب PHP |
| المتأثر | < 4.5.8؛ 5.0.0 – 5.8.4 |
| المُصلَح | 4.5.8، 5.8.5 |
| CWE | CWE-94 — التحكم غير السليم في توليد الكود |
| CVSS 4.0 | 9.2 حرج (CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N) |
| CVSS 3.1 | 8.1 مرتفع |
| فهرس PoCbit | https://pocbit.org/pocs/ |
| صفحة PoCbit | https://pocbit.org/pocs/cve-2026-82531 |
| علامة التحقق | POCBIT-82531-OK (مخرجات الأمر بترميز base64 في جسم استجابة HTTP) |
| التنبيهات | GHSA-3w63-v7pm-cq9x |
محور الاستغلال: يشغّل poc.py exploit التسخين → مسح ذاكرة التخزين المؤقت → التسميم (POST name=) → الإطلاق؛ check، payload، Docker lab/ (Smarty 5.8.4). المخرجات: hits.txt، exploited.txt.
يقوم Smarty بترجمة القوالب إلى PHP وقد يكتب مخرجات مخزّنة مؤقتًا. عندما تستخدم القوالب extends: / وراثة الكتل، يمكن للدالة المترجمة على المستوى الأعلى أن تترك nocache_hash غير معرّف بعد أن يقوم عامل PHP جديد بتحميل الملفات المترجمة من القرص.
أثناء إعادة توليد ذاكرة التخزين المؤقت، يبني Smarty_Internal_Runtime_UpdateCache تعبيرًا نمطيًا (regex) يفصل مناطق "nocache". ينتج عن التجزئة الفارغة (null) بديل regex فارغ، لذا يمكن لبيانات assign() التي يتحكم بها المهاجم أن تزوّر:
/*%%SmartyNocache:%%*/ <?php ... ?> /*/%%SmartyNocache:%%*/
يُنسخ هذا الكتلة حرفيًا إلى ملف PHP الخاص بالذاكرة المؤقتة المُولَّد (يتم تخطي تعطيل وسوم PHP المعتاد). الطلب التالي الذي يتضمن ملف الذاكرة المؤقتة ينفّذ PHP المحقون → تنفيذ شيفرة عن بُعد.
exploit)| المرحلة | الإجراء |
|---|---|
| 1 التهيئة | name=world غير ضار → تجميع + ذاكرة مؤقتة أولية |
| 2 المسح | إزالة ملفات الذاكرة المؤقتة فقط (تبقى القوالب المجمّعة) — يوفّر المختبر ?lab_clear_cache=1 |
| 3 التسميم | name=<SmartyNocache مزوّر + PHP shell_exec> → كتابة ذاكرة مؤقتة مسمومة |
| 4 الإطلاق | name=benign غير ضار → include() ينفّذ PHP المحقون؛ يحتوي الجسم على POCBIT-82531-OK:<base64> |
تحتاج الأهداف الحقيقية إلى: تفعيل التخزين المؤقت، قوالب extends، إسناد يتحكم به المستخدم، فقدان في الذاكرة المؤقتة بينما يكون مجلد التجميع ممتلئًا (TTL، أو إعادة تشغيل، أو تفريغ من المسؤول).
في التطبيقات التي تستخدم Smarty extends: / الوراثة + التخزين المؤقت، عندما يكون nocache_hash بقيمة null، يتم كتابة كتلة SmartyNocache المزيفة التي assignها المهاجم إلى ملف PHP الخاص بالتخزين المؤقت كـ PHP خام؛ وفي الطلب التالي يتم include → RCE. حزمة PoCbit: مختبر Docker + سلسلة exploit كاملة.
cd CVE-2026-82531
pip install -r requirements.txt
docker compose up --build -d
python poc.py check http://127.0.0.1:8088
python poc.py exploit --url http://127.0.0.1:8088 -c "id"
python poc.py exploit -i targets.example.txt -w 10 -c id
python poc.py payload -c "id"
بعد الترقيع: احذف/أعد إنشاء جميع ملفات ذاكرة التخزين المؤقت للقوالب.
البحث الأمني المصرّح به والأنظمة التي تملكها أو لديك إذن باختبارها فقط.
NocacheHashInjectionTest.php من المنبع (Smarty 5.8.5)CVE-2026-82531 — Smarty <4.5.8 / 5.x<5.8.5 cache-poisoning RCE (CWE-94, CVSS 4.0 9.2 AT:P). PoCbit PoC: extends+inheritance null nocache_hash → forged SmartyNocache marker in assign() → PHP in cache include. check/exploit/payload, Docker lab 5.8.4, hits.txt & exploited.txt. Fix 4.5.8 / 5.8.5. Marker POCBIT-82531-OK. https://pocbit.org/pocs/cve-2026-82531