
إعادة اكتشاف قابلة للتكرار بمساعدة الذكاء الاصطناعي لـ CVE-2026-42945 تجاوز سعة المخزن المؤقت الكومي في وحدة إعادة كتابة nginx. يتضمن مطالبات تدقيق، محفز PoC، إعادة إنتاج تعطل ASan، وتحليل فني لأغراض البحث الدفاعي.
يوثق هذا المستودع تجربة إعادة اكتشاف ثغرة أمنية قابلة للتكرار مدعومة بالذكاء الاصطناعي ضد وحدة ngx_http_rewrite_module في nginx، والتي ارتبطت لاحقًا بـ CVE-2026-42945.
التجربة ضيقة بشكل متعمد. تم توفير الملف الثغري، src/http/ngx_http_script.c، مباشرة للنموذج للمراجعة. هذا ليس ادعاءً بأن نظام الذكاء الاصطناعي وجد المشكلة بشكل مستقل في قاعدة كود nginx الكاملة من الصفر.
الخلل الذي تمت مراجعته هو تجاوز سعة المخزن المؤقت في الكومة (heap buffer overflow) ناتج عن حالة قديمة لمحرك البرنامج النصي في معالجة إعادة الكتابة في nginx.
بشكل عام:
rewrite يحتوي على ? يضبط e->is_args = 1.e->is_args بعد انتهاء إعادة الكتابة.set أو if أو إعادة كتابة لاحق ينسخ التقاط تعبير نمطي غير مسمى، مثل $1، يمكن أن يحدد حجم المخزن الوجهة كما لو أن الالتقاط سينسخ خامًا.e->is_args = 1 القديمة ويقوم بتشفير URI للالتقاط.يؤكد إعادة الإنتاج المحلي باستخدام AddressSanitizer حدوث تجاوز سعة المخزن المؤقت في الكومة في:
ngx_escape_uri
ngx_http_script_copy_capture_code
ngx_http_rewrite_handler
.
├── README.md
├── LICENSE
├── prompts/
│ ├── audit_prompt.md
│ └── poc_prompt.md
├── poc/
│ ├── trigger.py
│ ├── nginx.conf
│ ├── reproduce.sh
│ └── expected_output.txt
├── docs/
│ ├── technical-analysis.md
│ ├── vulnerability-breakdown.md
│ └── methodology.md
└── screenshots/
└── asan-crash.png
تم تصميم الإثبات (PoC) لبناء محلي مختبري لـ nginx الثغري مع تمكين AddressSanitizer. يبدأ تشغيل nginx على 127.0.0.1:18080، ويرسل طلبًا مصممًا إلى خادم محلي، ويطبع دليل الانهيار.
استخدم شجرة مصدر nginx متأثرة. تم التحقق من صحة التجربة ضد nginx 1.30.0 الذي تم بناؤه باستخدام clang و ASan:
./auto/configure \
--prefix=/tmp/nginx-asan-poc \
--with-cc-opt='-O0 -g -fsanitize=address -fno-omit-frame-pointer' \
--with-ld-opt='-fsanitize=address'
make -j"$(getconf _NPROCESSORS_ONLN 2>/dev/null || sysctl -n hw.ncpu)"
من هذا المستودع:
NGINX_BIN=/path/to/vulnerable/nginx/objs/nginx ./poc/reproduce.sh
إذا تم وضع هذا المستودع مباشرة داخل النسخة المأخوذة من مصدر nginx المستخدم للتحقق، فإن البرنامج النصي يجد أيضًا ../../objs/nginx تلقائيًا.
تطبع إعادة الإنتاج الناجحة تقرير ASan مشابهًا لما يلي:
ERROR: AddressSanitizer: heap-buffer-overflow
WRITE of size 1
#0 ngx_escape_uri ngx_string.c:1687
#1 ngx_http_script_copy_capture_code ngx_http_script.c:1399
#2 ngx_http_rewrite_handler ngx_http_rewrite_module.c:180
انظر poc/expected_output.txt.

تكوين nginx الذي يستخدمه الإثبات صغير بشكل متعمد:
location / {
rewrite ^(.*) /new?c=1;
set $myvar $1;
return 200 "$myvar\n";
}
يقوم أول rewrite بتعيين e->is_args لأن الاستبدال يحتوي على ?. يقوم set اللاحق بتقييم $1 بينما لا تزال تلك الحالة القديمة موجودة.
يقوم التصحيح الأدنى بإعادة تعيين علم حالة الوسيطات لمحرك البرنامج النصي عند انتهاء إعادة كتابة التعبير النمطي:
e->is_args = 0;
e->quote = 0;
في شجرة المصدر المستخدمة لهذه التجربة، يظهر الإصلاح كالتزام:
524977e7c534e87e5b55739fa74601c9f1102686
Rewrite: fixed escaping and possible buffer overrun
النقطة الأساسية ليست حجم التصحيح، بل الثبات الحالي الذي يستعيده: يجب أن يتفق تمرير الطول وتمرير الكتابة على ما إذا كانت الالتقاطات تُنسخ كوسائط URI.
استخدمت هذه التجربة وكيل تشفير رائد كمساعد مراجعة. وجه المطالبة النموذج بشكل صريح للتركيز على مشكلات سلامة الذاكرة في src/http/ngx_http_script.c والاهتمام الشديد بعدم تطابق الطول/الكتابة ثنائي الممر.
قيود مهمة:
المطالبات الدقيقة مضمنة في prompts/audit_prompt.md و prompts/poc_prompt.md.
هذا المستودع مخصص للبحث الدفاعي، والتحقق من التصحيح، وقابلية إعادة الإنتاج. قم بتشغيل الإثبات فقط ضد مثيلات مختبر محلية تتحكم فيها.
تم إصدار التوثيق وهيكل الإثبات في هذا المستودع بموجب ترخيص MIT. nginx نفسه غير مضمن ويخضع لترخيصه الخاص.