跳到主要内容
注册

从自建 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 的其他公告,请按你的版本查完整列表,不要只看这张表。

LiteLLM 2026 年发布了哪些安全公告?
公告编号发布日期公告内容修复版本
GHSA-w4c7-34wj-hqm82026-10-27在启用 Enterprise 许可证的代理上,未经认证的请求打到任一 LLM 路由,可能让代理读取本地文件并发送到攻击者指定的 URL,从而泄露 LITELLM_MASTER_KEY 和各供应商 Key。未启用许可证的开源部署不受影响。1.103.10、1.104.8、1.105.6、1.106.5
GHSA-7hp6-4w63-5g452026-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-pm3w2026-05-28Host 请求头解析缺陷,在特定条件下可能允许未经认证访问受保护的管理路由。前面有校验或规范化 Host 的一层(CDN/WAF、反向代理等)即可拦住。1.84.0
GHSA-r75f-5x8p-qvmc2026-04-20代理校验 API Key 时存在 SQL 注入:未经认证的请求带上构造的 Authorization 头打到任一 LLM API 路由,就能读取代理数据库里的数据,还可能改写。升级前,公告给出的临时办法是在 general_settings 下设置 disable_error_logs: true。1.83.7
GHSA-jjhc-v7c2-5hh62026-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-25PyPI 上的 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 上对应什么
LiteLLM 代理Router One
客户端 base URL http://0.0.0.0:4000(代理地址)https://api.router.one/v1(OpenAI 兼容)
general_settings.master_key 或虚拟 KeyRouter 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。一份典型的代理配置:

config.yaml
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。

terminal
curl https://api.router.one/v1/models \
  -H "Authorization: Bearer $ROUTER_ONE_API_KEY"

第 3 步:在客户端改 base URL、Key 和模型

原来通过 OpenAI SDK 调代理的客户端,代码结构不用动,只改 base URL、Key 和 model 的值:

app.py
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。