
يحلل CVE-2026-42945، وهو تجاوز سعة الكومة في إعادة كتابة NGINX، ويوفر كاشفًا تفاضليًا، وإثبات مفهوم (PoC) لحرمان الخدمة (DoS) حتميًا، ومنفذ تنفيذ التعليمات البرمجية عن بُعد (RCE) معتمدًا مع التحقق.
بحث أمني حول CVE-2026-42945 (CVSS 4.0 9.2 حرج): تجاوز سعة مخزن مؤقت في محرك السكربت الخاص بـ NGINX حيث تترك rewrite مع وسائط في الاستبدال (مثل rewrite ^(.*) /new?c=1;) علامة is_args في المحرك مضبوطة ولا يتم مسحها أبدًا — لذا أي التقاط ($1) يتم تقييمه لاحقًا في set/if يُنسخ مع ترميز URI إلى مخزن مؤقت تم تحديد حجمه للطول غير المرمّز. يمكن الوصول إليه قبل المصادقة من قبل أي عميل يحمل URI طلبه %XX أو +.
النتيجة (المرحلة 1): كاشف تفاضلي آمن (الإصدار الضعيف 1.30.0 مقابل الإصدار المُصلَح 1.30.1، بدون أي انهيارات) بالإضافة إلى (SIGSEGV، مع تفريغ أساسي — يتم تقديم الاستجابة بالكامل أولاً). تم إعادة إنتاج كلاهما ضد بنيات مُجمّعة من المصدر عند الالتزام .
71d62c6النتيجة (المرحلة 2): نقل موثّق لـ RCE الخاص بالمُبلّغ — تنفيذ system() كمستخدم العامل (nobody)، تم إعادة إنتاجه 3/3 مرات بنجاح ضد البنية المثبتة للمُبلّغ والمُعاد إنتاجها تحت lab/rce/. تقنية الاستغلال هي Leo Lin (DepthFirst)؛ انظر ما هو أصلي هنا مقابل العمل السابق وقسم العمل السابق في التقرير.
| الادعاء | الدليل |
|---|---|
| السبب الجذري مشتق من التزام الإصلاح (وليس من المدونات) | finding-sheet |
الإصلاح عبارة عن سطر واحد — e->is_args = 0; في ngx_http_script_regex_end_code() | الالتزام 524977e (مقتبس في writeup) |
| كاشف آمن: ضعيف مقابل مُصلَح كمرجع، بدون انهيارات | poc/diagnose.py — بصمة الاقتطاع (/foo%25b مقابل /foo%bar) |
| مصفوفة التشغيل: URI مقتبس/بعلامة زائد و أحرف قابلة للترميز في الالتقاط — كلاهما مطلوب | بطارية فحص poc/diagnose.py بما في ذلك عنصر التحكم /a%41b |
| رفض خدمة حتمي للعامل (SIGSEGV، تفريغ أساسي، استجابة تُقدَّم أولاً) | poc/crash.py — تغيير X-Worker-PID يثبت موت العامل |
| الإصدار المُصلَح 1.30.1 ينجو من الهجوم المطابق | poc/crash.py --host 127.0.0.1:29544 — نجا 3/3 جولات |
| RCE (المرحلة 2، تقنية المُبلّغ، نقل موثّق) | exploit/rce.py — 3/3 تشغيلات، ملف إثبات + uid=65534(nobody)، العمال exited on signal 11 بعد التنفيذ |
# زوج تفاضلي: nginx 1.30.0 (:29543) + 1.30.1 (:29544) مُجمّع من المصدر
cd lab && docker compose up -d --build && cd ..
python3 poc/diagnose.py # مرجع آمن — لا يُنهي أي عامل أبدًا
python3 poc/crash.py --host 127.0.0.1:29543 # 1.30.0: العامل يموت على الإشارة 11، تفريغ أساسي
python3 poc/crash.py --host 127.0.0.1:29544 # 1.30.1: ينجو من كل جولة
docker logs cve-42945-vuln 2>&1 | grep 'exited on signal' | tail -3
المرحلة 2 — RCE ضد البنية المثبتة للمُبلّغ (مراجعة تطوير nginx
98fc3bb7 = release-1.29.8-14، ASLR معطّل بواسطة نقطة الدخول المثبتة):
docker compose -f lab/rce/docker-compose.yml up -d --build # :29545، دقائق للبناء
python3 exploit/rce.py \
--cmd 'echo pwned-by-cve-2026-42945 > /tmp/proof' --verify --expect pwned
docker compose -f lab/rce/docker-compose.yml exec nginx cat /tmp/proof
| المستند | ما هو |
|---|---|
| docs/finding-sheet.md | ورقة بيانات من صفحة واحدة: الإصدارات، CVSS، نمط التكوين، شروط التشغيل، توقيعات الكشف |
| docs/report-ptes.md | تقرير منظم وفق PTES (7 مراحل)، مقتصر على ما تم إنجازه فعليًا |
| docs/research-writeup.md | سرد التحقيق — علم آثار التزام الإصلاح، مفاجأة الاقتطاع، دروس قابلة للنقل، عمل مستقبلي |
سلسلة البحث في المرحلة 1 هي عمل أصلي: المرجع التفاضلي الخالي من الانهيارات وبصمة الاقتطاع الخاصة به (الجسم المُقدَّم هو الالتقاط المُعاد ترميزه والمقتطع إلى الطول الخام — التوقيع المرئي لعدم تطابق التمريرين الطول/القيمة)، ومصفوفة التشغيل التي تثبت أن كلا الشرطين المسبقين ضروريان، والشرح على مستوى المصدر لـلماذا لا يمكن لتمرير الطول رؤية is_args، وقتل العامل الحتمي بعد الاستجابة. الثغرة نفسها، ونمط التكوين الضعيف، وتحليل التزام الإصلاح هي عمل سابق للمُبلّغ والمشروع الرئيسي — Leo Lin (DepthFirst) كشف المشكلة وRoman Arutyunyan أصلحها؛ انظر قسم العمل السابق في التقرير و
DepthFirst Disclosures — Nginx-Rift،
شجرة CVE-2026-42945.
المرحلة 2 (RCE) هي نقل لاستغلال المُبلّغ المنشور، وليست سلسلة مستقلة: هندسة الكومة عبر الطلبات التي تُرسل التجاوز إلى مؤشر cleanup لمجمع طلب مجاور، ورشّ ngx_pool_cleanup_t المزيف عبر أجسام POST محتجزة، وإعادة توجيه توزيع التنظيف إلى system() في libc، وهندسة التجاوز (349 A + 969 + + 6 بايتات هدف)، وثوابت الأساس/الإزاحة بدون ASLR، والبنية المثبتة في lab/rce/ (بيئة env/ الخاصة بهم) — كلها تصميم Leo Lin، مُعاد إنتاجها مع الإشادة في exploit/rce.py. ما يخصنا في المرحلة 2: النقل نفسه — اصطلاحات CLI/التسجيل/التحقق لهذا المستودع، اكتشاف المرشح الحي عبر فحص الكومة والكشف التلقائي للأساس (ثوابتهم الثابتة تعتمد على النواة؛ انظر docstring الخاص بالاستغلال)، ومستمع الصدفة العكسية من المكتبة القياسية، وأدلة التحقق.
يشارك هذا المستودع منهجيته مع CVE-2026-42533 — NGINX Pre-Auth Heap Overflow: Analysis & RCE (مستودع شقيق): نفس فئة خطأ التمريرين الطول/القيمة في محرك سكربت nginx، تم الوصول بها هناك إلى سلسلة RCE كاملة قبل المصادقة. تلك السلسلة حددت السقف المعقول لهذه الثغرة؛ المرحلة 2 من هذا المستودع تصل إلى نفس السقف هنا — كنقل موثّق لتقنية المُبلّغ، وليست سلسلة مستقلة.
docs/ ورقة البيانات · تقرير PTES · تقرير البحث
poc/ diagnose.py (مرجع تفاضلي آمن) · crash.py (رفض خدمة حتمي)
exploit/ rce.py — نقل موثّق لسلسلة system() الخاصة بالمُبلّغ
lab/ Dockerfile (nginx من المصدر، -g -O0) + زوج compose تفاضلي
lab/nginx/ vulnerable.conf — تكوين PoC من التزام الإصلاح
lab/rce/ بيئة RCE المثبتة للمُبلّغ (env/ الخاصة بهم، تعيين النقل الخاص بنا)
524977e7c534
"Rewrite: fixed escaping and possible buffer overrun" (Roman Arutyunyan) — صدر في nginx 1.30.1CVE-2026-42945 (العمل السابق للمُبلّغ؛ Leo Lin)أداة بحث تعليمية. شغّلها فقط ضد أنظمة تملكها أو مُصرَّح لك صراحةً باختبارها. الثغرة مُصحَّحة — قم بترقية nginx إلى ≥ 1.30.1.