
مختبر Docker يعيد إنتاج CVE-2026-42533، وهو تجاوز سعة الكومة (heap overflow) في nginx قبل المصادقة وتسريب معلومات عبر إفساد الالتقاط ثنائي المرور، مع نصوص PoC ومقارنة مع النسخة المُرقّعة.
CVSS 9.2 (حرج) — تجاوز سعة المخزن المؤقت في الكومة قبل المصادقة + تسريب معلومات في nginx المتأثر: nginx 0.9.6 – 1.30.3 / 1.31.2 | المُرقَّع: 1.30.4 / 1.31.3
┌─────────────────────────────────────┐
│ Host machine │
│ │
PoC scripts ──────┤ :8080 ──► nginx-vuln (1.26.x) │
│ │ VULNERABLE │
│ ▼ │
│ backend (Python echo) │
│ ▲ │
│ │ │
│ :8081 ──► nginx-patched (1.30.4) │
│ SAFE │
└─────────────────────────────────────┘
# Build and start
docker compose up --build -d
# Verify
curl http://localhost:8080/health
curl http://localhost:8081/health
# Run PoC
python3 poc_overflow.py # Heap overflow (crash worker)
python3 poc_infoleak.py # Info leak (heap residue)
bash poc_curl.sh # Quick curl-based tests
# Compare with patched
python3 poc_overflow.py localhost 8081
python3 poc_infoleak.py localhost 8081
# Check for crashes
docker logs nginx-vuln 2>&1 | grep -iE 'signal|segfault|abort'
# Cleanup
docker compose down
يقيّم nginx قيم التوجيهات (proxy_set_header، return، add_header، إلخ)
على مرورين باستخدام مصفوفة قابلة للتغيير مشتركة r->captures:
| المرور | الغرض | يقرأ r->captures |
|---|---|---|
| LEN | قياس حجم المخزن المؤقت المطلوب | نعم — للحصول على طول $1 |
(يتم تقييم خريطة regex هنا، مما يطمس r->captures) | ||
| VALUE | كتابة البيانات في المخزن المؤقت المُخصص | نعم — لكن $1 يشير الآن إلى مكان آخر |
map $http_user_agent $is_bot {
~*(bot|crawl|spider) 1; # ← regex map = clobber trigger
default 0;
}
location ~ "^/api/v1/(.+)$" { # ← regex capture source
proxy_set_header X-Route "$1 — $is_bot"; # ← two-pass sink
# ^^ ^^^^^^^
# capture ref + map var in same buffer = BUG
}
| الاتجاه | حجم URI | حجم مدخلات الخريطة | النتيجة |
|---|---|---|---|
| Overflow | قصير (3 B) | طويل (4096 B) | LEN يخصص صغيرًا، VALUE يكتب كبيرًا → تجاوز سعة الكومة |
| Info Leak | طويل (8000 B) | قصير (5 B) | LEN يخصص كبيرًا، VALUE يكتب صغيرًا → بقايا الكومة في الاستجابة |
| نقطة النهاية | الحوض | مُشغِّل الخريطة | العرض |
|---|---|---|---|
/api/v1/{path} | proxy_set_header | $is_bot (User-Agent) | تجاوز السعة |
/leak/{path} | return + add_header | $ref_domain (Referer) | تسريب معلومات |
/rce/{path} | set + return | $is_bot (User-Agent) | تجاوز السعة |
/safe/{path} | return (بدون خريطة) | لا يوجد | تحكم (آمن) |
| الملف | الغرض |
|---|---|
docker-compose.yml | تنسيق المختبر |
Dockerfile.nginx-vuln | nginx 1.26.x المعرّض للثغرة |
Dockerfile.nginx-patched | nginx 1.30.4 المُرقَّع |
nginx-vuln.conf | إعدادات معرّضة للثغرة مع أنماط مشروحة |
backend.py | خادم صدى لفحص الرؤوس المُمرَّرة عبر الوكيل |
poc_overflow.py | PoC لتجاوز سعة الكومة (أحجام حمولة متصاعدة) |
poc_infoleak.py | PoC لتسريب المعلومات (كشف بقايا الكومة) |
poc_curl.sh | اختبارات سريعة قائمة على curl |
استخدم ماسح الإعدادات:
python3 nginx_capture_clobber_scan.py /etc/nginx/nginx.conf
~ / ~* في map عند استخدام الالتقاطات في مكان آخرللأغراض التعليمية واختبارات الأمان المصرّح بها فقط.