1. 先搞清楚 CVE-2026-47101 到底危险在哪
LiteLLM 是一个开源的大模型统一接入网关,兼容 OpenAI 标准 API,可以把 OpenAI、Anthropic、Google 等上百个模型统一调度起来,很多团队拿它做多模型负载均衡、成本监控和私有化部署。CVE-2026-47101 是 LiteLLM 的一个权限提升漏洞,CVSS 3.1 评分 8.8,属于高危级别。它的核心危害是:一个只有internal_user普通权限的账号,可以绕过 RBAC 角色限制,把自己提升成proxy_admin管理员,进而完全接管 LiteLLM 代理服务器——操控多模型调度、读取和生成 API 密钥、篡改成本监控配置。
这个漏洞的根源在/key/generate这个生成虚拟 API 密钥的接口。它在处理allowed_routes字段时没有做权限校验,直接把用户传入的路由配置存了下来,不检查这些路由是否在当前用户的权限范围内。于是普通用户就能构造一个包含管理员专属路由的密钥,用这个密钥调用管理接口,完成提权。
利用条件有三个:攻击者手里有一个有效的internal_user角色密钥;目标服务可以访问/key/generate和/user/update端点;系统启用了 RBAC 角色访问控制。影响版本是 LiteLLM < 1.83.14。POC 已经公开,利用门槛低,所以如果你在自建 LiteLLM 网关,这篇就是给你写的排查和修复路径。
适合谁看:正在运维 LiteLLM 网关的开发、运维、安全同学;用 LiteLLM 做多模型统一入口的团队;以及想借这次机会把密钥管理收敛到统一通道的人。下面我会给出可复制的版本核查命令、受影响配置项清单、升级与权限收敛步骤,并演示怎么通过 TaoToken 统一 Key 通道集中轮换密钥、验证修复后调用链是否恢复正常。
2. 修复前的准备:用 TaoToken 统一 Key 通道做密钥收敛
在动手升级之前,有一件事值得先做:把散落在各处的模型密钥收敛到一个统一通道。原因很直接——CVE-2026-47101 的利用前提是攻击者拿到一个有效的internal_user密钥。如果你的 LiteLLM 配置里塞满了各家模型的原始 Key,一旦提权成功,攻击者能顺藤摸瓜拿到所有上游密钥。反过来,如果 LiteLLM 只持有一个统一通道的 Key,轮换和吊销的成本会低很多。
TaoToken 就是这样一个统一 Key/API 通道,官网地址是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 入口是 https://taotoken.net/api 。它的作用是让你用一套 Key 去调用多个模型,LiteLLM 侧只需要配置一个上游 provider,不用把 OpenAI、Anthropic 的原始密钥都写进 config.yaml。
具体怎么做:先在 TaoToken 控制台创建一个 API Key,然后把它作为 LiteLLM 的唯一上游凭据。这样即使 LiteLLM 被提权,泄露的也只是这一个 Key,你可以在控制台一键吊销并重新生成,不影响其他业务。控制台入口在这里:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,API Keys 管理页在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。
这一步不是必须的,但它能让后面的密钥轮换从"翻遍配置文件"变成"点一下按钮"。我试过在升级前先把上游 Key 换成统一通道的,升级完验证调用链时省了不少事。如果你暂时不想动上游配置,也可以先跳过,直接进入第 3 节的版本核查和升级。
3. 可复制配置:版本核查、升级与权限收敛
3.1 版本核查命令
先确认你当前跑的是哪个版本。如果你是用 pip 装的:
pip show litellm | grep -i version如果是用 Docker 跑的,进容器查:
docker exec -it litellm-gateway pip show litellm | grep -i version或者直接看启动日志里的版本号:
docker logs litellm-gateway 2>&1 | grep -i "litellm.*version" | head -5只要输出小于 1.83.14,就属于受影响范围,需要升级。
3.2 升级命令
pip 环境直接升级并固定版本:
pip install --upgrade "litellm>=1.83.14" pip install litellm==1.83.14Docker 环境改镜像 tag 后重建:
docker pull ghcr.io/berriai/litellm:1.83.14-stable docker stop litellm-gateway docker rm litellm-gateway docker run -d --name litellm-gateway -p 4000:4000 \ -v /path/to/config.yaml:/app/config.yaml \ ghcr.io/berriai/litellm:1.83.14-stable \ --config /app/config.yaml升级完再跑一次版本核查命令,确认输出是 1.83.14 或更高。
3.3 受影响配置项清单
打开你的config.yaml,重点检查这几项:
| 配置项 | 风险点 | 修复动作 |
|---|---|---|
general_settings.allow_user_key_generation | 允许普通用户生成密钥 | 设为 false,或限制到管理员 |
general_settings.allowed_routes | 未校验路由权限 | 升级后确认补丁生效,手动收紧白名单 |
router_settings下的模型列表 | 上游原始 Key 明文 | 换成 TaoToken 统一 Key |
litellm_settings.rbac | RBAC 是否启用 | 启用并复核角色映射 |
model_list的api_key字段 | 多把上游密钥 | 收敛为单一通道 Key |
3.4 权限收敛配置片段
把下面这段 JSON 存成config.yaml的对应部分,或者作为独立配置文件引用。注意路径要和你实际部署一致:
{ "general_settings": { "allow_user_key_generation": false, "allowed_routes": [ "/chat/completions", "/embeddings", "/models" ], "rbac": true }, "model_list": [ { "model_name": "gpt-4o", "litellm_params": { "model": "openai/gpt-4o", "api_base": "https://taotoken.net/api", "api_key": "os.environ/TAOTOKEN_API_KEY" } } ] }这里的关键是把api_base指向https://taotoken.net/api,api_key用环境变量注入,不要把明文写进文件。allowed_routes只放业务真正需要的路由,/key/generate和/user/update不要出现在普通用户的允许列表里。
如果你用的是 Claude Code 或 Cline 这类客户端,配置三件套是:Base URL 填https://taotoken.net/api,Key 填 TaoToken 控制台生成的 Key,Model ID 填你要用的模型名(比如gpt-4o或claude-sonnet-4-20250514)。Cline 的 MCP 配置里同样遵循这三件套,不要混用其他来源的 Key。
4. 验证请求:确认修复后调用链恢复正常
升级和配置改完后,别急着收工,跑一遍验证。先确认服务起来了:
curl -s http://localhost:4000/health返回{"status":"healthy"}说明网关正常。然后测一次模型调用:
curl -s http://localhost:4000/v1/chat/completions \ -H "Authorization: Bearer $LITELLM_MASTER_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-4o", "messages": [{"role": "user", "content": "ping"}] }'如果返回里有choices字段和正常的 message 内容,说明调用链通了。如果返回 401,检查 Key 是否正确;如果返回local proxy failed,检查api_base是否可达。
接着验证提权路径是否被封死。用一个普通internal_user的 Key 去调/key/generate,带上管理员专属路由:
curl -s -X POST http://localhost:4000/key/generate \ -H "Authorization: Bearer $INTERNAL_USER_KEY" \ -H "Content-Type: application/json" \ -d '{"allowed_routes": ["/user/update", "/key/delete"]}'修复后应该返回 403 或权限不足的错误,而不是成功生成密钥。如果还能成功,说明补丁没生效或者配置没改对,回到第 3 节重新检查。
最后确认 TaoToken 通道的调用是否正常。用统一 Key 直接打一次:
curl -s https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{"model": "gpt-4o", "messages": [{"role": "user", "content": "ping"}]}'返回正常说明统一通道没问题,LiteLLM 侧的上游配置可以放心用。想快速验证模型对话效果,可以用模型对话页:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=chat&utm_campaign=rewrite 。
5. 本篇常见错排查
升级和验证过程中,最容易撞上这几个报错,逐个说清楚。
401 Unauthorized:最常见。先确认Authorization头里的 Key 是不是当前环境的。LiteLLM 的 master key 和普通 user key 权限不同,调管理接口要用 master key。如果你用的是 TaoToken 的 Key,确认它没有过期或被吊销,去 API Keys 页核对:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。
local proxy failed:这个报错通常出现在 LiteLLM 转发到上游时。检查api_base是否写对,TaoToken 的地址是https://taotoken.net/api,不要漏掉/api后缀,也不要多加/v1(LiteLLM 会自己拼)。另外确认容器能访问外网,DNS 解析正常。
reading choices 报错:返回体里没有choices字段,多半是上游返回了错误结构。先看完整响应体,如果是{"error": ...},按错误信息处理。常见原因是 Model ID 写错,比如把gpt-4o写成gpt4o。Model ID 要和 TaoToken 文档里列的一致,文档入口:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。
OAuth 相关报错:如果你用 Claude Code 接入,可能会碰到 OAuth 流程问题。Claude Code 的接入配置参考:https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claude-code-anthropic&utm_campaign=rewrite 。确认 Base URL、Key、Model ID 三件套都填对,OAuth 回调地址不要带多余路径。
升级后服务起不来:检查config.yaml语法,1.83.14 对部分字段做了校验加强。用python -c "import yaml; yaml.safe_load(open('config.yaml'))"验证 YAML 合法性。如果报字段未知,对照官方 release note 删掉废弃字段。
提权测试仍然成功:说明补丁没生效。确认pip show litellm的版本确实是 1.83.14 以上,Docker 的话确认镜像 tag 没写错。还有一种可能是你改了代码但没重启服务,LiteLLM 需要重启才能加载新版本。
6. 把密钥轮换和长期编码收敛到统一通道
修完这个漏洞,建议顺手做两件事。第一,把所有internal_user和管理员密钥轮换一遍。CVE-2026-47101 的 POC 已公开,在野利用虽然还没发现,但密钥可能已经在你不知道的时候被复制过。轮换时用 TaoToken 控制台集中操作,比逐个改配置文件快得多。
第二,如果你团队长期做编码和 Agent 类任务,可以考虑把调用通道固定下来。TaoToken 的 Coding Plan 适合长期编码场景:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。它的好处是 Key 和额度集中管理,LiteLLM 侧只配一个上游,安全边界清晰。
接入文档在这里:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,API Keys 管理在这里:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。升级完 LiteLLM、验证完调用链之后,把上游 Key 换成统一通道的,下次再出类似漏洞,你的响应时间会从"排查所有配置"缩短到"吊销一个 Key"。