
افحص تكوين NGINX الخاص بك لتحديد ما إذا كان متأثرًا بـ CVE-2026-42945.
فاحص ثابت لملفات إعداد NGINX يكتشف نمط rewrite/set المرتبط بـ CVE-2026-42945.
يجتاز الفاحص إعدادات NGINX باستخدام crossplane، ويفحص كتل location، ويطبع كل موقع يبدو متأثرًا بهذا التنسيق:
/<path-to>/xxx.conf:<line-number> -> location XXXXX
مثال:
/path/to/nginx.conf:39 -> location ~ ^/api/(.*)$
المرجع: CVE-2026-42945-POC.
تُدار التبعيات باستخدام uv في ملف pyproject.toml ومقفلة في uv.lock. التبعية الوحيدة في وقت التشغيل هي crossplane.
من جذر المستودع:
uv sync
يمكنك أيضًا تخطي خطوة إعداد منفصلة والسماح لـ uv run بإنشاء البيئة عند أول استخدام.
فحص ملف إعداد واحد:
uv run ./scan.py /etc/nginx/nginx.conf
فحص مجلد بشكل متكرر:
uv run ./scan.py -r /etc/nginx
فحص متكرر من المجلد الحالي عن ملفات *.conf:
uv run ./scan.py -r './*.conf'
اقتبس أنماط الغلوب (globs) عندما تريد أن يوسّعها الفاحص بشكل متكرر. إذا كانت الصدفة (shell) لديك توسّع ./*.conf أولًا، فإن الفاحص يستقبل فقط الملفات المطابقة من الصدفة.
فحص الملفات المقدمة فقط دون متابعة توجيهات include:
uv run ./scan.py --single ./site.conf
إظهار تحذيرات المحلّل، بما في ذلك ملفات include المفقودة:
uv run ./scan.py -v -r /etc/nginx
يتوفر تنفيذ بلغة Go بنفس تنسيق المخرجات ورموز الخروج في مجلد go/. يستخدم nginx-go-crossplane لتحليل إعدادات NGINX وpflag لخيارات واجهة سطر الأوامر (CLI). يتطلب Go 1.23 أو أحدث.
شغّله باستخدام go run:
cd go
go run . -r ../tests/fixtures
عند وجود نتائج، يخرج الفاحص برمز خروج 1. ستقوم go run بطباعة سطر إضافي exit status 1 في هذه الحالة؛ قم ببناء الملف التنفيذي إذا كنت تريد مخرجات الفاحص فقط.
بناء ملف تنفيذي مستقل:
cd go
go build -o cve-2026-42945-scan-go .
./cve-2026-42945-scan-go -r ../tests/fixtures
نمط الإعداد الخطير هو location يحتوي على:
rewrite يحتوي بديله على ? غير مُهرَّبlast أو break أو redirect أو permanentset لاحق ينسخ التقاطًا من التعبير النمطي مثل $1 أو ${1} أو $name أو ${name}مثال على نمط قابل للاستغلال:
location ~ ^/api/(.*)$ {
rewrite ^/api/(.*)$ /internal?migrated=true;
set $original_endpoint $1;
}
يُبلغ الفاحص عن سطر location وليس سطر rewrite أو set، لأن الموقع هو الكتلة القابلة للتنفيذ التي يجب فحصها وإصلاحها.
يحتوي المجلد tests/fixtures/ على إعدادات NGINX صغيرة يمكن استخدامها كأمثلة:
شغّل الفاحص على جميع نماذج الاختبار:
uv run ./scan.py -r tests/fixtures
النتائج المتوقعة:
/absolute/path/to/tests/fixtures/missing_include_still_scans.conf:6 -> location ~ ^/partial/(.*)$
/absolute/path/to/tests/fixtures/named_capture.conf:2 -> location /users
/absolute/path/to/tests/fixtures/vulnerable.conf:2 -> location ~ ^/api/(.*)$
إذا تم العثور على مواقع متأثرة، تتم طباعة كل نتيجة في سطر مستقل:
/absolute/path/to/file.conf:30 -> location ~ ^/aaaa/dddd/(.*)$
/absolute/path/to/nginx.conf:39 -> location ~ ^/api/(.*)$
عدم وجود مخرجات يعني عدم العثور على أي موقع متأثر في الإعداد المُحلَّل.
هذا فاحص إعدادات ثابت (static). لا يقوم بـ:
تعامل مع النتائج على أنها مواقع تحتاج إلى مراجعة ومعالجة. يكون المضيف متأثرًا فعليًا فقط عندما يكون نطاق إصدار NGINX القابل للاستغلال ونمط الإعداد الخطير موجودين معًا.
شغّل مجموعة الاختبارات:
uv run python -m unittest discover -s tests -v
شغّل مجموعة اختبارات Go:
cd go
go test ./...
شغّل فحص الصياغة (syntax):
uv run python -m py_compile scan.py
شغّله مقابل إعداد POC المرفق:
uv run ./scan.py CVE-2026-42945-POC/env/nginx.conf
المخرجات المتوقعة:
/absolute/path/to/CVE-2026-42945-POC/env/nginx.conf:39 -> location ~ ^/api/(.*)$
| النموذج | النتيجة المتوقعة |
|---|
tests/fixtures/vulnerable.conf | يُبلغ عن التقاط موضعي (positional capture) |
tests/fixtures/named_capture.conf | يُبلغ عن التقاط مُسمّى (named capture) |
tests/fixtures/missing_include_still_scans.conf | يُبلغ عن نتيجة حتى مع وجود include مفقود |
tests/fixtures/safe_break_flag.conf | لا توجد نتيجة لأن إعادة الكتابة تستخدم break |
tests/fixtures/safe_no_capture.conf | لا توجد نتيجة لعدم توفر أي التقاط |