
ماسح ضوئي للكشف فقط عن CVE-2026-42945 (NGINX Rift)، وهو تجاوز سعة في كومة الذاكرة داخل ngx_http_rewrite_module. كشف الإصدار + تحليل أنماط nginx.conf. Python 3 يعتمد على المكتبة القياسية فقط، دون استدعاءات شبكة.
| الفحص | الطريقة |
|---|
| الإصدار | nginx -V، dpkg/rpm/apk، وسوم صور Dockerfile/compose |
| نمط الإعدادات | تحليل مراعٍ للأقواس لـ nginx.conf وجميع الملفات المُضمّنة عبر include |
| الإصدار | الضعيف | المُصحّح |
|---|---|---|
| NGINX OSS | 0.6.27 – 1.30.1 | 1.31.0+ (أو 1.30.1 مصحّح) |
| NGINX Plus | R32 قبل R32P6 | R32P6+ |
| NGINX Plus | R36 قبل R36P4 | R36P4+ |
| NGINX Plus | R37+ | غير متأثر |
ملاحظة بخصوص 1.30.1: الإصدار المستقر المُصحّح 1.30.1 يظهر نفس سلسلة الإصدار مثل الإصدار الضعيف، لذلك يصنّف الماسح أي 1.30.1 على أنه
POTENTIALLY_VULNERABLE(رمز الخروج 1، بشكل متحفظ). تحقق من سجل تغييرات الحزمة / التصحيح المُرجَع من الاستشارة للتأكد من تطبيق التصحيح.
يتم وضع علامة على كتلة نطاق عندما تتحقق الشروط الثلاثة جميعها:
rewrite أو if أو set مرجع الالتقاط PCRE غير المسمّى
($1–$9، بما في ذلك الصيغة المعقوفة ${1}–${9}).?
(بالنسبة لـ rewrite/set تُستثنى وسيطة نمط التعبير النمطي — ? هناك
هو مُكرّر كمية PCRE؛ أما شروط if فتُفحص بشكل متحفظ).rewrite/if/set يلي ذلك في نفس النطاق
(يتم تضمين ملفات include في النطاق المُضمّن، لذا يتم اكتشاف الأزواج
الممتدة عبر حدود include).# Clone and run
git clone https://github.com/simota/nginx-rift-scanner.git
cd nginx-rift-scanner
# Scan local nginx (binary in PATH, config at /etc/nginx/nginx.conf)
python3 scripts/scan_nginx_rift.py
# Custom paths
python3 scripts/scan_nginx_rift.py \
--nginx-binary /usr/sbin/nginx \
--config /etc/nginx/nginx.conf \
--prefix /etc/nginx \
--scan-dir /app
# JSON output (CI / SIEM)
python3 scripts/scan_nginx_rift.py --json
# Validate with included fixtures
python3 scripts/scan_nginx_rift.py --config fixtures/vulnerable.nginx.conf
python3 scripts/scan_nginx_rift.py --config fixtures/safe.nginx.conf
رموز الخروج: 0 = سليم، 1 = إصدار VULNERABLE / POTENTIALLY_VULNERABLE
أو نمط إعدادات مُعلَّم.
| الخيار | الافتراضي | الوصف |
|---|---|---|
--nginx-binary PATH | nginx | مسار ملف nginx التنفيذي |
--config PATH | /etc/nginx/nginx.conf | إعداد nginx الجذر المراد فحصه |
--prefix PATH | دليل --config | بادئة إعداد nginx المستخدمة لحل مسارات include النسبية (يحلها nginx مقابل البادئة، وليس مقابل دليل الملف المُضمّن) |
--scan-dir PATH | . | الدليل الذي سيتم البحث فيه عن ملفات Dockerfiles/compose |
--json | — | إصدار تقرير JSON إلى stdout |
الترقية (مُفضّلة):
الحل البديل — استبدل عمليات الالتقاط غير المسمّاة بعمليات التقاط مسمّاة
في كل توجيه rewrite/if/set يحتوي أيضًا على ?:
# Vulnerable
rewrite ^/api/(\w+)$ /new-api?path=$1 last;
# Safe
rewrite ^/api/(?<action>\w+)$ /new-api?path=$action last;
نتائج فحص الإعدادات استدلالية. عدم ضمان قابلية الاستغلال للتوجيه المُعلَّم —
فقد لا يكون ? في مسار بناء URI، أو قد لا يتفاعل مرجع الالتقاط مع التخصيص
الذي يفيض. يجب مراجعة كل نتيجة بواسطة إنسان قبل تحديد أولويات المعالجة.
nginx الثنائي (اختياري — يتم تخطي فحص الإصدار إذا كان غير موجود)| الملف | النتيجة المتوقعة |
|---|---|
fixtures/vulnerable.nginx.conf | 3 نتائج في الإعدادات، رمز الخروج 1 |
fixtures/safe.nginx.conf | 0 نتيجة في الإعدادات، رمز الخروج 0 |
python3 -m unittest discover -s tests -v