从自建 LiteLLM 代理 迁出:2026 年安全 公告与 配置 对照
LiteLLM 在 2026 年为 litellm 包及其代理发布了多份安全公告,其中包括 10 月 27 日的一份 Critical 公告。如果你自己运行这个代理,第一件事是对照公告检查版本并升级。如果你不想再自己运行和修补代理,这一页把 LiteLLM 的配置逐项对到 Router One 上。Router One 是统一 LLM API 网关,一个 OpenAI 兼容端点接入 30+ 模型。页面说明 config.yaml 里每项设置迁到哪里、客户端代码改什么、关停代理前怎样核对。下面的公告内容均据已发布的公告整理,处置前请完整阅读每一份。
LiteLLM 2026 年发布了 哪些 安全 公告?
截至 2026-10-28,LiteLLM 自己的公告页把它为 litellm(pip 包)发布的 2026 年公告中的五份评为 Critical。下表按时间倒序列出这五份,再加上 GitHub Advisory Database 里那份 PyPI 恶意版本公告,以及每份公告写明的修复版本。评级以 LiteLLM 公告页为准:GitHub Advisory Database 对部分公告的评级不同(例如把 GHSA-7hp6-4w63-5g45 评为 High)。BerriAI/litellm 的公告页还有评级为 High、Moderate、Low 的其他公告,请按你的版本查完整列表,不要只看这张表。
| 公告编号 | 发布日期 | 公告内容 | 修复版本 |
|---|---|---|---|
| GHSA-w4c7-34wj-hqm8 | 2026-10-27 | 在启用 Enterprise 许可证的代理上,未经认证的请求打到任一 LLM 路由,可能让代理读取本地文件并发送到攻击者指定的 URL,从而泄露 LITELLM_MASTER_KEY 和各供应商 Key。未启用许可证的开源部署不受影响。 | 1.103.10、1.104.8、1.105.6、1.106.5 |
| GHSA-7hp6-4w63-5g45 | 2026-09-30 | 拥有 internal_user 权限的用户可以提权为 proxy_admin,并在主机上执行命令。1.91.0 起默认配置即可被利用;1.87.0 到 1.90.x 仅在设置 EXPERIMENTAL_UI_LOGIN=true 时可被利用。 | 1.100.4、1.101.3、1.102.2、1.103.1、1.104.0rc2 |
| GHSA-4xpc-pv4p-pm3w | 2026-05-28 | Host 请求头解析缺陷,在特定条件下可能允许未经认证访问受保护的管理路由。前面有校验或规范化 Host 的一层(CDN/WAF、反向代理等)即可拦住。 | 1.84.0 |
| GHSA-r75f-5x8p-qvmc | 2026-04-20 | 代理校验 API Key 时存在 SQL 注入:未经认证的请求带上构造的 Authorization 头打到任一 LLM API 路由,就能读取代理数据库里的数据,还可能改写。升级前,公告给出的临时办法是在 general_settings 下设置 disable_error_logs: true。 | 1.83.7 |
| GHSA-jjhc-v7c2-5hh6 | 2026-04-03 | 启用 JWT 认证(enable_jwt_auth: true,默认关闭)时,OIDC userinfo 缓存只用 token 的前 20 个字符作缓存键,未经认证的攻击者可以构造 token,继承某个合法用户已缓存的身份和权限。未启用 JWT/OIDC 认证的部署不受影响。 | 1.83.0 |
| GHSA-5mg7-485q-xm76(PYSEC-2026-2) | 2026-03-25 | PyPI 上的 1.82.7 和 1.82.8 两个版本含有收集凭据并外传的恶意代码。据 LiteLLM 的安全通告,官方代理 Docker 镜像未受影响。 | 公告未列修复版本;LiteLLM 给出的安全版本是 1.82.6 及更早,或 1.83.0 |
公告 原文链接
- GHSA-w4c7-34wj-hqm8:https://github.com/BerriAI/litellm/security/advisories/GHSA-w4c7-34wj-hqm8
- GHSA-7hp6-4w63-5g45:https://github.com/BerriAI/litellm/security/advisories/GHSA-7hp6-4w63-5g45
- GHSA-4xpc-pv4p-pm3w:https://github.com/BerriAI/litellm/security/advisories/GHSA-4xpc-pv4p-pm3w
- GHSA-r75f-5x8p-qvmc:https://github.com/BerriAI/litellm/security/advisories/GHSA-r75f-5x8p-qvmc
- GHSA-jjhc-v7c2-5hh6:https://github.com/BerriAI/litellm/security/advisories/GHSA-jjhc-v7c2-5hh6
- GHSA-5mg7-485q-xm76:https://github.com/advisories/GHSA-5mg7-485q-xm76
- LiteLLM 2026 年 3 月安全通告:https://docs.litellm.ai/blog/security-update-march-2026
- LiteLLM 全部安全公告:https://github.com/BerriAI/litellm/security/advisories
代理还在 运行时,先做这 几件事
把流量迁走并不会修补仍在运行的代理,所以先按公告本身给出的步骤处理:
- 在每台代理主机、CI 机器和容器镜像上核对已安装的 litellm 版本是否落在受影响范围内,并升级到修复版本。
- 如果曾经安装或运行过 1.82.7 或 1.82.8,公告要求假定该环境里能拿到的所有凭据都可能已泄露,并全部轮换;LiteLLM 的通告还要求在 site-packages 里查找 litellm_init.pth。
- 针对 GHSA-w4c7-34wj-hqm8,公告给出的临时缓解办法是:在入口处拦截带有公告所列回调字段的请求体,并把代理的出站流量限制在你配置的模型端点。
- 针对 GHSA-7hp6-4w63-5g45,公告给出的临时缓解办法是设置 EXPERIMENTAL_UI_LOGIN=false,但这也会让 CLI SSO 和 Claude Code 网关登录失效。
- 公告还建议尽量不要把代理直接暴露在公网上。
LiteLLM 的每项 设置在 Router One 上对应 什么
LiteLLM 代理把模型别名、各供应商 Key、重试和预算放在 config.yaml 和数据库里。迁到 Router One 后,这些大多变成请求本身的参数和 API Key 上的设置:
| LiteLLM 代理 | Router One |
|---|---|
| 客户端 base URL http://0.0.0.0:4000(代理地址) | https://api.router.one/v1(OpenAI 兼容) |
| general_settings.master_key 或虚拟 Key | Router One API Key,每个应用或环境一把 |
| model_list → model_name(你的别名) | model 字段直接填目录里的完整 ID,如 openai/gpt-5.6-sol 或 anthropic/claude-sonnet-5.5 |
| litellm_params.api_key(每个供应商一把,os.environ/...) | 不再需要:一把 Router One Key 即可调用目录里的全部模型 |
| num_retries(同一模型的多个部署之间重试) | 内置:请求精确模型 ID 时,可换到提供同一模型的其他健康线路重试 |
| fallbacks(切到另一个模型) | 放到你自己的代码里(请求出错时换一个 ID 重发),或者发 model="auto" 让服务端选 |
| 虚拟 Key 的 max_budget | 每把 Key 单独设 maxSpend 上限(只限钱包扣费)和有效期;rateLimit 和 tokenLimitTpm 按平台默认值,可申请提高 |
| success_callback(Langfuse 等) | 控制台 → 日志:每个请求的模型、tokens、费用、延迟和状态 |
| 让 Claude Code 走代理 | ANTHROPIC_BASE_URL=https://api.router.one,ANTHROPIC_AUTH_TOKEN 填 Router One Key |
第 1 步:整理 现有 config.yaml
列出客户端会发的每个 model_name,以及它背后的 litellm_params.model,这份清单就是别名到目录 ID 的对照表。litellm_params.model 填的是各厂商自己的 ID,不一定等于目录 ID:下面配置里 Anthropic 的 claude-sonnet-5-5,在 Router One 目录里是 anthropic/claude-sonnet-5.5。一份典型的代理配置:
model_list:
- model_name: gpt-main
litellm_params:
model: openai/gpt-5.6-sol
api_key: os.environ/GPT_PROVIDER_KEY
- model_name: claude-main
litellm_params:
model: anthropic/claude-sonnet-5-5
api_key: os.environ/CLAUDE_PROVIDER_KEY
litellm_settings:
num_retries: 2
general_settings:
master_key: os.environ/LITELLM_MASTER_KEY第 2 步:为每 个别名 找到 目录 ID
Router One 没有别名表,每个 model_name 都要换成客户端直接发送的目录 ID。ID 请从 /models 或 GET /v1/models 原样复制。大多数 ID 带厂商前缀(openai/、anthropic/、google/),也有不带前缀的(如 deepseek-v4.1-flash)。网关能识别大多数官方裸名作为别名,但不是全部,未知名称会返回 404,所以请用完整 ID。
curl https://api.router.one/v1/models \ -H "Authorization: Bearer $ROUTER_ONE_API_KEY"
第 3 步:在客户端改 base URL、Key 和模型
原来通过 OpenAI SDK 调代理的客户端,代码结构不用动,只改 base URL、Key 和 model 的值:
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.router.one/v1", # was http://0.0.0.0:4000
api_key=os.environ["ROUTER_ONE_API_KEY"], # was the LiteLLM key
)
resp = client.chat.completions.create(
model="openai/gpt-5.6-sol", # was the alias "gpt-main"
messages=[{"role": "user", "content": "Reply with OK"}],
)
print(resp.choices[0].message.content)如果 继续把 litellm Python 包当 客户 端用
有些应用不走代理,而是在进程内调用 litellm.completion()。这种用法也能接 Router One:api_base 填带 /v1 的 base URL,model 填 openai/ 加目录 ID。LiteLLM 只在第一个斜杠处切分,所以 openai/openai/gpt-5.6-sol 实际发送的是 openai/gpt-5.6-sol,openai/anthropic/claude-sonnet-5.5 发送的是 anthropic/claude-sonnet-5.5。上面的公告都是针对这个包发布的:多数涉及代理服务端,恶意版本那份则覆盖任何装过 1.82.7 或 1.82.8 的环境,所以请把版本锁定在受影响范围之外。
第 4 步:在日志里 核对,然后 下线 代理
每个迁过来的模型各发一个请求,在控制台 → 日志里逐条找到,核对模型 ID、tokens、费用和状态。全部流量都出现在日志里之后,停掉代理,并吊销它保存过的各供应商 Key,不要在一台不再维护的主机上留下任何副本。
常见 问题
出了 这些 公告,就必须 迁移吗?
不必。每份公告都写明了修复版本,升级就是公告给出的解决办法。如果你不想再自己运行、修补和监控代理,迁移是一个选项。
开源版 LiteLLM 代理受 GHSA-w4c7-34wj-hqm8 影响吗?
按公告的说法,不受影响:相关代码只在启用 Enterprise 许可证时才会加载,未启用许可证的部署不受影响。表里其他几份公告在各自受影响的版本范围内,与是否有许可证无关。
迁移要 改哪些 代码?
三个值:base URL(https://api.router.one/v1)、API Key,以及 model 字段——从 LiteLLM 别名换成目录 ID。请求和响应格式仍是 OpenAI Chat Completions。
某个 模型 出错时,Router One 会自动换 成别的 模型吗?
请求精确模型 ID 时不会:重试保持同一个模型,换提供该模型的其他健康线路。只有显式使用 model="auto" 时,服务端才会在可能跨模型的候选中选择。LiteLLM 配置里跨模型的 fallbacks 需要搬到你自己的代码里。
LiteLLM 虚拟 Key 的预算 怎么 替代?
按应用、团队或环境各建一把 Router One Key,每把单独设 maxSpend 上限和有效期。每把 Key 的消费上限(maxSpend)限的是这把 Key 能从钱包扣的钱:累计扣费到上限后,这把 Key 上需要钱包付费的请求返回 HTTP 402。套餐额度覆盖的请求从账户共用的套餐额度里扣,不计入任何 Key 的上限。这个上限不会像 LiteLLM 的 budget_duration 那样按周期重置。
迁过来 以后能 调用 多少 模型?
同一个端点、同一把 Key 可调用 30+ 模型,实时列表见 /models 和 GET /v1/models。