
Dompdf: رفض الخدمة (DoS) عبر استنزاف الموارد باستخدام صور Bitmap كبيرة الحجم
يُقدَّم هذا المستودع ومحتواه لأغراض تعليمية وبحثية فقط. المؤلف غير مسؤول عن أي إساءة استخدام أو ضرر أو أنشطة غير قانونية تُجرى باستخدام المعلومات المقدمة هنا. احصل دائمًا على تصريح قبل اختبار البيئات المستهدفة.
Dompdf v3.1.5 عرضة لهجوم حجب الخدمة (DoS) عبر استنزاف الموارد. يمكن للمهاجم إسقاط عملية PHP من خلال تقديم مستند HTML مصمم خصيصًا يحتوي على صورة واحدة بأبعاد ضخمة (مثل 30,000×30,000 بكسل).
على الرغم من أن Dompdf يطبّق فحوصات داخلية للتحقق من صحة أبعاد الصورة، إلا أنه يمكن تجاوزها باستخدام صورة عالية العشوائية (مثل ضوضاء عشوائية) مُرمَّزة بـ Base64 وملفوفة داخل حاويات CSS محددة.
غالبًا ما يمكن تحسين الصور القياسية ذات اللون الواحد بواسطة خوارزميات الضغط أو محركات العرض. ومع ذلك، فإن صورة ضوضاء عالية العشوائية تُجبر محرك PHP على معالجة كل واحد من الـ 900 مليون بكسل على حدة. عند استدعاء render()، يحاول المحرك معالجة الصورة النقطية غير المضغوطة في الذاكرة وحساب التخطيط لكل نقطة بيانات بكسل عالية التباين. يؤدي ذلك إلى:
توجد الثغرة لأن التحقق من الأبعاد يحدث مبكرًا، لكن تخصيص الموارد لحساب المربع المحيط بالكائن والمخازن المؤقتة الداخلية أثناء مرحلة العرض لا يحدّ بشكل صارم من وقت المعالج التراكمي أو استخدام الذاكرة لكائن واحد اجتاز الفحص الأولي.
https://github.com/user-attachments/assets/d1f5a07b-a7c5-4b5e-84b5-1e47e73522d9
composer require dompdf/dompdf:3.1.5
exploit.py):monitor.py):render.php. يعمل هذا السكربت كنقطة الدخول القابلة للاستغلال، محاكيًا تنفيذًا قياسيًا لمكتبة Dompdf:php -d memory_limit=2G render.php < payload.html
توضّح السجلات التالية الاستغلال الناجح لثغرة استنفاد الموارد. على الرغم من حدّ الذاكرة السخي البالغ 2GB الممنوح لعملية PHP، فإن صورة واحدة عالية الإنتروبيا تسبب انهيارًا قاتلًا.
python3 exploit.py
[*] Generating 30000x30000 High-Entropy Noise Bomb...
[+] High-entropy payload saved to: payload.html
php -d memory_limit=2G render.php < payload.html
Output
[*] Starting Dompdf rendering process...
PHP Fatal error: Allowed memory size of 2147483648 bytes exhausted (tried to allocate 1200355712 bytes) in /home/far00t/dompdf_exploit/vendor/dompdf/dompdf/src/Dompdf.php on line 490
أثناء تنفيذ عملية render.php، التقط السكربت monitor.py القياسات التالية، والتي تُظهر التأثير على موارد النظام:
python3 monitor.py
[*] Searching for PHP processes... (Press Ctrl+C to stop)
[MONITOR] PID: 210767 | RAM: 953.17 MB | CPU: 99.7%
يمكن لمهاجم عن بُعد غير مصادَق عليه أن يتسبب في حرمان كامل من الخدمة على خادم الويب عبر إرسال سلسلة HTML مصممة خصيصًا. يؤثر هذا على أي تطبيق يسمح للمستخدمين بتقديم محتوى HTML أو عناوين URL يتم تحويلها لاحقًا إلى PDF باستخدام Dompdf.