Skip to content
KitploitKITPLOIT
أدواتالمدونة
Log in
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-42945 — مستودع أبحاث كامل لثغرة CVE-2026-42945 مع تحليل تجاوز سعة المخزن المؤقت في الكومة (heap buffer overflow)، واستغلال RCE (heap spray + Feng Shui)، وسكربتات كشف، وإرشادات تصحيح لثغرة وحدة إعادة الكتابة (rewrite module) في NGINX. | Kitploit
أدوات/GitHubGitHub/quantumworld-dpdns-io/cve-2026-42945
تحليل الثغرات الأمنيةالاستغلالأمن الويبالاختبار العشوائياختبار الاختراقالتعلم والتعليمالاستجابة للحوادثاستغلال الملفات الثنائيةمختبرات وتدريب عملي
GitHubquantumworld-dpdns-io/cve-2026-42945

CVE-2026-42945

مستودع أبحاث كامل لثغرة CVE-2026-42945 مع تحليل تجاوز سعة المخزن المؤقت في الكومة (heap buffer overflow)، واستغلال RCE (heap spray + Feng Shui)، وسكربتات كشف، وإرشادات تصحيح لثغرة وحدة إعادة الكتابة (rewrite module) في NGINX.

عرض المستودع
13منذ 4 أشهرلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة
Screenshot 2026-05-28 at 4 09 53 PM

CVE-2026-42945 — NGINX Rift

تجاوز سعة المخزن المؤقت في الكومة (Heap Buffer Overflow) في وحدة ngx_http_rewrite_module الخاصة بـ NGINX

المقياسالقيمة
CVSS v4.09.2 (حرج)
CVSS v3.18.1 (عالي) — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CWE122 — تجاوز سعة المخزن المؤقت في الكومة
التاريخ المقدَّميونيو 2008 — v0.6.27
الاكتشافأبريل 2026 — أبحاث DepthFirst
الإصلاح13 مايو 2026 — v1.30.1, v1.31.0
نشر CVE21 مايو 2026
العمر~18 عامًا (غير مكتشف)
التزام الإصلاح524977e7c534e87e5b55739fa74601c9f1102686

جدول المحتويات

  1. ملخص الثغرة
  2. تحليل السبب الجذري
  3. آلية الاستغلال
  4. تحليل الإصلاح
  5. الإصدارات المتأثرة
  6. الاكتشاف
  7. التخفيف
  8. بنية المشروع
  9. البدء السريع
  10. البناء والتشغيل بالإصدار الثغري
  11. تشغيل تجاوز السعة
  12. استغلال RCE
  13. التحقق من الصدفة العكسية
  14. تصحيح الثغرة
  15. الاختبار
  16. الفحص بالتشويش (Fuzzing)
  17. خط أنابيب CI
  18. فهرس التوثيق
  19. إحصائيات المشروع
  20. المراجع

1. ملخص الثغرة

يمكن لمهاجم عن بُعد وغير مصادَق أن يسبب تجاوز سعة مخزن مؤقت حتميًا في الكومة في عمليات عمل NGINX عن طريق إرسال طلب HTTP مصمم بعناية إلى خادم يستخدم نمط تكوين محدد يجمع بين rewrite وset/if/rewrite. يؤدي هذا التجاوز إلى إفساد بيانات تعريف الكومة (مؤشرات ngx_pool_cleanup_t)، مما يتيح تنفيذ التعليمات البرمجية عن بُعد (RCE) عبر تقنيات حقن الكومة (heap spray) وتعديل تخطيط الكومة (Feng Shui).

نمط التشغيل (Trigger Pattern)```nginx

server { listen 19321;

location ~ ^/api/(.*)$ {
    rewrite ^/api/(.*)$ /internal?migrated=true;
    set $original_endpoint $1;
}

}

**Key requirements:**
- توجيه `rewrite` يحتوي بديله على `?` (فاصل سلسلة الاستعلام)
- توجيه `set` أو `if` أو `rewrite` لاحق يشير إلى **التقاط PCRE غير مُسمّى** (`$1`، `$2`، إلخ.)
- علامة `?` في بديل `rewrite` تؤدي إلى تشغيل `ngx_http_script_start_args_code` الذي يضبط `e->is_args = 1`

### ما يمكن أن يحققه المهاجم

| Capability | Description |
|-----------|-------------|
| **رفض الخدمة** | تعطل عمليات العامل بشكل حتمي، مما يسبب حلقات إعادة تشغيل (تعمل بغض النظر عن ASLR) |
| **تنفيذ التعليمات البرمجية عن بُعد** | مع تعطيل ASLR (أو تجاوزه عبر الكتابة الجزئية الفوقية)، يمكن تحقيق RCE كاملة كمستخدم nginx |
| **سرقة البيانات** | عبر بدائيات قراءة الذاكرة، يمكن استخراج بيانات حساسة من كومة العامل |
| **الثبات** | زرع أبواب خلفية عبر تنفيذ التعليمات البرمجية في ذاكرة عملية العامل |

---

## 2. تحليل السبب الجذري

### محرك البرمجة النصية ثنائي المرور

تستخدم وحدة `ngx_http_rewrite_module` في NGINX **محرك برمجة نصية ثنائي المرور** في `src/http/ngx_http_script.c`:

1. **مرحلة الطول** (`ngx_http_script_run`): يتكرر عبر جميع أكواد البرمجة النصية لحساب الحجم الإجمالي المطلوب للمخزن المؤقت. يكتب الأطوال إلى `le.ip` و `le.pos`.
2. **مرحلة النسخ** (`ngx_http_script_copy_len`/`_code`): يتكرر مرة أخرى، ويكتب البايتات الفعلية في المخزن المؤقت المخصص مسبقًا عند `e->ip` و `e->pos`.

كل كود برمجي له معالِجان: واحد لكل مرحلة. على سبيل المثال:
- `ngx_http_script_copy_len` → `ngx_http_script_copy_code`
- `ngx_http_script_start_args_len` → `ngx_http_script_start_args_code`

### علامة `is_args`

تتحكم العلامة `e->is_args` في **بنية المحرك** (`ngx_http_script_engine_t`) في كيفية تعامل مرحلة النسخ مع أحرف معينة:```c
typedef struct {
    u_char                  *ip;
    u_char                  *pos;
    ngx_http_variable_value_t *sp;
    ngx_str_t               buf;
    int                     flushed;
    unsigned                is_args:1;    // <-- THE BUG
    unsigned                ncaptures:1;
    ngx_uint_t              captures_size;
    // ...
} ngx_http_script_engine_t;

عندما تكون e->is_args = 1، يستدعي كود النسخ لمراجع الالتقاط $N الدالة ngx_escape_uri() مع NGX_ESCAPE_ARGS، والتي تقوم بتوسيع:

  • + → %2B (1 بايت → 3 بايتات، +200%)
  • % → %25 (1 بايت → 3 بايتات، +200%)
  • & → %26 (1 بايت → 3 بايتات، +200%)

الخطأ: تسرب العلامة عبر التمريرات

مسار التنفيذ للنمط القابل للاستغلال:``` rewrite ^/api/(.*)$ /internal?migrated=true;

1. أثناء **تقييم إعادة الكتابة**، يصادف المحرك `?` في سلسلة الاستبدال، مما يؤدي إلى تشغيل `ngx_http_script_start_args_code`، وضبط `e->is_args = 1`.
2. تقوم إعادة الكتابة بتعديل URI الخاص بالطلب ثم تتابع إلى التوجيه التالي.
3. **لا يتم مسح `e->is_args` أبدًا**.

ثم:```
set $original_endpoint $1;
  1. يتم إنشاء محرك فرعي جديد (le) لتمرير الطول: ```c ngx_memzero(&le, sizeof(ngx_http_script_engine_t));

هذا يصفّر le.is_args = 0 بشكل صحيح، لذا فإن تمريرة الطول تُرجع طول الالتقاط الخام غير المُرمَّز.

  1. تعيد تمريرة النسخ استخدام المحرك الرئيسي e، الذي ما يزال يحتوي على e->is_args = 1 من الخطوة 1. تطبّق تمريرة النسخ ترميز URI، مما يوسّع كل حرف قابل للترميز من 1 بايت إلى 3 بايتات داخل مخزن مؤقت تم تحديد حجمه ليتسع للطول الخام — تجاوز سعة الكومة.

شرح مرئي```

Pass 1 (Length — sub-engine le): le.is_args = 0 capture $1 = "A+++++B" → length = 7

Buffer allocated: 7 bytes

Pass 2 (Copy — main engine e): e.is_args = 1 ← LEAKED from rewrite capture $1 = "A+++++B" ngx_escape_uri("A+++++B", NGX_ESCAPE_ARGS): A → A (1 byte) + → %2B (3 bytes) ← EXPANSION + → %2B (3 bytes) + → %2B (3 bytes) + → %2B (3 bytes) + → %2B (3 bytes) B → B (1 byte) total written: 17 bytes buffer size: 7 bytes OVERFLOW: 10 bytes

نسبة التوسع هي `7 + (n_escapable * 2)` حيث `n_escapable` هو عدد `+` و`%` و`&` في الالتقاط.

---

## 3. آليات الاستغلال

### نظرة عامة

| الخطوة | التقنية | الوصف |
|------|-----------|-------------|
| 1 | تجاوز السعة | أرسل URI مصنوعًا بحشو `+` لتجاوز سعة مخزن الكومة المؤقت |
| 2 | رش الكومة | أرسل طلبات POST بأجسام كبيرة إلى `/spray` لملء الكومة ببيانات مُتحكم بها |
| 3 | فنغ شوي | رتّب التخصيصات بحيث يكون هدف التجاوز (`ngx_pool_cleanup_t`) مجاورًا |
| 4 | إفساد المعالج | يستبدل التجاوز `ngx_pool_cleanup_t.handler` بعنوان `system()` |
| 5 | تفعيل التنظيف | انتظر تدمير التجمع → ينفّذ `system(cmd)` أمر المهاجم |
| 6 | الصدفة العكسية | سلسل إلى حمولة صدفة عكسية للوصول التفاعلي |

### فنغ شوي عبر الطلبات

**يفشل فنغ شوي أحادي الطلب** لأن التجاوز يُفسد البيانات الوصفية للتجمع (`->d.next`, `->d.failed`) قبل الوصول إلى مؤشر `cleanup`. عندما يُدمَّر التجمع في نهاية الطلب، تتسبب البيانات الوصفية المُفسدة في **تعطل قبل استدعاء `system()`**.

بدلاً من ذلك، يستخدم الاستغلال **فنغ شوي عبر الطلبات**:
1. **الطلب 1 (رش)**: أرسل جسمًا كبيرًا عبر POST إلى `/spray`. يُبقي الخادم الخلفي (`server.py`) الاستجابة مع ترويسة `X-Delay`، مما يُبقي الاتصال مفتوحًا ويُحافظ على تخصيص الكومة. يملأ الرشّ الكومة بكتل `ngx_pool_cleanup_t` مزيفة.
2. **الطلب 2 (تجاوز)**: أرسل URI الخاص بالتجاوز. يُفسد التجاوز مؤشر `cleanup` فقط (وليس البيانات الوصفية للتجمع)، موجّهًا إياه إلى الكتلة المزيفة المُرَشّة.
3. **تدمير التجمع**: عندما تكتمل استجابة الرشّ (تنتهي المهلة)، تنتقل سلسلة التنظيف الخاصة بالتجمع إلى الكتلة المزيفة وتستدعي `system(cmd)`.

### متطلبات العناوين

| الرمز | القيمة (Docker، ASLR معطّل) | الوصف |
|--------|--------------------------|-------------|
| `HEAP_BASE` | `0x555555659000` | قاعدة كومة nginx |
| `system@libc` | `0x7ffff6f6e420` | `system()` في glibc |
| `NGX_CYCLES_POOL` | `0x5555556a4040` | مؤشر إلى تجمع cycles |
| عنوان التنظيف المزيف | `0x5555556a4030` | عنوان هدف الرش |
تنزيل الأداة