
مختبر مُتحكَّم به لحقن إطارات HTTP/2 في NGINX للتحقق من تصحيح CVE-2026-42926 والبحث الدفاعي
مختبر أمن سيبراني مُتحكم به للتحقق من السلوك المرتبط بـ CVE-2026-42926 ومقارنته، وهي مشكلة حقن إطارات HTTP/2 تؤثر على إصدارات محددة من NGINX عند استخدام إعداد وكيل (proxy) قابل للاستغلال.
هذا المستودع مخصّص حصريًا لـ البحث الدفاعي، والتحقق من التصحيحات، وتدقيق الإعدادات، وإعادة الإنتاج المخبري المُتحكم به فقط.
التصنيف: حقن إطارات HTTP/2 الإصدارات المتأثرة: NGINX من
1.29.4حتى1.30.0الإصدارات المُصححة: NGINX1.30.1+/1.31.0+
استخدم هذا المشروع فقط في بيئة مختبر معزولة تمتلكها أو مُصرّح لك صراحةً باختبارها.
لا تشغّله ضد أنظمة تابعة لجهات خارجية، أو بنية تحتية عامة، أو بيئات مشتركة، أو خدمات إنتاجية دون إذن كتابي.
العزل الموصى به:
يفحص المختبر ما إذا كانت نسخة NGINX الثنائية وإعداداتها تطابق الشروط اللازمة لإعادة إنتاج المشكلة، ويُرسل طلبًا مُصنّعًا إلى موقع الاختبار، ويفحص سجل upstream مُتحكمًا به للبحث عن أدلة على وصول بايتات مشابهة لإطارات HTTP/2 المحقونة إلى جهة upstream.
نمط التحقق المعتاد هو:
النتيجة المتوقعة:
bashpython3phpلسير العمل المعتمد على الحاويات:
يستمع الإعداد النموذجي على المنفذ 80، وهو ما يتطلب عادة صلاحيات الجذر (root).
لمختبر محلي غير مميز، غيّر listen 80; في nginx_vulnerable.conf إلى منفذ مرتفع متاح مثل 8080، ثم استخدم عنوان الهدف المطابق في أمر PHP.
اجعل سكربتات الشل قابلة للتنفيذ:
chmod +x nginx_config_verify.sh run_lab_comparison.sh
تأكد من أن PHP يدعم cURL:
php -m | grep -i curl
تأكد من أن كل نسخة ثنائية من NGINX يمكنها طباعة إصدارها:
/path/to/nginx -V
يحتوي ملف nginx_vulnerable.conf المقدم على النمط المطلوب للاختبار:
location /exploit {
proxy_pass http://127.0.0.1:8081;
proxy_http_version 2;
proxy_set_body $request_body;
proxy_set_header Host $host;
proxy_set_header Content-Length $content_length;
}
تفاصيل مهمة:
proxy_http_version 2 يفعّل بروكسي HTTP/2 إلى سجل upstream.proxy_set_body $request_body يستخدم نص طلب يتحكم فيه العميل.client_max_body_size 20m يسمح بجسم الطلب المُصنّع بحجم 16 MiB المستخدم في سكربت التحقق.127.0.0.1:8081 افتراضيًا.يحافظ إعداد Docker المحدد في docker/nginx_vulnerable.docker.conf على نفس نمط الوكيل القابل للاستغلال، لكنه يستمع على منفذ الحاوية 8080 ويوصل إلى اسم خدمة Compose upstream:8081.
ينشئ Dockerfile نسخة NGINX 1.29.4 من المصدر ويُثبّت الأدوات المطلوبة للمختبر من PHP/Python. ثم يشغّل Compose ثلاث خدمات من نفس الصورة:
upstream: سجل إطارات HTTP/2 الخامnginx: NGINX 1.29.4 القابل للاستغلال باستخدام docker/nginx_vulnerable.docker.confrunner: أمر تحقق PHP لمرة واحدةقم ببناء صورة المختبر:
docker compose build
شغّل سجل upstream وNGINX القابل للاستغلال:
docker compose up -d upstream nginx
تأكد من إصدار NGINX المرفق:
docker compose exec nginx nginx -V
شغّل سكربت التحقق داخل شبكة Compose:
docker compose --profile run run --rm runner
يستخدم المشغّل هذه الوسائط داخل الحاوية:
php /lab/cve_2026_42926_lab.php \
http://nginx:8080/exploit \
/lab/upstream_logs \
/lab/nginx_config_verify.sh \
/usr/local/nginx/sbin/nginx \
/lab/docker/nginx_vulnerable.docker.conf \
/exploit
تُكتب سجلات upstream المُنشأة إلى دليل المضيف:
./upstream_logs/
كما يتم كشف خدمة NGINX للمضيف على:
http://localhost:8080/version
أوقف وأزل حاويات المختبر:
docker compose down
شغّل سجل upstream المُتحكم به:
python3 upstream_frame_logger.py 8081 ./upstream_logs
في طرفية أخرى، شغّل NGINX مع الإعداد النموذجي:
/path/to/nginx -c "$PWD/nginx_vulnerable.conf"
شغّل سكربت التحقق:
php cve_2026_42926_lab.php \
http://localhost/exploit \
./upstream_logs \
./nginx_config_verify.sh \
/path/to/nginx \
"$PWD/nginx_vulnerable.conf" \
/exploit
أوقف NGINX بعد التشغيل:
/path/to/nginx -s stop
إذا غيّرت NGINX ليستمع على منفذ آخر، حدّث الوسيطة الأولى. على سبيل المثال:
php cve_2026_42926_lab.php http://localhost:8080/exploit ./upstream_logs ./nginx_config_verify.sh /path/to/nginx "$PWD/nginx_vulnerable.conf" /exploit
حدد مسارات نسختي NGINX الثنائيتين وشغّل أداة المقارنة:
VULNERABLE_NGINX=/usr/local/nginx_1.29.4/sbin/nginx \
PATCHED_NGINX=/usr/local/nginx_1.30.1/sbin/nginx \
bash run_lab_comparison.sh
تجاوزات إعداد اختيارية:
VULNERABLE_NGINX=/path/to/vulnerable/nginx \
PATCHED_NGINX=/path/to/patched/nginx \
VULNERABLE_CONFIG="$PWD/nginx_vulnerable.conf" \
PATCHED_CONFIG="$PWD/nginx_vulnerable.conf" \
bash run_lab_comparison.sh
يكتب سكربت المقارنة:
vulnerable_result.txtpatched_result.txtupstream_logs_vulnerable/upstream_logs_patched/استخدم nginx_config_verify.sh مباشرة عندما تريد فقط فحص ما إذا كان الإعداد يحتوي على النمط القابل للاستغلال:
./nginx_config_verify.sh /path/to/nginx "$PWD/nginx_vulnerable.conf" /exploit
تتحقق الأداة المساعدة من:
proxy_http_version 2proxy_set_body مع متغيرclient_max_body_size بقيمة 16 MiB على الأقليقبل cve_2026_42926_lab.php وسائط موضعية:
php cve_2026_42926_lab.php <target_url> <upstream_log_dir> <config_script> <nginx_binary> <nginx_config> <location> [version_url]
القيم الافتراضية:
يُرجع cve_2026_42926_lab.php واحدًا من ثلاثة أحكام:
يتطلب الدليل الإيجابي أن يربط السكربت بين علامة التشغيل، وترويسة إطار upstream المُلاحَظة، وعلامة الإطار المحقون، وإصدار NGINX المتأثر.
يكتب سجل upstream ملفات JSON بأسماء مثل:
frames_<timestamp>.json
يحتوي كل سجل على بيانات وصفية مُحلَّلة لإطارات HTTP/2، ومقتطفات من الحمولة، وإزاحات البايت، وعلامات اكتشاف الحقن، وحقول ربط التشغيل.
يخزّن إطار المقارنة أدلة سجلات منفصلة لتشغيلات النسخة القابلة للاستغلال والنسخة المصححة حتى لا تختلط الأدلة من عمليتي التنفيذ.
إذا أبلغ سكربت PHP أن أداة فحص الإعداد غير قابلة للتنفيذ، شغّل:
chmod +x nginx_config_verify.sh
إذا أعاد الطلب 413 Request Entity Too Large، فزد client_max_body_size إلى 16m على الأقل؛ يستخدم الإعداد النموذجي 20m.
إذا لم يتم إنشاء أي سجلات upstream، تحقق من أن:
upstream_frame_logger.py يعمل.127.0.0.1:8081./exploit.إذا فشل NGINX في ربط المنفذ 80، فإما شغّله بالصلاحيات المناسبة في بيئة مختبر أو غيّر الإعداد إلى منفذ مرتفع مثل 8080.
إذا كانت نتيجة المقارنة غير حاسمة، فافحص vulnerable_result.txt وpatched_result.txt وأدلة السجلات المقابلة لـ upstream للتحقق من الشرط المسبق الفاشل.
هذا المشروع مرخّص بموجب رخصة MIT. راجع LICENSE للحصول على التفاصيل.
| الملف | الوصف |
|---|
README.md | وثائق المشروع. |
LICENSE | رخصة MIT. |
Dockerfile | يُنشئ صورة مختبر متكاملة تحتوي على NGINX 1.29.4 وPHP CLI/cURL وPython وسكربتات المشروع. |
docker-compose.yml | يشغّل خدمة NGINX القابلة للاستغلال، وسجل إطارات upstream، ومشغّل تحقق اختياري. |
cve_2026_42926_lab.php | سكربت التحقق الرئيسي للمختبر. يتحقق من الشروط المسبقة للإصدار/الإعدادات، ويرسل الطلب المُصنّع، ويفحص سجلات upstream، ويعيد حكمًا. |
nginx_vulnerable.conf | إعداد NGINX نموذجي يحتوي على نمط الوكيل القابل للاستغلال المستخدم في تشغيلات المقارنة بين النسخة القابلة للاستغلال والمصححة. |
docker/nginx_vulnerable.docker.conf | إعداد NGINX خاص بـ Docker يستخدم نفس النمط القابل للاستغلال واكتشاف خدمات Compose. |
nginx_config_verify.sh | أداة مساعدة تتحقق مما إذا كان إعداد NGINX الهدف يحتوي على نمط الوكيل القابل للاستغلال المطلوب. |
upstream_frame_logger.py | سجل upstream خام مُتحكم به لبروتوكول HTTP/2 يُستخدم لالتقاط الإطارات المستقبلة من NGINX وفحصها. |
run_lab_comparison.sh | ينسّق تشغيلات المقارنة بين النسخة القابلة للاستغلال والنسخة المصححة. |
.dockerignore | يُبقي السجلات المُنشأة وبيانات IDE الوصفية خارج سياق بناء Docker. |
| الوسيطة | القيمة الافتراضية |
|---|
target_url | http://localhost/exploit |
upstream_log_dir | ./upstream_logs |
config_script | ./nginx_config_verify.sh |
nginx_binary | nginx |
nginx_config | /etc/nginx/nginx.conf |
location | /exploit |
version_url | http://localhost/version |
| الحكم | المعنى | رمز الخروج |
|---|
positive | لوحظ دليل على حقن الإطارات وارتبط بعملية التشغيل. | 0 |
negative | تحققت الشروط المسبقة ولم يُلاحظ أي دليل على الحقن. | 1 |
inconclusive | فشل شرط مسبق واحد أو أكثر أو فشلت فحوصات الأدلة. | 2 |