摘要: CVE-2026-59822 是 LiteLLM MCP Streamable HTTP 端点中的高危身份验证绕过:在受影响版本中,攻击者不需要有效的 LiteLLM Virtual Key,只要提交伪造的 Bearer Token,就可能触发 OAuth2 passthrough 的错误回退路径,得到一个空的认证对象并接触已配置的 MCP 工具。官方公告确认受影响范围为 LiteLLM 1.84.0 之前版本,1.84.0 已修复。本文面向使用 LiteLLM Proxy、MCP Server、Claude Code、Cursor 或企业 Agent 平台的运维与安全团队,解释漏洞为何成立,给出不调用真实工具的安全验证、升级、临时隔离、权限收敛、日志审计与回滚方案。结论很直接:只要部署了 LiteLLM MCP 端点,就应立即盘点并升级;仅把 MCP 放在内网,不能替代修复。
核心结论
CVE-2026-59822 能绕过 MCP 身份验证,不是 OAuth2 协议本身失效,而是 LiteLLM 把“LiteLLM Key 验证失败”错误地解释成“可以继续尝试上游 OAuth2 passthrough”,并用空的 UserAPIKeyAuth() 替代失败结果。认证失败本应是终止状态,却被写成了可继续执行的业务分支。
- 立即升级: 官方安全公告列出的受影响版本为
< 1.84.0,修复版本为>= 1.84.0。不要只升级客户端,真正需要修复的是承载 MCP Streamable HTTP 端点的 LiteLLM Proxy。 - 风险取决于工具权限: 绕过后能造成多大损害,取决于该 Proxy 暴露了哪些 MCP Server、工具和下游凭据。只读检索、工单写入、代码仓库、云资源与 Shell 工具的风险完全不同。
- 验证应无破坏: 在隔离环境中只检查伪造 Token 是否被拒绝,预期为
401/403;不要调用删除、写入、发信、付款、发布或生产运维工具。 - 补丁不是全部: 升级后仍应在反向代理实施端点级访问控制,为 MCP 使用独立身份、短期令牌、Toolset 白名单和网络出口限制。
- 应按已泄露边界处置: 如果受影响 MCP 端点曾暴露到不可信网络,不能只看“有没有报错”;应轮换下游 Token、检索异常工具列表与调用记录,并检查 Agent 产生的副作用。
漏洞到底发生在哪里
LiteLLM 可以同时充当模型网关和 MCP 网关。正常链路中,客户端先向 LiteLLM 证明身份,LiteLLM 再根据 Virtual Key、用户、团队或组织权限,决定允许访问哪些 MCP Server 与工具。某些上游 MCP Server 还需要自己的 OAuth2 Token,因此系统会处理两种不同的凭据:
| 凭据层 | 证明什么 | 应由谁验证 | 验证失败时的正确行为 |
|---|---|---|---|
| LiteLLM Virtual Key | 调用方是否有权进入网关 | LiteLLM Proxy | 立即拒绝请求 |
| 用户/OIDC 身份 | 最终用户是谁、属于哪个团队 | LiteLLM 或外部 IdP | 拒绝或重新登录 |
| 上游 MCP OAuth Token | LiteLLM 代表谁访问下游 MCP | 上游授权服务器/MCP Server | 重新授权,不得替代网关身份 |
| 工具级权限 | 已认证主体能调用哪些 Tool | LiteLLM 权限层与 MCP Server | 默认拒绝未显式授权工具 |
问题就在于这两层认证被错误耦合。官方公告描述:MCP auth handler 支持向上游 MCP Server 透传 OAuth2,但回退路径可能把 LiteLLM Key 的验证失败替换成空的 UserAPIKeyAuth() 对象。于是,一个形式上像 Authorization: Bearer ... 的任意值,原本应该得到“无效网关凭据”,却可能被后续代码当作已有认证上下文继续处理。
这是一类典型的 fail-open(失败后放行) 缺陷。危险点不在 Token 是否能被密码学破解,而在认证状态机把“失败”“未配置”“需要透传”混成了相近状态。只要后续授权逻辑判断的是“是否存在认证对象”,空对象就可能满足结构要求,却没有携带真实主体、团队、Key 或权限约束。

为什么一个假 Bearer Token 能变成“已认证会话”
理解这个漏洞,关键是区分“请求里有 Authorization Header”和“该 Header 已通过验证”。前者只是输入存在,后者才是安全事实。受影响实现的逻辑可抽象为下面这段伪代码:
"""仅用于解释根因,不是 LiteLLM 原始源码。"""
try:
auth = validate_litellm_virtual_key(request)
except InvalidKey:
if request.headers.get("Authorization"):
# 漏洞:把网关认证失败误当作 OAuth2 passthrough 场景
auth = UserAPIKeyAuth()
return continue_to_mcp(auth)
正确设计应把两条凭据链明确分离,而且任何网关认证失败都必须终止:
gateway_identity = validate_gateway_credential(request)
if not gateway_identity:
raise HTTPException(status_code=401)
upstream_token = resolve_upstream_oauth_token(gateway_identity)
authorize_tools(gateway_identity, requested_server)
这也解释了为什么在外围增加“Header 必须存在”的规则无效:攻击者恰恰可以提供一个任意 Header。有效控制必须验证令牌的签名、发行者、受众、有效期和绑定身份,或验证 LiteLLM 自己签发/存储的 Virtual Key,并把失败结果作为不可恢复的拒绝状态。
GitHub 官方公告给出的影响是:未经认证的攻击者可能建立已认证 MCP 会话,列举并调用已配置的 MCP 工具,访问这些工具连接的服务。CVSS 4.0 为 8.8(High);这不是“已经在所有环境中获得 RCE”的同义词。若环境只暴露只读工具,直接影响可能以数据泄露为主;若同时存在可执行命令、写数据库、操作云资源或部署代码的高权限工具,业务影响会显著上升。
受影响范围与优先级怎么判断
第一优先级不是在所有服务器上盲目搜索 “MCP”,而是建立可验证的资产清单。
| 检查项 | 高风险信号 | 处置优先级 |
|---|---|---|
| LiteLLM 版本 | 低于 1.84.0 或无法确认 | 最高,先隔离再升级 |
| MCP Streamable HTTP | 已启用且可被外部网络访问 | 最高 |
| OAuth2 passthrough | 为一个或多个 MCP Server 启用 | 最高 |
| 工具能力 | Shell、代码仓库写入、云管理、数据库写入、发信 | 最高 |
| 下游凭据 | 长期 Token、共享服务账号、管理员权限 | 最高 |
| 网络边界 | 仅靠“内网地址”,无 mTLS/WAF/身份代理 | 高 |
| 日志 | 不记录主体、MCP Server、工具名和结果 | 高,影响调查能力 |
| 版本已修复 | 1.84.0 或更高且验证返回 401/403 | 仍需权限审查 |
可以用以下命令确认运行镜像或 Python 包版本;不同部署方式选择其一:
python -m pip show litellm
docker inspect YOUR_LITELLM_CONTAINER --format '{{.Config.Image}}'
kubectl -n YOUR_NAMESPACE get deploy YOUR_LITELLM_DEPLOYMENT \
-o jsonpath='{.spec.template.spec.containers[0].image}'
不要只看镜像标签 latest。应记录镜像 Digest,并在运行容器内确认实际包版本。CI/CD 也应加入版本下限和 SBOM 检查,避免回滚或重建时重新拉起受影响版本。
安全复现:只验证“假 Token 会不会被拒绝”
下面的方法适用于你拥有授权的测试环境。它不列举真实工具、不触发工具调用,只向测试端点发送无效凭据并检查状态码。生产环境验证应先获得变更批准,并选择不会产生日志风暴或告警误报的窗口。
- 复制最小配置到隔离环境。 使用空白测试 MCP Server,或只暴露一个没有副作用的
health_check工具;不要复制生产 Token。 - 记录基线。 用有效测试 Virtual Key 发起一次初始化请求,确认测试链路本身可用。
- 发送缺少 Authorization Header 的请求。 预期为
401或403。 - 发送随机 Bearer Token。 Token 只用固定占位符
INVALID_TEST_TOKEN,不要尝试猜测或复用任何真实凭据。 - 检查是否创建会话。 任何返回 MCP 成功响应、会话标识、工具列表或
200的结果都应视为失败。 - 升级到 1.84.0 或更高后重复测试。 两种无效请求都必须在工具路由之前被拒绝。
- 保存证据。 记录时间、版本、镜像 Digest、状态码、请求 ID 和对应日志;删除测试产生的临时会话。
export LITELLM_TEST_URL="https://YOUR_TEST_DOMAIN/mcp/YOUR_TEST_SERVER"
: "仅做无效凭据拒绝测试,不调用 tools/list 或 tools/call"
curl --silent --show-error --output /tmp/mcp-auth-check.out \
--write-out '%{http_code}\n' \
--request POST "$LITELLM_TEST_URL" \
--header 'Authorization: Bearer INVALID_TEST_TOKEN' \
--header 'Content-Type: application/json' \
--data '{"jsonrpc":"2.0","id":"auth-check","method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"authorized-security-test","version":"1.0"}}}'
预期结果是 401 或 403。如果得到 200,不要继续列举工具;立即保留日志、限制入口并升级。若返回 404,只能说明测试 URL 可能不对,不能证明没有漏洞;若返回 5xx,应先检查代理与应用日志,不能把异常当作通过。
更系统的 MCP 安全教程 可以作为团队威胁建模入口;若需要把验证纳入流水线,可参考站内 AI Agent 安全测试 主题。
修复与加固的完整实施步骤
补丁是必要条件,但一次可靠的事件响应至少应覆盖版本、入口、身份、权限、凭据和证据六层。
- 冻结高风险变更。 暂停新增 MCP Server、扩大公网访问和提升服务账号权限,避免调查期间继续扩大攻击面。
- 临时封锁外部 MCP 路径。 在负载均衡、Ingress 或 API Gateway 上只允许可信身份代理或固定管理网络访问
/mcp/相关路径。规则要先在观察模式验证,避免误伤模型 API。 - 升级 LiteLLM。 将 Python 包或容器镜像固定到
1.84.0或更高的经批准版本,并锁定 Digest。先在测试环境运行回归,再滚动部署。 - 执行拒绝测试。 使用上一节的无效 Token 测试,确认请求在工具发现和调用之前返回
401/403。 - 收敛 MCP 权限。 按 Virtual Key、Team、Organization 配置 MCP Permission Management;用 Toolset 只暴露任务所需的具体工具,而不是整台 MCP Server。
- 拆分身份。 每个 Agent、环境与团队使用独立 Key;下游 OAuth Token 使用最小 Scope、短有效期与独立服务账号。禁止开发、测试和生产共享凭据。
- 轮换敏感凭据。 若漏洞窗口内端点对不可信网络开放,轮换连接代码仓库、数据库、云平台、工单、消息系统和企业 SaaS 的 Token。
- 审计历史调用。 关联反向代理日志、LiteLLM 请求日志、MCP Server 日志和下游 SaaS 审计日志,搜索未知主体、异常 User-Agent、工具枚举、高频失败后成功以及非工作时间调用。
- 加入持续检测。 把“随机 Bearer Token 必须被拒绝”加入升级后的安全回归;同时监控无主体会话、空用户/团队字段和敏感工具调用。
- 准备可控回滚。 回滚只允许退到另一个已修复版本。若新版本出现兼容问题,应关闭 MCP 入口,而不是回到 1.84.0 之前。
一个简单的 Nginx 临时隔离示例:
location ^~ /mcp/ {
# 临时措施:只允许经过企业身份代理的请求
auth_request /_identity_check;
proxy_set_header Authorization $http_authorization;
proxy_set_header X-Request-ID $request_id;
proxy_pass http://litellm_backend;
}
这里的 auth_request 必须连接真实身份验证服务,不能只检查 Header 是否存在。上线前也要确认 LiteLLM 获取的是可信代理重写后的身份 Header,外部客户端不能直接伪造内部身份字段。

纵深防御:补丁之后还要做什么
1. 把认证与授权变成两个明确关卡
认证回答“你是谁”,授权回答“你能调用什么”。即使身份有效,也不应自动获得全部 MCP Server 与工具。LiteLLM 官方文档支持按 Key、Team、Organization 管理 MCP 权限,还提供 Access Groups 与 Toolsets。实施时应遵循默认拒绝、显式授予:
_comment: "示意配置:字段请以当前 LiteLLM 文档和你的版本为准"
mcp_servers:
readonly_docs:
url: "https://YOUR_MCP_DOMAIN/mcp"
auth_type: oauth2
general_settings:
master_key: "os.environ/LITELLM_MASTER_KEY"
不要把真实 Token 写入仓库。使用 Secret Manager 注入 LITELLM_MASTER_KEY 与上游 OAuth 客户端密钥,并限制只有 LiteLLM 工作负载身份可读。
2. 给工具分风险等级
建议至少分四级:
- L0:无敏感数据的健康检查、公开检索。
- L1:企业只读检索,输出可能含内部信息。
- L2:可写工单、评论、分支或非生产数据库。
- L3:生产变更、删除、发信、支付、密钥管理、Shell 与云管理。
L2 应要求明确的任务上下文和幂等键;L3 应采用人工审批、短时授权、双人复核或完全禁止 Agent 直连。Prompt Injection 防护不能代替权限控制,因为即便模型被诱导调用工具,最小权限仍能限制影响范围。
3. 限制网络出口与下游权限
MCP 网关一旦被绕过,真正的损失发生在下游。因此 LiteLLM 工作负载的网络出口应只允许已登记的 MCP 域名、授权服务器和必要模型 API。数据库、云控制面和内部管理端口应通过独立代理或策略层访问。下游服务账号要限制 Scope、资源范围与时间,而不是因为“只有网关会使用”就授予管理员权限。
4. 记录可追责的审计事件
每次 MCP 请求至少记录:请求 ID、已验证主体、Virtual Key 哈希或 ID、团队/组织、源网络、MCP Server、工具名、参数摘要、策略决策、下游状态、耗时和副作用 ID。敏感参数应脱敏,Token 和完整提示词不应直接写入普通日志。将网关、MCP Server 与 SaaS 审计日志使用同一请求 ID 关联,才能回答“谁让哪个 Agent 在什么时间调用了哪个工具”。
成本、兼容性与回滚
升级软件本身通常没有单独许可费,但企业成本来自回归测试、OAuth 重新授权、镜像重建、凭据轮换、日志留存和可能的停机窗口。不要为了降低升级风险而长期保留旧版本;更稳妥的方式是蓝绿部署:
| 阶段 | 流量 | 验证重点 | 失败处理 |
|---|---|---|---|
| 影子环境 | 0% 生产写流量 | 启动、配置解析、OAuth discovery | 修正配置 |
| 金丝雀 | 1%–5% 只读流量 | 401/403、会话、延迟、错误率 | 切回已修复旧池 |
| 扩容 | 25%–50% | Toolset 权限、超时、重试 | 停止扩容 |
| 全量 | 100% | 异常工具调用与下游错误 | 保留入口熔断开关 |
重试要避免放大副作用:只对网络超时等明确可重试错误使用指数退避,工具写操作必须带幂等键;身份失败不得自动换用另一种宽松认证。超时应分层设置,入口、LiteLLM、MCP Server 和下游服务都要有上限。回滚时,配置数据库与凭据格式也要兼容;但安全底线是不回到受影响版本。
事件调查清单
如果系统曾运行 1.84.0 之前版本且 MCP 入口可达,应按潜在身份边界失守调查:
- 确定暴露起止时间、版本、镜像 Digest 与所有副本。
- 列出受影响期间注册的 MCP Server、Toolset 与对应下游凭据。
- 搜索无主体、空 Key ID、空团队字段却成功的 MCP 会话。
- 对照入口日志查找随机 Bearer Token、大量初始化或工具枚举模式。
- 在下游系统检索同一时间段的读取、写入、权限变更和 Token 创建。
- 对不可逆操作进行业务确认;必要时回滚代码、配置、数据或发布。
- 轮换可能暴露的凭据,并撤销旧 Token,而不只是生成新 Token。
- 保存证据、记录判断依据和误报排除过程,形成事件时间线。
“日志里没有明显攻击”不等于没有风险。如果缺少工具名、主体或请求 ID,调查结论应明确写成“证据不足”,不能写成“确认未利用”。
事实依据与来源
- 官方已确认事实: BerriAI/LiteLLM GitHub Security Advisory GHSA-7488-6r32-c95q 说明,MCP Streamable HTTP 端点的 OAuth2 passthrough 回退可能用空
UserAPIKeyAuth()覆盖失败的 LiteLLM Key 校验,使任意 Bearer Token 抵达 MCP 工具;受影响版本为< 1.84.0,修复版本为>= 1.84.0。 - 官方代码与发布依据: 公告关联修复提交
73869f0、Pull Request #26463 与 v1.84.0 Release。部署时仍应使用当前维护版本,而不是把 1.84.0 当作长期固定上限。 - 官方产品能力: LiteLLM 文档说明 MCP 权限可按 Key、Team、Organization 管理,并提供 Access Groups、Toolsets、OAuth 和零信任 JWT 方案。本文据此提出最小权限配置。
- 第三方数据库交叉核验: OSV/CVE 记录与 GitLab Advisory 的影响范围和修复版本与官方公告一致。
- 编辑判断: 风险等级应由端点可达性、MCP 工具副作用、下游凭据权限与日志完整性共同决定,不能只看 CVSS。
- 实施建议: 无效 Token 401/403 测试、网络出口限制、蓝绿升级、凭据轮换、人工审批与审计字段属于本文的防御性方案,并非官方强制配置。
本文内容核验日期:2026 年 9 月 23 日。
FAQ
Q1:CVE-2026-59822 影响哪些 LiteLLM 版本?
官方公告标记所有低于 1.84.0 的 LiteLLM 版本受影响,1.84.0 及以上为修复范围。实际部署还要检查容器内部包版本与镜像 Digest,不能只相信镜像标签。
Q2:没有启用 MCP,就需要紧急修复吗?
这个具体漏洞针对 MCP Streamable HTTP 认证路径;未启用该能力会显著降低直接暴露面。但 LiteLLM 还可能存在其他安全更新,因此仍建议升级到当前经验证的维护版本,并确认没有通过隐藏配置或旧实例启用 MCP。
Q3:MCP 只在内网,是否可以不升级?
不可以。内网并不是身份验证,Agent、浏览器、CI Runner、被入侵的工作站或 SSRF 都可能到达内网端点。内网部署可以降低外部可达性,但不能修复 fail-open 的认证逻辑。
Q4:任意 Bearer Token 都一定能调用所有工具吗?
不一定。官方描述的是任意 Bearer Token 可能绕过 LiteLLM Key 验证并抵达 MCP 工具层;最终可见和可调用范围还受配置、权限层与下游服务控制。但安全评估不应依赖后续控制“也许会阻止”,应先修复入口认证。
Q5:如何在不造成业务副作用的情况下验证?
在隔离环境使用无效固定 Token 只发送 initialize 请求,期望得到 401/403;不要继续执行 tools/list 或 tools/call。生产验证应由获授权团队完成,并使用无生产凭据的测试 MCP Server。
Q6:升级到 1.84.0 后还要轮换 Token 吗?
如果受影响端点曾对不可信网络开放,或日志无法排除未经授权访问,建议轮换下游 OAuth Token、服务账号密钥和相关 API Key。升级只关闭未来入口,不会撤销已经获得的凭据或业务副作用。
Q7:WAF 检查 Authorization Header 能挡住漏洞吗?
仅检查 Header 是否存在无效,因为触发条件本身就是带有伪造 Bearer Token。WAF 或身份代理必须完成真正的身份验证,或在升级前完全阻断不可信来源访问 MCP 路径。
Q8:这个漏洞是否等同于远程代码执行?
不等同。CVE-2026-59822 是身份验证绕过。若后端暴露高权限 Shell 或可导致代码执行的工具,它可以成为攻击链的一环;但不能在没有环境证据时把每个受影响实例都描述成已实现 RCE。
参考来源
- LiteLLM 官方安全公告:GHSA-7488-6r32-c95q
- GitHub Advisory Database:CVE-2026-59822
- LiteLLM v1.84.0 Release
- LiteLLM 修复提交 73869f0
- LiteLLM MCP Permission Management
- LiteLLM MCP OAuth 文档
- OSV:CVE-2026-59822
- CVE.org:CVE-2026-59822
内容核验日期:2026 年 9 月 23 日
工具选型与提示词资料
适合阅读工具评测、工具推荐、对比测评类文章后继续转化。