LiteLLM MCP 身份验证边界被伪造 Bearer Token 绕过的安全主题插画

LiteLLM MCP Auth Bypass 实战:CVE-2026-59822 为什么能绕过 MCP 身份验证?

CVE-2026-59822 源于 LiteLLM MCP 认证失败后的 OAuth2 passthrough 错误回退。本文解释空认证对象如何造成绕过,并给出无破坏验证、升级与纵深防御方案。

摘要: 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 或权限约束。

LiteLLM MCP 认证绕过的正常路径与错误 OAuth2 回退路径对比图
正常路径应在 LiteLLM Key 失败时终止;漏洞路径却创建空认证对象并继续抵达 MCP 工具层。

为什么一个假 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 会不会被拒绝”

下面的方法适用于你拥有授权的测试环境。它不列举真实工具、不触发工具调用,只向测试端点发送无效凭据并检查状态码。生产环境验证应先获得变更批准,并选择不会产生日志风暴或告警误报的窗口。

  1. 复制最小配置到隔离环境。 使用空白测试 MCP Server,或只暴露一个没有副作用的 health_check 工具;不要复制生产 Token。
  2. 记录基线。 用有效测试 Virtual Key 发起一次初始化请求,确认测试链路本身可用。
  3. 发送缺少 Authorization Header 的请求。 预期为 401403
  4. 发送随机 Bearer Token。 Token 只用固定占位符 INVALID_TEST_TOKEN,不要尝试猜测或复用任何真实凭据。
  5. 检查是否创建会话。 任何返回 MCP 成功响应、会话标识、工具列表或 200 的结果都应视为失败。
  6. 升级到 1.84.0 或更高后重复测试。 两种无效请求都必须在工具路由之前被拒绝。
  7. 保存证据。 记录时间、版本、镜像 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"}}}'

预期结果是 401403。如果得到 200,不要继续列举工具;立即保留日志、限制入口并升级。若返回 404,只能说明测试 URL 可能不对,不能证明没有漏洞;若返回 5xx,应先检查代理与应用日志,不能把异常当作通过。

更系统的 MCP 安全教程 可以作为团队威胁建模入口;若需要把验证纳入流水线,可参考站内 AI Agent 安全测试 主题。

修复与加固的完整实施步骤

补丁是必要条件,但一次可靠的事件响应至少应覆盖版本、入口、身份、权限、凭据和证据六层。

  1. 冻结高风险变更。 暂停新增 MCP Server、扩大公网访问和提升服务账号权限,避免调查期间继续扩大攻击面。
  2. 临时封锁外部 MCP 路径。 在负载均衡、Ingress 或 API Gateway 上只允许可信身份代理或固定管理网络访问 /mcp/ 相关路径。规则要先在观察模式验证,避免误伤模型 API。
  3. 升级 LiteLLM。 将 Python 包或容器镜像固定到 1.84.0 或更高的经批准版本,并锁定 Digest。先在测试环境运行回归,再滚动部署。
  4. 执行拒绝测试。 使用上一节的无效 Token 测试,确认请求在工具发现和调用之前返回 401/403
  5. 收敛 MCP 权限。 按 Virtual Key、Team、Organization 配置 MCP Permission Management;用 Toolset 只暴露任务所需的具体工具,而不是整台 MCP Server。
  6. 拆分身份。 每个 Agent、环境与团队使用独立 Key;下游 OAuth Token 使用最小 Scope、短有效期与独立服务账号。禁止开发、测试和生产共享凭据。
  7. 轮换敏感凭据。 若漏洞窗口内端点对不可信网络开放,轮换连接代码仓库、数据库、云平台、工单、消息系统和企业 SaaS 的 Token。
  8. 审计历史调用。 关联反向代理日志、LiteLLM 请求日志、MCP Server 日志和下游 SaaS 审计日志,搜索未知主体、异常 User-Agent、工具枚举、高频失败后成功以及非工作时间调用。
  9. 加入持续检测。 把“随机 Bearer Token 必须被拒绝”加入升级后的安全回归;同时监控无主体会话、空用户/团队字段和敏感工具调用。
  10. 准备可控回滚。 回滚只允许退到另一个已修复版本。若新版本出现兼容问题,应关闭 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,外部客户端不能直接伪造内部身份字段。

LiteLLM CVE-2026-59822 企业修复工作流图
企业处置闭环:隔离入口、升级、拒绝测试、收敛工具权限、轮换凭据、审计与持续回归。

纵深防御:补丁之后还要做什么

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 入口可达,应按潜在身份边界失守调查:

  1. 确定暴露起止时间、版本、镜像 Digest 与所有副本。
  2. 列出受影响期间注册的 MCP Server、Toolset 与对应下游凭据。
  3. 搜索无主体、空 Key ID、空团队字段却成功的 MCP 会话。
  4. 对照入口日志查找随机 Bearer Token、大量初始化或工具枚举模式。
  5. 在下游系统检索同一时间段的读取、写入、权限变更和 Token 创建。
  6. 对不可逆操作进行业务确认;必要时回滚代码、配置、数据或发布。
  7. 轮换可能暴露的凭据,并撤销旧 Token,而不只是生成新 Token。
  8. 保存证据、记录判断依据和误报排除过程,形成事件时间线。

“日志里没有明显攻击”不等于没有风险。如果缺少工具名、主体或请求 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。

参考来源

内容核验日期:2026 年 9 月 23 日

工具评测文章

工具选型与提示词资料

适合阅读工具评测、工具推荐、对比测评类文章后继续转化。

工具选型表 按场景、价格、上手难度和核心能力筛选合适的 AI 工具。 查看资料包 提示词模板包 提供写作、运营、编程、图片和视频生成常用提示词模板。 查看资料包

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

本站累计访问量: 366,237
AI Stack Nav 客服会员 / 支付 / 下载 / 工具库
你好,我是 AI Stack Nav 客服助手。你可以问我会员开通、微信支付、资料下载、订单入口、AI 工具库等问题。