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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-65320-fastcore — يوثّق CVE-2026-65320، وهو اجتياز مسار tar-slip في untar_dir() الخاص بـ fastcore، مع إثبات مفهوم غير ضار يوضح الكتابة التعسفية للملفات وتنفيذ التعليمات البرمجية. | Kitploit
أدوات/GitHubGitHub/rahulreddykarne/cve-2026-65320-fastcore
تحليل الثغرات الأمنيةتحليل الكودالاستغلالاستغلال تطبيقات الويبالأوراق والأبحاثالتعلم والتعليم
GitHubrahulreddykarne/cve-2026-65320-fastcore

CVE-2026-65320-fastcore

يوثّق CVE-2026-65320، وهو اجتياز مسار tar-slip في untar_dir() الخاص بـ fastcore، مع إثبات مفهوم غير ضار يوضح الكتابة التعسفية للملفات وتنفيذ التعليمات البرمجية.

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

الأكثر شعبية

عرض الكل →

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

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

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

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

CVE-2026-65320: اجتياز المسار (Tar Slip) في fastcore عبر untar_dir()

الخطورة: حرجة، CVSS 3.1 9.8

المتجه (v3.1): CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H

المتأثر: fastcore <= 2.2.30

تم الإصلاح في: لم يتم الإصلاح وقت كتابة هذا التقرير

CWE: CWE-22 (التقييد غير الصحيح لاسم المسار إلى دليل محظور، 'اجتياز المسار')

المكوّن: fastcore.xtras.untar_dir() → fastcore.xtras._unpack() → shutil.unpack_archive()

بيئة التشغيل عالية الخطورة: Python < 3.14 (يجعل Python 3.14 مرشّح tar الآمن data هو الافتراضي)

أبلغ عنه: Rahul Karne

CNA: VulnCheck


الملخص

fastcore.xtras.untar_dir(fname, dest) هي دالة مساعدة موثّقة تقوم بفك ضغط أرشيف tar "إلى dest".

داخليًا، تقوم بتمرير الأرشيف إلى shutil.unpack_archive() من المكتبة القياسية دون مرشّح استخراج، ودون التحقق من مسارات أعضاء الأرشيف، ودون أي فحص احتواء بعد الاستخراج.

ونتيجة لذلك، يمكن لأرشيف TAR يحتوي أعضاؤه على تسلسلات اجتياز ../ أو مسارات مطلقة أن يكتب ملفات خارج الدليل الذي طلب المتصل من fastcore الاستخراج إليه.

المتصل الذي يتوقع بشكل معقول أن untar_dir(fname, dest) ستحصر كل شيء داخل dest يحصل بدلاً من ذلك على كتابة ملفات عشوائية في أي مكان يمكن للعملية الكتابة فيه.


التأثير

كتابة ملفات عشوائية تحت صلاحية العملية التي تستدعي untar_dir().

اعتمادًا على ما يتم استبداله، يمكن أن يؤدي ذلك إلى:

  • تنفيذ التعليمات البرمجية — استبدال ملف Python يستورده التطبيق لاحقًا، مثل إضافة أو خطاف بدء تشغيل أو وحدة قابلة للاستيراد، أو إسقاط ملف في موقع يتم تحميله تلقائيًا.
  • التلاعب بالبيانات / الإعدادات — استبدال ملفات الإعدادات أو بيانات الاعتماد أو بيانات التطبيق.
  • حجب الخدمة — إتلاف الملفات التي تعتمد عليها الخدمة.

يوضّح إثبات المفهوم سلسلة الكتابة → الاستيراد → تنفيذ التعليمات البرمجية كاملة من البداية إلى النهاية، بالكامل داخل دليل تجريبي غير ضار.


الانتشار

fastcore هي تبعية أساسية في منظومة fast.ai بأكملها، بما في ذلك:

  • fastai
  • nbdev
  • ghapi
  • حزم أخرى ذات صلة

وهي تتلقى عشرات الملايين من التنزيلات شهريًا.

untar_dir() هي البدائية الأساسية للاستخراج وراء سير العمل الشائع "تنزيل أرشيف، ثم فك ضغطه"، والذي يتبع نفس النمط العام لـ untar_data في fastai.

أي مسار برمجي يغذّي untar_dir() بأرشيف لا تكون محتوياته موثوقة بالكامل يكون معرّضًا للخطر.


التفاصيل التقنية

توجد التعليمات البرمجية المعرّضة للخطر في fastcore/xtras.py:

root@kitploit:~
def _unpack(fname, out):
    import shutil
    shutil.unpack_archive(str(fname), str(out))   # <-- no filter, no validation
    ls = out.ls()
    return ls[0] if len(ls) == 1 else out


def untar_dir(fname, dest, rename=False, overwrite=False, uid=-1, gid=-1):
    "untar `file` into `dest` ..."
    import tempfile, shutil
    dest = Path(dest)

    with tempfile.TemporaryDirectory() as d:
        out = Path(d) / remove_suffix(Path(fname).stem, '.tar')
        out.mkdir()

        ...

        src = _unpack(fname, out)      # extraction escapes `out` here

        ...

        shutil.move(str(src), dest)

        ...

        return dest

تنشئ untar_dir() دليل استخراج مؤقت داخلي:

root@kitploit:~
<tempdir>/<random>/<archive-stem>/

ثم تستدعي _unpack()، التي تمرّر الأرشيف مباشرة إلى:

root@kitploit:~
shutil.unpack_archive()

بالنسبة لأرشيفات TAR، يستدعي هذا في النهاية tarfile.extractall().

على Python < 3.14، يكون سلوك الاستخراج الافتراضي هو fully_trusted، مما يعني أنه يمكن احترام الأعضاء المتجاوزة.

على سبيل المثال، عضو أرشيف مثل:

root@kitploit:~
../../../some/other/dir/file

يُكتب نسبةً إلى دليل الاستخراج وبالتالي يمكنه الهروب منه.

لا شيء في fastcore:

  • يمرّر filter="data" حيث يكون مدعومًا.
  • يرفض المسارات المطلقة.
  • يرفض مسارات حرف محرك الأقراص.
  • يرفض مسارات UNC.
  • يرفض مكوّنات المسار ...
  • يرفض أعضاء الروابط الرمزية أو الروابط الصلبة.
  • يتحقق من أن كل مسار مستخرج بقي تحت جذر الاستخراج المقصود قبل إرجاع النجاح.

السبب الجذري

تتعامل untar_dir() مع shutil.unpack_archive() كما لو كانت مستخرج أرشيف آمنًا ومعزولاً.

لكنها ليست كذلك.

تحذّر وثائق مكتبة Python القياسية من أن استخراج الأرشيفات غير الموثوقة قد ينشئ ملفات خارج الوجهة المطلوبة، وتوصي بترشيح الاستخراج الآمن لأرشيفات TAR.

لا تمرّر fastcore مرشّح استخراج مناسبًا ولا تنفّذ حارس احتواء مكافئًا لإصدارات Python التي تدعمها.

كما أنها لا تحذّر المتصلين بـ untar_dir() من هذا السلوك الحساس أمنيًا.


لماذا مسار TAR تحديدًا

يمكن أن تحتوي أعضاء TAR على سلاسل مسارات عشوائية.

على إصدارات Python المتأثرة، لا يقوم tarfile.extractall() بتحييد تسلسلات اجتياز .. تلقائيًا بشكل افتراضي.

لذلك، فإن كتابة عضو متجاوز نسبةً إلى دليل الاستخراج المؤقت في fastcore كافية للهروب من ذلك الدليل والكتابة في أي مكان تملك العملية صلاحية الكتابة فيه.

البدائية الموثوقة هي الاجتياز النسبي مثل:

root@kitploit:~
../../../target/file

وهذه هي التقنية المستخدمة في إثبات المفهوم.


التسليم عبر الشبكة

المدخل الخطير هو محتويات الأرشيف، وليس مسار الوجهة الذي اختاره المطوّر.

غالبًا ما يتم الحصول على الأرشيفات من مواقع خارجية أو شبه موثوقة، بما في ذلك:

  • حزم النماذج
  • أرشيفات مجموعات البيانات
  • حزم الإضافات
  • مخرجات CI/CD
  • تحميلات المستخدمين
  • تحميلات الشركاء
  • التنزيلات عبر HTTP عن بُعد

لذلك، أي خدمة أو أداة تنزّل أرشيفًا من مصدر غير موثوق أو شبه موثوق ثم تعالجه باستخدام untar_dir() قد تكون قابلة للوصول.

يتضمن إثبات المفهوم أيضًا نسخة تقدّم الأرشيف المُصمَّم من نقطة نهاية HTTP يتحكم بها المهاجم لتوضيح مسار التسليم هذا.


شروط الاستغلال المسبقة

يتطلب الاستغلال الناجح:

  1. أن يستدعي التطبيق fastcore.xtras.untar_dir() على أرشيف تكون محتوياته متأثرة بالمهاجم، مثل أرشيف مرفوع أو منزّل أو غير موثوق بأي شكل آخر.

  2. أن تستخدم بيئة التشغيل Python < 3.14، أو أي إعداد آخر لا يُفرض فيه مرشّح استخراج TAR آمن.

  3. للتصعيد من كتابة ملفات عشوائية إلى تنفيذ التعليمات البرمجية، يجب أن يستورد أو يحمّل التطبيق لاحقًا ملفًا من موقع يمكن الوصول إليه عبر الاجتياز، مثل:

    • دليل إضافات
    • وحدة Python قابلة للاستيراد
    • خطاف بدء تشغيل
    • موقع آخر لملف يتم تحميله تلقائيًا

تتطلب كتابة الملفات العشوائية وتعديل الإعدادات/البيانات الشرطين 1 و2 فقط.


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

يستدعي poc_fastcore_cna_demo.py واجهة fastcore.xtras.untar_dir() الحقيقية.

العرض غير ضار عن قصد.

كل ملف ينشئه إثبات المفهوم يبقى داخل دليل تجريبي واحد يُحدَّد باستخدام:

root@kitploit:~
--demo-root

لا يعدّل إثبات المفهوم ملفات نظام حقيقية ولا يصل إلى خدمات سحابية أو بيانات اعتماد.

ما الذي يفعله إثبات المفهوم

  1. يطبع تفاصيل البيئة والتعليمات البرمجية المعرّضة للخطر الخاصة بـ _unpack() و untar_dir().

  2. ينشئ تخطيطًا تجريبيًا يحتوي على:

    • جذر استخراج مقصود
    • دليل تطبيق منفصل:
      root@kitploit:~
      service_app/plugins/
      
  3. ينشئ:

root@kitploit:~
attacker_supplied_upload.tar

يحتوي على أعضاء أرشيف مصمّمة للإشارة خارج جذر الاستخراج المقصود، بما في ذلك أعضاء الاجتياز و:

root@kitploit:~
service_app/plugins/startup_hook.py
  1. يستدعي معالج تحميل محاكى:
root@kitploit:~
def auto_extract_uploaded_archive(received_archive):
    return untar_dir(
        received_archive,
        intended_root,
        overwrite=True
    )
  1. يتحقق من أن الملفات كُتبت خارج دليل الاستخراج المقصود.

  2. يحاكي إعادة تحميل الخدمة باستيراد الملف المكتوب من الأرشيف:

root@kitploit:~
startup_hook.py

ينشئ خطاف بدء التشغيل غير الضار:

root@kitploit:~
SERVICE_RELOAD_MARKER

يوضّح هذا السلسلة الكاملة:

root@kitploit:~
Attacker-controlled archive
        ↓
Path traversal during extraction
        ↓
Arbitrary file write
        ↓
Write into importable / auto-loaded location
        ↓
Application loads attacker-controlled file
        ↓
Code execution

الإعداد

ثبّت الحزمة المتأثرة:

root@kitploit:~
pip install fastcore

تم تأكيد المشكلة عبر:

root@kitploit:~
fastcore 2.2.30

يمكن تشغيل العرض مقابل أي من:

  • نسخة fastcore المثبّتة عبر pip
  • شجرة مصدرية مستخرجة محليًا يتم اختيارها باستخدام --source

تبقى جميع كتابات إثبات المفهوم داخل الدليل المحدد عبر --demo-root.


التشغيل

نظّف أي مخرجات سابقة لإثبات المفهوم:

root@kitploit:~
python poc_fastcore_cna_demo.py --demo-root ./poc_fastcore --clean

شغّل العرض:

root@kitploit:~
python poc_fastcore_cna_demo.py \
  --demo-root ./poc_fastcore \
  --source latest \
  --no-pause

المخرجات المتوقعة

مثال على مخرجات مختصرة:

root@kitploit:~
fastcore version:  2.2.30

Outside marker exists after extraction? True
Is outside marker inside intended extraction root? False

Relative traversal marker exists after extraction? True
Is relative traversal marker inside intended extraction root? False

Service plugin file exists after extraction? True
Service reload marker exists? True

POC WORKED: fastcore extracted attacker-controlled tar members outside the intended root.

المعالجة

لمشرفي fastcore

1. استخدام ترشيح استخراج TAR الآمن

على إصدارات Python المدعومة، استخدم مرشّح استخراج آمن مثل:

root@kitploit:~
filter="data"

مع shutil.unpack_archive() أو عملية استخراج tarfile المقابلة.


2. التحقق من أعضاء الأرشيف قبل الاستخراج

يجب فحص كل عضو أرشيف قبل الاستخراج.

ارفض:

  • المسارات المطلقة
  • مسارات حرف محرك الأقراص في Windows
  • مسارات UNC
  • المسارات التي تحتوي على ..
  • الروابط الرمزية غير الآمنة
  • الروابط الصلبة غير الآمنة

يجب أيضًا تحليل أهداف الروابط والتحقق منها قبل الاستخراج.


3. فرض احتواء الاستخراج

حلّل كل مسار وجهة قبل الكتابة وتحقق من أنه يبقى تحت جذر الاستخراج المقصود.

مفاهيميًا:

root@kitploit:~
resolved_member_path
        ↓
must remain inside
        ↓
resolved_extraction_root

يجب أن يفشل الاستخراج إذا هربت الوجهة المحلّلة من جذر الاستخراج.


4. إضافة اختبارات الانحدار

يجب أن تغطي اختبارات الانحدار على الأقل:

root@kitploit:~
../ traversal
absolute paths
Windows drive-letter paths
UNC paths
symbolic links
hard links

5. توثيق التوقعات الأمنية

وثّق بوضوح ما إذا كانت untar_dir() مخصصة لمعالجة الأرشيفات غير الموثوقة بأمان.

إذا كان الاستخراج غير الآمن مدعومًا عن قصد، فيجب أن يظل السلوك الآمن هو الافتراضي.

يجب أن يتطلب السلوك غير الآمن موافقة صريحة بدلاً من الثقة الصامتة في محتويات الأرشيف.


إرشادات مؤقتة للمستخدمين

حتى يتم إصدار إصلاح على مستوى الحزمة:

  • فضّل Python 3.14+ حيثما ينطبق.
  • لا تمرّر أرشيفات غير موثوقة مباشرة إلى untar_dir().
  • تحقق من جميع أعضاء الأرشيف قبل الاستخراج.
  • تأكد من أن المسارات المستخرجة لا يمكنها الهروب من دليل الوجهة المقصود.
  • تعامل مع الأرشيفات المنزّلة عن بُعد أو المقدّمة من المستخدمين كمدخلات يتحكم بها المهاجم.

اعتبارات CVSS

العيب التقني الأساسي هو ثغرة كتابة ملفات عشوائية ناتجة عن اجتياز مسار الأرشيف.

ومع ذلك، تعتمد الخطورة النهائية على بيئة النشر وكيفية تعريض untar_dir().

سيناريو خدمة مواجهة للشبكة

قد يقترب متجه تمثيلي من:

root@kitploit:~
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H

النتيجة:

root@kitploit:~
9.8 — Critical

سيناريو المطوّر / سطر الأوامر

إذا كان الاستغلال يتطلب بدلاً من ذلك أن يقوم المطوّر بتنزيل أرشيف واستخراجه يدويًا، فقد يكون تفاعل المستخدم وتعقيد الهجوم أعلى.

وبالتالي ستكون درجة CVSS الناتجة أقل بشكل ملموس.


تحفظات

يجب مراعاة عاملين مهمين عند تقييم المشكلة.

فئة الثغرة الموجودة

هذه حالة من فئة ثغرة استخراج TAR غير الآمن المعروفة منذ زمن طويل والمرتبطة بـ:

root@kitploit:~
CVE-2007-4559

قدّمت إصدارات Python الحديثة سلوك استخراج أرشيف أكثر أمانًا.

يجعل Python 3.14 مرشّح الاستخراج الآمن data هو الافتراضي.

لذلك، فإن بيئة التشغيل المتأثرة الأساسية هي Python < 3.14.

ومع ذلك، تظل بيئات التشغيل هذه منتشرة على نطاق واسع.

شرط الأرشيف غير الموثوق

تصبح الثغرة قابلة للاستغلال عندما يزوّد المتصل untar_dir() بأرشيف تكون محتوياته يتحكم بها المهاجم أو غير موثوقة بأي شكل آخر.

لذلك يعامل هذا التقرير محتويات الأرشيف كحدود الأمان غير الموثوقة.

يجب أن تفشل دالة استخراج أرشيف قوية بأمان بغض النظر عن كيفية الحصول على الأرشيف.


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

استبدل تواريخ العناصر النائبة أدناه بتواريخ الإفصاح الفعلية.

  • YYYY-MM-DD — تم الإبلاغ عن الثغرة للمشرفين.
  • YYYY-MM-DD — رد المورّد / إقرار / لا رد.
  • 2026-09-26 — تم التأكيد على أنها لا تزال غير مُصلحة في أحدث إصدار (2.2.30)؛ بقيت تعليمات الاستخراج البرمجية دون تغيير.

الفضل

تم اكتشافها والإبلاغ عنها بواسطة Rahul Karne.


المراجع

  • وثائق untar_dir() في fastcore
    https://fastcore.fast.ai/xtras.html

  • مصدر xtras.py في fastcore
    https://github.com/AnswerDotAI/fastcore/blob/main/fastcore/xtras.py

  • fastcore على PyPI
    https://pypi.org/project/fastcore/

  • وثائق shutil.unpack_archive() في Python
    https://docs.python.org/3/library/shutil.html#shutil.unpack_archive

  • مرشّحات استخراج tarfile في Python
    https://docs.python.org/3/library/tarfile.html#extraction-filters

  • PEP 706 — مرشّح لـ tarfile.extractall
    https://peps.python.org/pep-0706/

  • CWE-22 — التقييد غير الصحيح لاسم المسار إلى دليل محظور
    https://cwe.mitre.org/data/definitions/22.html

  • CVE-2007-4559 — فئة ثغرة استخراج TAR غير الآمن
    https://nvd.nist.gov/vuln/detail/CVE-2007-4559


حول

يوثّق هذا المستودع اكتشافًا أمنيًا بإفصاح منسّق ويوفّر إثبات مفهوم غير ضار ومكتفٍ ذاتيًا.

يكتب إثبات المفهوم فقط داخل دليل --demo-root المحدد من المستخدم ولا ينفّذ أي إجراءات مدمّرة.

أي وظائف شبكية مضمنة في العرض تقتصر على عرض محلي اختياري.

هذه المواد مقدّمة لأغراض البحث الأمني الدفاعي والتعليمي.


الصحافة

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

تنزيل الأداة