# 从自建 LiteLLM 代理迁出：2026 年安全公告与配置对照

> https://router.one/zh/litellm-migration 的 Markdown 镜像，供 AI 助手与爬虫使用。Router One 是 OpenAI 兼容的统一 LLM API 网关。
> 最后更新：2026-10-28

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。一份典型的代理配置：

`config.yaml`

```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`

```bash
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`

```python
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。

## 相关页面

- LiteLLM 替代方案：https://router.one/zh/litellm-alternative
- 自动故障转移：https://router.one/zh/llm-fallback
- LLM 成本追踪：https://router.one/zh/llm-cost-tracking
- OpenAI 兼容 API：https://router.one/zh/openai-compatible-api
- 本页规范地址：https://router.one/zh/litellm-migration
- 模型与每模型 token 价格：https://router.one/zh/models （markdown：https://router.one/zh/models.md ）
- 定价：https://router.one/zh/pricing
- API 文档（markdown）：https://router.one/zh/docs.md
- 公司事实（markdown）：https://router.one/zh/facts/company.md
