Ataque a la Cadena de Suministro LiteLLM: Análisis Completo de la Inyección de Código Malicioso de 2026 y Guía de Respuesta de Emergencia

Conclusiones clave
Versiones afectadas: LiteLLM 1.82.7 y 1.82.8 en PyPI fueron inyectadas con código malicioso y han sido retiradas. La última versión segura es la 1.82.6.
Mecanismo del ataque:
La versión 1.82.7 ocultó el payload en proxy_server.py; la versión 1.82.8 utilizó además un archivo .pth de Python (litellm_init.pth) que se ejecuta automáticamente al iniciarse cualquier proceso de Python, sin necesidad de importar LiteLLM.
Datos robados:
Claves privadas SSH, credenciales de AWS/GCP/Azure, configuraciones y Secrets de Kubernetes, archivos .env, carteras de criptomonedas, contraseñas de bases de datos, credenciales de Git, historial de shell, y más.
Ataque en tres fases:
Recolección de credenciales → Movimiento lateral en Kubernetes (creando Pods privilegiados) → Persistencia mediante un servicio de systemd disfrazado (sysmon.service).
Causa raíz: Los atacantes comprometieron previamente el escáner de seguridad Trivy, obtuvieron los derechos de publicación de PyPI del mantenedor de LiteLLM, y eludieron el CI/CD normal para subir los paquetes maliciosos directamente.
Ventana de exposición: Las versiones maliciosas estuvieron activas solo entre 1 y 2 horas antes de que un fallo de fork bomb hiciera que las máquinas de los desarrolladores se bloquearan, lo que llevó al descubrimiento.
Alcance del impacto: LiteLLM tiene más de 95 millones de descargas mensuales y es dependencia indirecta de muchos sistemas de agentes de IA, servidores MCP y proyectos de orquestación de LLM.
Cronología y detalles del ataque
El 24 de marzo de 2026, la popular biblioteca LiteLLM —un wrapper unificado de API para más de 100 proveedores de LLM— repentinamente tuvo versiones anómalas en PyPI. El actor de amenaza TeamPCP (responsable previamente de ataques a Trivy y KICS) utilizó credenciales de mantenedor comprometidas o tokens de PyPI para publicar dos versiones maliciosas.
Versión 1.82.7:
a. Payload malicioso oculto dentro de litellm/proxy/proxy_server.py.
b. Se activaba solo al importar el módulo o ejecutar litellm --proxy.
c. El payload era un script Python codificado dos veces en base64.
Versión 1.82.8 (más destructiva):
a. Además, plantó el archivo litellm_init.pth.
b. El módulo site de Python ejecuta automáticamente los archivos .pth al iniciar el intérprete, permitiendo una activación sin interacción.
c. Esto significaba que incluso proyectos que nunca usaban explícitamente LiteLLM podían infectarse si el paquete estaba presente en su entorno.
El malware utilizó cifrado híbrido (AES-256-CBC + RSA-4096) para exfiltrar datos al dominio falso models.litellm.cloud.
Análisis Técnico de la Carga Maliciosa
El análisis revela que la carga operó en tres etapas distintas:
-
Etapa de Recolección de Credenciales:
- Escaneó recursivamente rutas comunes:
~/.ssh/,~/.aws/,~/.kube/,~/.azure/, archivos.env, configuraciones de Kubernetes, credenciales de Git, etc. - Extrajo variables de entorno, secretos en memoria, endpoints de metadatos en la nube (IMDS) y múltiples archivos de carteras de criptomonedas.
- Escaneó recursivamente rutas comunes:
-
Etapa de Movimiento Lateral (entornos de Kubernetes):
- Utilizó tokens de ServiceAccount para leer Secrets de todo el clúster.
- Creó Pods privilegiados
alpine:latesten el espacio de nombreskube-systemen cada nodo, montando el sistema de archivos del host.
-
Etapa de Persistencia:
- Desplegó una puerta trasera disfrazada de un "servicio de telemetría del sistema" (
sysmon.py+ servicio de systemd de usuario). - Extrajo periódicamente cargas adicionales de dominios como
checkmarx.zone.
- Desplegó una puerta trasera disfrazada de un "servicio de telemetría del sistema" (
Desencadenante del Descubrimiento: Las llamadas subprocess.Popen del código malicioso crearon una bomba de bifurcación exponencial bajo el mecanismo .pth, agotando rápidamente la memoria y colapsando las máquinas — un fallo que inadvertidamente expuso el ataque.
Por Qué LiteLLM Era un Objetivo de Alto Valor
LiteLLM sirve como un proxy universal que admite más de 100 proveedores de LLM y es ampliamente utilizado en sistemas de agentes de IA en producción, servidores MCP y enrutamiento multi-modelo. Los desarrolladores a menudo reemplazan las llamadas subyacentes con una sola línea de código, lo que significa que las claves API sensibles frecuentemente coexisten en el mismo entorno.
La cadena de ataque de la cadena de suministro fue clara: Compromiso de Trivy → CI/CD de LiteLLM dependiente de Trivy → Fuga de derechos de publicación → Carga maliciosa directa a PyPI. Esto resalta la importancia crítica de "confiar, pero verificar" en el ecosistema de código abierto actual.
Acciones Inmediatas: Pasos de Detección y Limpieza
Paso76 1: Verificar la Versión Instalada
pip show litellm
pip list | grep litellm
Si se encuentra la versión 1.82.7 o 1.82.8, elimínela inmediatamente:
pip uninstall litellm -y
pip install litellm==1.82.6 --force-reinstall
Paso 2: Limpiar la Caché de Python y site-packages .
- Elimine los directorios
site-packages/litellm*y cualquier archivo.pth. - Purgue la caché de pip:
pip cache purge
Paso 3: Rotar Todas las Credenciales
- Inmediatamente rote las claves SSH, todas las claves de acceso a la nube (AWS IAM, GCP Service Accounts, Azure AD), tokens de Kubernetes, contraseñas de bases de datos y secretos de CI/CD.
2- Revise los registros de auditoría de la nube (CloudTrail, Audit Logs, Activity Log) en busca de accesos sospechosos.
Paso 4: Comprobaciones Adicionales para Entornos de Kubernetes .
- Escanee el espacio de nombres
kube-systemen busca de Pods sospechosos. - Busque directorios
~/.config/sysmon/y servicios de systemd fraudulentos en los nodos. - Reconstruya los nodos afectados (altamente recomendado).
Paso 5: Escanear Proyectos Dependientes
– Audite todos los archivos requirements.txt, pyproject.toml e imágenes Docker; fije LiteLLM a ==1.82.6.
- Utilice herramientas como
pip-auditosafetypara escanear entornos.
Mitigación Avanzada y Mejores Prácticas
- Anclar Versiones: Bloquea siempre LiteLLM a
==1.82.6(o una versión segura más reciente) en producción usando Poetry, Pipenv o similar. - Escaneo de Cadena de Suministro: Integra Dependabot, Snyk, JFrog Xray o Endor Labs para monitorear cambios en los paquetes de PyPI.
- Mínimo Privilegio: Evita mezclar credenciales de desarrollo y producción; usa Gestores de Secretos dedicados (AWS Secrets Manager, HashiCorp Vault).
- Instalación Aislada: Para entornos de alta seguridad, compila desde el código fuente verificado en GitHub y verifica los hashes.
- Monitoreo: Implementa soluciones EDR para vigilar la creación de archivos
.pth, comportamientos anormales de bifurcación y conexiones salientes a dominios sospechosos.
Casos Extremos:
- La instalación indirecta mediante scripts CLI (
install.sh) también expone los sistemas. - Las imágenes de Docker basadas en imágenes base comprometidas deben reconstruirse.
- Los entornos virtuales (venv) están aislados, pero las instalaciones globales de Python aún afectan a los procesos del sistema.
Conclusión
El ataque a la cadena de suministro de LiteLLM sirve como un recordatorio crudo de que la conveniencia de los ecosistemas de código abierto conlleva serios riesgos de seguridad. Al comprometer primero un escáner de seguridad, los atacantes lograron un impacto preciso en la cadena descendente.
Actúa Ahora: Verifica cada entorno Python en busca de versiones de LiteLLM, vuelve a la versión 1.82.6 y rota inmediatamente todas las credenciales potencialmente expuestas. Establece procesos estrictos de revisión de dependencias para prevenir incidentes futuros.
Mantente actualizado a través de los anuncios oficiales en GitHub y PyPI de LiteLLM. En 2026 y más allá, la auditoría regular de dependencias es una habilidad esencial para cada desarrollador de IA.
Mantente vigilante y protege la cadena de suministro — comenzando hoy mismo con el anclado de versiones.