ثغرة CVE-2026-42945 الكامنة في Nginx منذ 18 عامًا: تحليل شامل للمبدأ وPoC والإصلاح

🚨 ثغرة CVE-2026-42945 شديدة الخطورة الكامنة في Nginx منذ 18 عامًا: المبدأ وPoC وخطة الإصلاح
في 13 مايو 2026، أعلنت جهة أبحاث الأمنdepthfirst بالتعاون مع F5 عن ثغرة خطيرة على نحو غير مسبوق في تاريخ NGINX —CVE-2026-42945:
- درجة CVSS v4.0 البالغة 9.2: وهي ثغرة عالية الخطورة
- تجاوز سعة المخزن المؤقت في الكومة: قد يؤدي إلى تنفيذ التعليمات البرمجية عن بُعد (RCE)
- كامنة منذ 18 عامًا: منذ إدراجها في قاعدة الشيفرة عام 2008
- تؤثر على 9.75 مليون موقع حول العالم: أكثر من 2.54 مليون موقع في الصين متأثر
- PoC متاح للعامة: نجحت شركة Qianxin في إعادة إنتاجه
هذهثغرة تاريخية في الوحدة الأساسية لـ NGINX، حيث يكفي المهاجم إرسال طلب HTTP مُحضَّر خصيصًا واحدًا للسيطرة على الخادم عن بُعد.
🔍 نظرة عامة على الثغرة
المعلومات الأساسية
| خصائص الثغرة | التفاصيل |
|---|---|
| معرّف الثغرة | CVE-2026-42945 |
| درجة CVSS | v4.0: 9.2 | v3.1: 8.1 |
| نوع الثغرة | تجاوز سعة المخزن المؤقت في الكومة (Heap-based Buffer Overflow) |
| نوع التهديد | تنفيذ التعليمات البرمجية عن بُعد (RCE)، وحرمان من الخدمة (DoS) |
| شروط الاستغلال | لا تتطلب مصادقة، يكفي إنشاء طلب HTTP |
| المكوّن المتأثر | ngx_http_rewrite_module (وحدة أساسية مدمجة في NGINX) |
| جهة الاكتشاف | depthfirst (اكتشفتها الأنظمة الآلية في غضون 6 ساعات) |
نطاق التأثير
- 9.75 مليون موقع حول العالممتأثرة
- 2.54 مليون موقع في الصينمتأثرة
- يستضيف NGINX نحو ثلث مواقع العالم، مما يجعل نطاق التأثير واسعًا للغاية
- الشيفرة مكتوبة منذعام 2008، أي كامنة منذ18 عامًا
⚠️ شروط التفعيل
يجب توفر الشروط الثلاثة معًا
يتطلب تفعيل الثغرةاجتماع الإعدادات لمجموعة شروط محددة:
| الشرط | الوصف | مثال |
|---|---|---|
| 1. التقاط PCRE غير مسمّى | تستخدم تعليمة rewrite مجموعات التقاط غير مسمّاة | $1, $2, $3… |
| 2. سلسلة استبدال تحتوي على علامة استفهام | تحتوي سلسلة الاستبدال على المحرف ? | /profile.php?id=$1&tab=$2 |
| 3. وجود rewrite/if/set لاحقة | تتبع تعليمة rewrite تعليمات أخرى مباشرة | rewrite … last; if (…) { … } |
مثال لإعداد قابل للاستغلال
# 易受攻击配置
rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last;
# 后跟其他指令
if ($arg_debug) {
set $debug_flag 1;
}
يستوفي هذا الإعداد الشروط الثلاثة معًا:التقاط غير مسمّى $1/$2،سلسلة استبدال تحتوي على ?،وتتبعها تعليمة if.
🔬 مبدأ الثغرة
عدم اتساق الحالة في المعالجة على مرحلتين
محرك البرمجة النصية في NGINX يستخدم المعالجة على مرحلتين:
- المرحلة الأولى: حساب حجم المخزن المؤقت المطلوب
- المرحلة الثانية: نسخ البيانات إلى المخزن المؤقت
جوهر الثغرة فيإدارة خاطئة لعلم is_args:
| المرحلة | حالة is_args | منطق المعالجة | النتيجة |
|---|---|---|---|
| مرحلة حساب الطول | is_args = 0 | إرجاع طول الالتقاط الأصلي | تقدير حجم المخزن المؤقت بأقل من اللازم |
| مرحلة نسخ البيانات | is_args = 1 | استدعاء ngx_escape_uri، يتوسع كل بايت إلى 3 بايتات | تجاوز سعة المخزن المؤقت في الكومة |
سير العمل التفصيلي
- تعليمة rewriteتحتوي على التقاط غير مسمّى $1/$2
- سلسلة الاستبدالتحتوي على ? مما يضبط is_args = 1
- مرحلة حساب الطول: استخدام المحرك الفرعي المُهيأ حديثًا، is_args = 0
- إرجاع الطول الأصلي: تخصيص مخزن مؤقت في الكومة أصغر من اللازم
- مرحلة نسخ البيانات: استخدام المحرك الرئيسي، is_args = 1
- استدعاء ngx_escape_uri: توسيع البايتات وتجاوز سعة المخزن المؤقت
- بيانات URI التي يتحكم بها المهاجمتُكتب في منطقة التجاوز
طريقة الاستغلال
هندسة الكومة عبر الطلبات (Heap Feng Shui):
- جسم طلب POSTبثّ ذاكرة الكومة (لأن URI لا يمكن أن يحتوي على بايتات null)
- بيانات التجاوزإتلاف مؤشر cleanup في ngx_pool_t المجاور
- تزوير ngx_pool_cleanup_s، بحيث يشير إلى system()
- عند تدمير poolيُفعَّل استدعاء system()
- تحقيق RCE
تأثير ASLR
- عند تمكين ASLR: يؤدي فقط إلى انهيار عملية Worker (DoS)
- عند تعطيل ASLR: يمكن تحقيق تنفيذ التعليمات البرمجية عن بُعد (RCE)
📊 الإصدارات المتأثرة
NGINX Open Source
| نطاق الإصدارات | إصدار الإصلاح |
|---|---|
| 0.6.27 – 1.30.0 | 1.31.0, 1.30.1 |
NGINX Plus
| نطاق الإصدارات | إصدار الإصلاح |
|---|---|
| R32 – R36 | R36 P4, R35 P2, R32 P6 |
مكونات أخرى متأثرة
- NGINX Instance Manager: 2.16.0 – 2.21.1
- NGINX App Protect WAF: 4.9.0 – 5.8.0
- NGINX Ingress Controller: 3.5.0 – 5.4.1
- NGINX Gateway Fabric: 1.3.0 – 2.5.1
- F5 DoS for NGINX: 4.8.0
🔥 حالة PoC
PoC متاح للعامة
- مستودع GitHub:https://github.com/DepthFirstDisclosures/Nginx-Rift
- أعادت Qianxin إنتاجه: نجح باحثو الأمن في مركز الاستخبارات التهديدية في إعادة إنتاجه
- التفاصيل التقنية متاحة للعامة: نشرت depthfirst تحليلًا تقنيًا
- الاستغلال في البرية: لم يُرصد حتى الآن
طريقة استخدام PoC
# 构建容器 ./setup.sh # 启动易受攻击的 NGINX 服务器 docker compose -f env/docker-compose.yml up # 执行 PoC 获取 Shell python3 poc.py --shell
✅ خطة الإصلاح
الطريقة 1: ترقية الإصدار
# 升级到修复版本 NGINX Open Source >= 1.31.0 NGINX Open Source >= 1.30.1 NGINX Plus >= R32 P6 NGINX Plus >= R36 P4 # 升级后重启 NGINX nginx -s reload
الطريقة 2: تعديل الإعدادات (إجراء تخفيفي)
استبدالمجموعات الالتقاط غير المسمّاةبـمجموعات الالتقاط المسمّاة:
# 易受攻击配置(未命名捕获) rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last; # 修复后配置(命名捕获) rewrite ^/users/(?[0-9]+)/profile/(?.*)$ /profile.php?id=$user_id&tab=$section last;
مجموعات الالتقاط المسمّاة لا تفعّل الثغرة.
الطريقة 3: فحص الإعدادات
تحقق من وجود إعدادات قابلة للاستغلال:
# 搜索易受攻击的 rewrite 指令 grep -E "rewrite.*\$[0-9]+.*\?.*(rewrite|if|set)" /etc/nginx/nginx.conf grep -rE "rewrite.*\$[0-9]+.*\?.*(rewrite|if|set)" /etc/nginx/conf.d/
🔍 عملية الاكتشاف
اكتشاف بواسطة نظام آلي
depthfirst لديها نظام لتحليل الأمن:
- في غضون 6 ساعاتاكتشف 5 مشكلات
- أكدت NGINX 4 منها
- CVE-2026-42945هي الأشد خطورة
- يعود تاريخها إلى عام 2008، وهي موجودة في جميع الإصدارات القياسية تقريبًا
ثغرات أخرى ذات صلة
- CVE-2026-42946: مشكلة إفساد الذاكرة
- CVE-2026-40701: مشكلة إفساد الذاكرة
- CVE-2026-42934: مشكلة إفساد الذاكرة
📝 الخلاصة
CVE-2026-42945 هي ثغرة خطيرة على نحو غير مسبوق في تاريخ NGINX:
- كامنة منذ 18 عامًا: منذ إدراجها في قاعدة الشيفرة عام 2008
- درجة CVSS 9.2: تجاوز سعة المخزن المؤقت في الكومة قد يؤدي إلى RCE
- شروط التفعيل: تعليمة rewrite بمجموعات التقاط غير مسمّاة + سلسلة استبدال تحتوي على ? + تعليمة لاحقة
- نطاق التأثير: 9.75 مليون موقع حول العالم، منها 2.54 مليون موقع في الصين
- PoC متاح للعامة: مستودع على GitHub + أعادت Qianxin إنتاجه
- خطة الإصلاح: ترقية الإصدار أو استخدام مجموعات الالتقاط المسمّاة
مع انكشاف ثغرة كامنة منذ 18 عامًا، يُنصح بالترقية أو تعديل الإعدادات في أقرب وقت.
الإعلان الرسمي:https://my.f5.com/manage/s/article/K000161019
مستودع PoC:https://github.com/DepthFirstDisclosures/Nginx-Rift
التحليل التقني:https://depthfirst.com/research/nginx-rift