flawopen.com/AI Security/litellm-mcp-preview-command-injection-cve-2026-42271
LiteLLM MCP 命令注入:CVE-2026-42271
GTIG 确认 CVE-2026-42271 遭到利用:有效的 LiteLLM 密钥可通过 MCP 预览功能执行命令。请升级至 1.83.7 或更高版本。[1], [6], [8]
工坊允许访客在登记工具前先试用。预览台可以启动工坊里的强力机器,因此只有主管才应向它发出指令。在存在漏洞的 LiteLLM 版本中,任何被接受的门禁卡都能到达预览台。另一个独立的 Starlette 漏洞还可能欺骗依据重建 URL 判断访问权限的门卫;这两个边界必须分别修复。 在另一个窗口,访客可以在包裹标签上写入斜杠或问号。工作人员重建地址时把这段文字粘进去,并将其误读为一条新路线,但包裹仍沿原来的走廊投递。这对应 Starlette 中独立的 Host 与路径混淆。[1], [3], [5]
核心概念与专有名词
Model Context Protocol (MCP)- 一种协议,使 AI 网关等应用能够连接外部工具和数据源。LiteLLM 的预览端点会在保存配置前测试 MCP 服务器配置。[1]
CVE-2026-48710(Starlette BadHost)- 独立的 Starlette 漏洞:无效 Host 请求头可能导致 request.url.path 与路由实际使用的路径不同。Horizon3 报告称,在某些依赖组合中,这可能绕过 LiteLLM 的基于路径认证;它不属于
CVE-2026-42271。[3], [5], [4] MCP stdio 命令允许列表- LiteLLM 在 stdio 传输中接受的可执行文件 basename 集合。它会在配置验证时检查,并在创建客户端前再次检查旧记录。它不是沙箱,因为允许的运行时可能会解释传入参数。[8]
框架映射
- 本指南所述弱点的 CWE 参考: CWE-78
- CISA KEV — 收录日期 2026-06-08 — CVE-2026-42271
攻击执行流程分解
低权限密钥可访问管理级预览操作
端点接受完整的 MCP 服务器配置,包括 stdio 命令、参数和环境变量。服务器验证了密钥,却没有检查 PROXY_ADMIN 角色,因此任何已认证密钥持有者都能调用预览操作。[1]
根本原因剖析 (Root Cause)
LiteLLM 的问题是在两个 MCP 预览路由上缺少角色检查:任何有效的代理 API 密钥都能在没有 PROXY_ADMIN 角色的情况下调用它们。连接预览接口接受调用方提供的 stdio 配置,并以代理进程的权限启动其中的命令。另一个独立的 Starlette 漏洞允许格式错误的 Host 标头导致 request.url.path 与 Starlette 实际路由的路径不一致;Horizon3 报告称,将此行为与 LiteLLM 组合后,基于路径的 API 密钥校验可能被绕过。这是两个不同的漏洞:应分别修复 LiteLLM 的授权和命令执行边界,并将 Starlette 更新到 1.0.1 或更高版本。[1], [8], [3], [4], [5]
源代码对比:漏洞与安全实现
此代码片段对应 LiteLLM 已合并的执行边界修复:创建 stdio 客户端前先检查命令 basename,因此旧数据库/配置记录也会经过该检查。补丁还会验证新建和更新的服务器配置,并将两个预览端点限制为 PROXY_ADMIN;/test/tools/list 也增加了显式 user_api_key_auth 依赖。允许列表不是沙箱:允许的运行时仍可能解释其参数。预览功能应仅限管理员,并以最小权限运行代理。[1], [2], [8]
源码摘录: LiteLLM stdio 客户端校验代码片段
# _create_mcp_client:添加 stdio 命令防护前的实现。
if server.command and server.args is not None:
stdio_config = MCPStdioConfig(
command=server.command,
args=server.args,
env=resolved_env,
)
# _create_mcp_client:对数据库/配置中的旧记录再次执行校验。
if server.command:
base_command = os.path.basename(server.command)
if base_command not in MCP_STDIO_ALLOWED_COMMANDS:
raise HTTPException(
status_code=403,
detail="MCP stdio command is not in the allowlist",
)
if server.command and server.args is not None:
stdio_config = MCPStdioConfig(
command=server.command,
args=server.args,
env=resolved_env,
)
工程与系统安全加固清单
- ✓盘点 LiteLLM 代理部署并确认实际解析的版本;将受影响版本升级到 1.83.7 或更高版本。[1], [8]
- ✓检查部署的锁文件或容器镜像;在已解析的 FastAPI 版本兼容时确认 Starlette 为 1.0.1 或更高版本,不要未经测试就强制覆盖依赖。[3], [7]
- ✓升级 LiteLLM 前,按维护者公告建议在反向代理或 API 网关处阻止 POST /mcp-rest/test/connection 和 POST /mcp-rest/test/tools/list。[1]
- ✓确认两个路由都要求 user_api_key_auth,并在创建 MCP 客户端前拒绝任何非 PROXY_ADMIN 角色。[1], [8]
- ✓添加测试,证明未认证请求和有效的非管理员密钥都无法触发任一预览操作,同时获授权管理员可以使用预期流程。[8]
- ✓针对 Starlette 测试畸形 Host 的处理,并确保访问控制中间件使用规范的 ASGI 路径或经框架验证的 URL。[3], [4]
- ✓检查代理访问日志和子进程遥测,查找异常的 MCP 预览端点调用;若调查发现主机可能被访问,则轮换代理保存的凭据。[1], [8]
- ✓分别记录两个漏洞:
CVE-2026-42271是 LiteLLM 命令执行;CVE-2026-48710是 Starlette Host 解析和路径混淆。[1], [3] - ✓检查各环境中的 LITELLM_MCP_STDIO_EXTRA_COMMANDS;自定义条目会扩大可执行文件的信任边界,并不会使参数处理变安全。[8]
参考来源
- LiteLLM security advisory GHSA-v4p8-mg3p-g94g / CVE-2026-42271
- LiteLLM pull request #25343: MCP stdio endpoint authorization and command validation fix
- Starlette advisory GHSA-86qp-5c8j-p5mr / CVE-2026-48710
- Starlette commit 764dab0: ignore malformed Host when constructing request.url
- Horizon3: CVE-2026-42271 chained with CVE-2026-48710
- Google Threat Intelligence Group: Vulnerability Discovery and Exploitation Trends in the AI Era
- LiteLLM issue #28993: FastAPI constraint and Starlette CVE-2026-48710 dependency resolution report
- LiteLLM merged PR #25343 — command allowlist, execution guard, role checks, and tests
- Lumen Black Lotus Labs:PoeLLM 恶意软件针对暴露服务
- BleepingComputer:PoeLLM 攻击暴露的 AI 服务器