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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-38360 — إعلان: CVE-2026-38360 اجتياز المسار (CWE-22) في dash-uploader (Python/PyPI) | Kitploit
أدوات/GitHubGitHub/a1ohadance/cve-2026-38360
تحليل الثغرات الأمنيةتحليل الكودالاستغلالأمن الويباختبار الاختراقالتعلم والتعليم
GitHuba1ohadance/cve-2026-38360

CVE-2026-38360

إعلان: CVE-2026-38360 اجتياز المسار (CWE-22) في dash-uploader (Python/PyPI)

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

الأكثر شعبية

عرض الكل →

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

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

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

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

CVE-2026-38360: اجتياز المسار في dash-uploader

CVE NVD CWE Severity Patch Auth Version PyPI Downloads

Total Downloads
License

ثغرة اجتياز مسار غير مصادق عليها في fohrloop/dash-uploader (Python، PyPI) تتيح الكتابة العشوائية للملفات، مما يؤدي إلى (على سبيل المثال لا الحصر) تنفيذ التعليمات البرمجية عن بُعد (RCE)، واستبدال الكود المصدري للتطبيق، وXSS مخزّنة، وتثبيت باب خلفي دائم.

⚠️ لا يتوفر أي تصحيح، ولن يُصدر أي تصحيح على الإطلاق

تمت أرشفة المستودع في 2025-07-19 دون وجود مُطوِّر نشط. جميع الإصدارات المنشورة (من 0.1.0 إلى 0.7.0a2) متأثرة وستبقى كذلك. لا تزال الحزمة تحقق حوالي 28,000 تنزيل شهريًا.

يجب على أي شخص يشغّل dash-uploader في بيئة إنتاج تطبيق إجراءً علاجيًا بنفسه. الإصلاح الموصى به هو الانتقال إلى مكوّن dcc.Upload المدمج في Plotly Dash. راجع إجراءات التخفيف للاطلاع على الخيارات الكاملة.

معرّف CVECVE-2026-38360 (NVD)
نوع الثغرةاجتياز المسار (CWE-22)
CVSS 3.19.8 / حرجة (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
المنتجdash-uploader
الإصدارات المتأثرةمن 0.1.0 إلى 0.7.0a2 (جميع الإصدارات الـ18)
الإصدار المُصحَّحلا يوجد (تمت أرشفة المشروع في 2025-07-19)
متجه الهجومعن بُعد، بدون مصادقة
المكتشفMuhammad Fitri Bin Mohd Sultan
مُعيّن بواسطةMITRE، 2026-05-07
ذات صلةCVE-2026-38361 (ثغرة حجب الخدمة DoS في المكتبة نفسها)

الوصف

يتم تمرير ثلاث معاملات يتحكم فيها المستخدم من request.form.get() في dash_uploader/httprequesthandler.py مباشرةً إلى os.path.join() و os.makedirs() دون أي تنقية أو تحقق:

  1. upload_id (السطر 57 → السطر 161، BaseHttpRequestHandler.get_temp_root): يتحكم في دليل الوجهة. يمكن للمهاجم إرسال upload_id=../../../../usr/local/lib/python3.10/site-packages فتُكتب الملفات في دليل حزم Python.

  2. resumableFilename (السطر 51 → السطر 108، BaseHttpRequestHandler._post): يتحكم في اسم الملف النهائي. يمكن للمهاجم الخروج من دليل الرفع عبر اسم الملف حتى مع upload_id شرعي.

  3. resumableIdentifier (السطر 54 → السطر 64، BaseHttpRequestHandler._post): يُستخدم مع os.makedirs() لإنشاء الدليل المؤقت. يمكن للمهاجم إنشاء أدلة عشوائية في أي مكان على نظام الملفات.

لا تتطلب نقطة نهاية الرفع (/API/dash-uploader افتراضيًا) أي مصادقة. يتيح خطاف http_request_handler المُضاف في v0.5.0 إجراء فحوصات ما قبل الطلب عبر post_before()، لكن طريقة _post() المعيبة تقرأ جميع المعاملات مباشرةً من request.form بعد عودة الخطاف. لا يمكن للخطاف تنقية المعاملات قبل معالجتها بواسطة المكتبة. المطوّر الذي يضيف مصادقة عبر الخطاف يظل عرضة لاجتياز المسار من مستخدم مصادَق.

الكود المعيب

root@kitploit:~
# dash_uploader/httprequesthandler.py
def _post(self):
    resumableFilename = request.form.get("resumableFilename", default="error", type=str)
    resumableIdentifier = request.form.get("resumableIdentifier", default="error", type=str)
    upload_id = request.form.get("upload_id", default="", type=str)
    ...
    temp_root = self.get_temp_root(upload_id)                          # upload_id flows in here
    temp_dir = os.path.join(temp_root, resumableIdentifier)            # raw user input -> os.path.join
    if not os.path.isdir(temp_dir):
        os.makedirs(temp_dir)                                          # raw user input -> os.makedirs

def get_temp_root(self, upload_id):
    return os.path.join(self.upload_folder, upload_id)                 # no sanitization: ../../ escapes upload_folder

تتشارك ثلاث نقاط اجتياز مستقلة في السبب الجذري نفسه: تصل قيم النموذج إلى os.path.join و os.makedirs دون أي تحقق.

متجهات الهجوم

يرسل مهاجم عن بُعد غير مصادَق طلب HTTP POST متعدد الأجزاء (multipart) إلى نقطة نهاية الرفع. عن طريق حقن تسلسلات اجتياز المسار (../) في معامل النموذج upload_id، يتحكم المهاجم في دليل الوجهة للملف المرفوع. على سبيل المثال، يؤدي upload_id=../../../../usr/local/lib/python3.10/site-packages إلى كتابة ملفات في دليل حزم Python، مما يتيح تنفيذ التعليمات البرمجية عن بُعد (RCE) عند بدء التشغيل التالي للمفسّر عبر التنفيذ التلقائي لملفات .pth.

لا يلزم أي مصادقة أو رمز جلسة أو رمز CSRF. يوفر معاملان إضافيان (resumableFilename و resumableIdentifier) متجهَي اجتياز مستقلين عبر نقطة النهاية نفسها. التكوين الافتراضي للمكتبة كما هو موضح في وثائق البدء السريع الرسمية قابل للاستغلال بأمر curl واحد.

الأثر

كتابة ملفات عشوائية إلى أي دليل قابل للكتابة بواسطة عملية الخادم. يترجم هذا إلى تنفيذ التعليمات البرمجية عن بُعد (RCE) عبر عدة آليات معروفة:

آليات RCE

  • إسقاط ملف .pth بلغة Python في site-packages. ينفّذ كودًا يوفره المهاجم عند بدء التشغيل التالي للمفسّر.
  • حقن sitecustomize.py أو usercustomize.py. يُنفَّذ عند كل بدء تشغيل لـ Python.
  • استبدال وحدة Python قابلة للاستيراد في دليل حزم التطبيق. يُنفَّذ عند الاستيراد التالي أو إعادة تدوير العامل (worker).
  • استبدال نقطة الدخول WSGI/ASGI (مثل app.wsgi و wsgi.py). يُنفَّذ عند إعادة تحميل العامل التالية.
  • إسقاط ملف في مجلدات Cron (/etc/cron.d/، /etc/cron.hourly/، رصة crontab الخاصة بالمستخدم) عندما تتمتع العملية بالصلاحيات اللازمة. تنفيذ مجدول.
  • إسقاط وحدات systemd أو وحدات مستخدم (/etc/systemd/system/، ~/.config/systemd/user/). يُنفَّذ عند بدء الخدمة التالي أو إعادة التشغيل.
  • حقن /etc/ld.so.preload عندما تعمل العملية بصلاحيات الجذر (root). يحمّل كود المهاجم مسبقًا في كل تنفيذ ثنائي لاحق.
  • استبدال ملفات بدء تشغيل الصدفة (~/.bashrc، ~/.profile، ~/.bash_profile). يُنفَّذ عند تسجيل الدخول التفاعلي التالي لمستخدم التطبيق.
  • إلحاق بـ ~/.ssh/authorized_keys. يمنح وصول SSH دائمًا إلى المضيف بصلاحيات مستخدم التطبيق.

الأثر على مستوى الويب

  • برمجة نصية عبر المواقع مخزّنة (Stored XSS) على نطاق المضيف عن طريق استبدال JavaScript المُقدَّم (على سبيل المثال، JS الخاصة بإطار Dash في site-packages)، مما يؤثر على كل مستخدم عند كل تحميل صفحة حتى تتم إعادة تشغيل التطبيق.
  • استبدال الكود المصدري للتطبيق (باب خلفي صامت ودائم ينجو من عمليات النشر العادية عندما لا تستبدل آلية النشر المسارات المتأثرة بالكامل).

الأثر على نظام الملفات

  • إنشاء أدلة عشوائية في أي مكان يمكن للعملية الوصول إليه، عبر os.makedirs() مع معامل resumableIdentifier غير المنقّى (قابل للاستخدام لاستنزاف inode أو لتهيئة كتابات في أشجار أدلة غير موجودة).
  • استبدال ملفات عبر المستخدمين في أدلة رفع مشتركة، مما يؤدي إلى تسميم البيانات بين مستأجري التطبيق نفسه.

المكوّن المتأثر

  • dash_uploader/httprequesthandler.py
  • BaseHttpRequestHandler.get_temp_root()
  • BaseHttpRequestHandler._post()

إجراءات التخفيف

⚠️ لا يتوفر أي تصحيح، والمشروع مؤرشف

الخيارات المتاحة للمستخدمين الذين لديهم نسخ منصوبة حاليًا، مرتبة حسب الأفضلية:

  1. الانتقال إلى dcc.Upload، مكوّن الرفع الرسمي المرفق مع Plotly Dash. تصل الملفات إلى دالة الاستدعاء (callback) كسلسلة base64؛ لا يوجد معالج للكتابة على نظام الملفات مكشوف ولا يوجد مسار وجهة يتحكم فيه العميل، لذلك لا تنطبق فئة الثغرة هذه. الأنسب للملفات الصغيرة والمتوسطة. بالنسبة للملفات الكبيرة جدًا، انظر البند 2.
  2. بناء معالج رفع Flask صغير باستخدام werkzeug.utils.secure_filename() ودليل وجهة ثابت في الخادم. لا تقبل أبدًا قيم upload_id أو اسم الملف أو المعرّف المقدمة من العميل كمكوّنات للمسار.
  3. في حال الاستمرار في استخدام dash-uploader، ضع نقطة نهاية الرفع خلف مصادقة وتحقق من upload_id و resumableFilename و resumableIdentifier مقابل قائمة مسموح بها صارمة (مثل UUID فقط) في طبقة تعيد كتابة الطلب أو ترفضه قبل أن يراه معالج المكتبة. خطاف http_request_handler الخاص بالمكتبة لا يمنع الاجتياز لأن المعاملات تُقرأ من request.form بعد عودة الخطاف؛ يجب أن تتم التنقية فوق المكتبة.
  4. في طبقة الوكيل العكسي أو جدار حماية تطبيقات الويب (WAF)، ارفض أي طلب إلى نقطة نهاية الرفع يحتوي فيه أي حقل نموذج على .. أو صيغ مشفّرة (%2e%2e، ..%2f، %2e%2e%2f) أو مسارات مطلقة.

الجدول الزمني للإفصاح

التاريخالحدث
2026-03-17اكتُشفت الثغرة أثناء بحث أمني على نسخة إنتاج منصوبة.
2026-03-19أُرسل طلب CVE إلى MITRE.
2026-05-07تم تعيين CVE-2026-38360 بواسطة MITRE.
2026-05-07نُشرت النشرة الأمنية العامة.
2026-05-09نُشر سجل CVE في قاعدة بيانات CVE التابعة لـ MITRE و NVD.

سياق الحزمة

  • حوالي 28,000 تنزيل شهريًا على PyPI (27,756 في الأيام الـ30 السابقة لـ 2026-05-07، مع حجم يومي مستمر رغم أرشفة المستودع). المصدر: pypistats.org.
  • أحدث إصدار منشور: 0.6.1 (السلسلة المستقرة). الإصدارات الأولية (pre-releases) تمتد إلى 0.7.0a2.
  • الاعتماد الأساسي: dash. الاعتماد الاختياري: pyyaml. الرخصة: MIT.
  • 11 حزمة تابعة و6 مستودعات تابعة.
  • 153 نجمة على GitHub.
  • تمت أرشفة المستودع في 2025-07-19 (Issue #153).
  • لا توجد ثغرات CVE سابقة (تم التحقق من NVD وقاعدة بيانات GitHub الاستشارية وSnyk وOSV في 2026-03-19).

المراجع

  • https://www.cve.org/CVERecord?id=CVE-2026-38360
  • https://nvd.nist.gov/vuln/detail/CVE-2026-38360
  • https://github.com/fohrloop/dash-uploader
  • https://pypi.org/project/dash-uploader/
  • https://pypistats.org/packages/dash-uploader
  • https://github.com/fohrloop/dash-uploader/blob/stable/dash_uploader/httprequesthandler.py
  • https://github.com/fohrloop/dash-uploader/blob/dev/dash_uploader/httprequesthandler.py
  • https://github.com/fohrloop/dash-uploader/issues/153
  • https://cwe.mitre.org/data/definitions/22.html

المكتشف

Muhammad Fitri Bin Mohd Sultan

تنزيل الأداة