
بيئة مختبرية قائمة على Docker للتحقق واستغلال ثغرات API غير موثقة (CVE-2026-42221, CVE-2026-42238) في nginx-ui، مع مقارنة الإصدارات المصححة وكتيب تعليمي.
هذا المستودع للتحقق الفعلي من ثغري CVE تم الإبلاغ عنهما لـ nginx-ui (أداة إدارة الواجهة الرسومية لـ Nginx) في بيئة Docker.
إخلاء مسؤولية
محتوى التحقق في هذا المستودع موجه فقط للبيئة المحلية المعزولة التي تديرها أنت.
استخدام أساليب مماثلة على أنظمة طرف ثالث غير مصرح به يعد انتهاكًا لقانون منع الوصول غير المصرح به.
تم تلخيص عملية التحقق والملاحظات والدروس المستفادة في مقال على Qiita.
جربت ثغرات CVE في nginx-ui فعليًا: ظننتها 'ثغرة' فإذا هي قصة تصميم
| CVE | الوصف | الإصدار المتأثر | الإصدار المُصحَّح |
|---|
| CVE-2026-42221 | /api/install قبل الإعداد يمكن الوصول إليه بدون مصادقة. يمكن للمهاجم تسجيل حساب مسؤول مسبقًا | v2.3.7 فما قبله | v2.3.8 |
| CVE-2026-42238 | /api/restore قبل الإعداد يمكن الوصول إليه بدون مصادقة. بحقن app.ini خبيث يمكن تنفيذ أوامر عشوائية بصلاحيات root | v2.3.7 فما قبله | v2.3.8 |
كلا الثغرتين لهما سبب جذري واحد (نوافذ API قبل الإعداد غير محمية)، وفي الإصدار v2.3.8 تم إصلاح كلاهما عن طريق إضافة وسيط واحد مع إدخال طريقة سر التثبيت.
.
├── nginx_lab/ # بيئة التحقق للإصدار الضعيف (v2.3.7) ← port 8080
│ ├── Dockerfile # تعريف الصورة مع إعدادات أولية لتجنب حلقة التشغيل
│ ├── docker-compose.yml
│ ├── nginx.conf # إعدادات مُصحَّحة لكتل sites-enabled / stream
│ ├── init-app.ini # قالب app.ini الأولي
│ └── entrypoint.sh # سكريبت التهيئة عند بدء الحاوية
├── nginx_lab_patched/ # بيئة التحقق للإصدار المُصحَّح (v2.3.8) ← port 8081
│ ├── Dockerfile
│ ├── docker-compose.yml
│ ├── nginx.conf
│ ├── init-app.ini
│ └── entrypoint.sh
├── scripts/
│ ├── exploit_42221.py # سكريبت الهجوم لـ CVE-2026-42221
│ ├── encrypt_password.py # أداة لتشفير RSA
│ └── test_patched.py # سكريبت للتحقق من تطبيق التصحيح على port 8081 (v2.3.8)
├── Qiita.md # مسودة مقال Qiita
└── 学習プラン.md
pycryptodomepip install pycryptodome
cd nginx_lab
docker compose build
docker compose up -d
التحقق من التشغيل:
curl http://localhost:8080/api/install
# → إذا تم إرجاع {"lock":false,"timeout":false} فهو جيد
نقطة صعبة: صورة
uozi/nginx-ui:v2.3.7الأصلية ستقع في حلقة تشغيل إذا استخدمت كما هي. لأن الدلائل مثلsites-enabledغير موجودة. تم إعدادها مسبقًا في ملف Dockerfile لهذا المستودع.
cd scripts
python exploit_42221.py
عند النجاح، يمكنك تسجيل الدخول إلى http://localhost:8080 باستخدام حساب attacker.
cd nginx_lab_patched
docker compose build
docker compose up -d
في v2.3.8، الإعداد الأولي يتطلب سر التثبيت. بعد تشغيل الحاوية، تحقق من السر.
docker exec nginx-ui-patched cat /etc/nginx-ui/.install_secret
في شاشة الإعداد http://localhost:8081، استخدم هذه القيمة لتسجيل المسؤول.
cd scripts
python test_patched.py
إذا تم إخراج [OK] فشل الهجوم (مُصحَّح)، فإن التصحيح يعمل بشكل صحيح.
# الإصدار الضعيف
cd nginx_lab
docker compose down -v
# الإصدار المُصحَّح
cd nginx_lab_patched
docker compose down -v