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

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

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
Повышение привилегийГенерация полезной нагрузкиАнализ уязвимостейЭксплуатацияТестирование на ПроникновениеОбучение и ОбразованиеЭксплуатация Бинарных Файлов
GitHub

Популярное

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

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

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

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

Смотреть все инструменты →
Поделиться
desertdemons/cve-2025-4138-4517-poc

CVE-2025-4138-4517-POC

CVE-2025-4138 / CVE-2025-4517 — Python tarfile PATH_MAX Symlink Filter Bypass

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

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), который позволяет выйти за пределы директории.


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

ПолеЗначение
Идентификаторы 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

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

                ┌───────────────────────────────────────────┐
                │         Malicious Tar Structure            │
                └───────────────────────────────────────────┘

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

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

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

escape  →  <overflow_link>/../../../../../../../root

Stage 4 ── Create intermediate directories through the escape

escape/.ssh/            (directory, mode 0700 — created by tar extraction)

Stage 5 ── Write payload through the escaped symlink

escape/.ssh/authorized_keys  →  writes to /root/.ssh/authorized_keys  🔓
---

## Затронутые версии

| Ветка 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")
Скачать инструмент