概要
Python 標準ライブラリの shutil.unpack_archive() 関数において、Windows ドライブレター付き絶対パス(C:\... 形式)を含む ZIP アーカイブを処理すると、指定した展開先ディレクトリ外にファイルが書き出されるパストラバーサル脆弱性です(CWE-22)。
Unix 系OS(Linux/macOS)では同様の動作は発生しません。Windows 環境でのみ再現する問題です。
「Zip Slip」系の脆弱性: ユーザーからアップロードされたアーカイブを展開する処理で悪用された場合、攻撃者が任意のファイルをシステム上の予期しない場所に書き込める可能性があります。
CVSSベクトル
| 項目 | 値 |
|---|---|
| CVSS バージョン | 3.1 |
| ベクトル | AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N |
| 攻撃経路(AV) | ネットワーク |
| 攻撃の複雑さ(AC) | 低 |
| 必要な権限(PR) | 不要 |
| ユーザーインタラクション(UI) | 不要 |
| 機密性への影響(C) | なし |
| 完全性への影響(I) | 高 |
| 可用性への影響(A) | なし |
影響を受けるソフトウェア
| 製品 | ベンダー | 影響バージョン |
|---|---|---|
| Python(CPython) | Python Software Foundation | 修正コミット適用前のバージョン(Windows 環境) |
修正バージョンと回避策
修正: CPython の修正コミット(65b255416ae、8e13025747e)を含むバージョンへアップデートしてください。
回避策:
- Windows 環境で信頼できないアーカイブファイルを
shutil.unpack_archive()で展開しない - 展開後に各ファイルのパスが意図した展開先ディレクトリ内に収まっているか検証する
import os
import shutil
def safe_unpack(archive_path, extract_to):
shutil.unpack_archive(archive_path, extract_to)
# 展開後の検証
for root, dirs, files in os.walk(extract_to):
for file in files:
full_path = os.path.realpath(os.path.join(root, file))
if not full_path.startswith(os.path.realpath(extract_to)):
raise ValueError(f"不正なパス: {full_path}")
関連リンク
データソース: NVD (NIST) AI解説は Claude API により自動生成されています。正確性については原文をご確認ください。
