- En dos versiones del paquete de PyPI de LiteLLM, una biblioteca de integración de LLM ampliamente usada (1.82.7 y 1.82.8), se insertó una carga maliciosa y se distribuyó, provocando un ataque que roba credenciales del sistema al instalarse
- La causa del ataque se originó en un compromiso de la cadena de suministro de Trivy, una herramienta de escaneo de seguridad para CI/CD; se filtraron credenciales de CircleCI y con ello se robaron el token de publicación de PyPI y el GitHub PAT
- Los usuarios de la imagen oficial de LiteLLM Proxy Docker no se vieron afectados porque la versión estaba fijada en
requirements.txt, pero los entornos que hicieron pip install directamente desde PyPI necesitan revisión inmediata
- Cientos de comentarios spam de bots inundaron el hilo del issue en GitHub e interfirieron con la discusión real; se confirmó que el atacante lo hizo deliberadamente para entorpecer la comunicación de respuesta
- También hubo impacto en muchos proyectos que usan LiteLLM como dependencia, como DSPy y CrewAI, lo que volvió a poner en evidencia la vulnerabilidad fundamental de la seguridad de la cadena de suministro de software
Resumen del incidente y cómo se descubrió
- Mientras se configuraba un proyecto nuevo, el sistema comenzó a comportarse de forma anormal, agotando la RAM y ejecutando procesos con forma de fork bomb
- La investigación encontró que en
proxy_server.py se había agregado un blob malicioso codificado en base64, que se decodificaba para crear un archivo aparte y luego ejecutarlo
- La versión 1.82.7 incluía la carga en
litellm/proxy/proxy_server.py y se ejecutaba al hacer import litellm.proxy
- La versión 1.82.8 además incluía el archivo
litellm_init.pth, de modo que con solo instalar el paquete, el malware se ejecutaba automáticamente al iniciar Python
- Los archivos
.pth usan un mecanismo que el módulo site de Python ejecuta automáticamente al iniciar, y permiten ejecutar código arbitrario después de la palabra clave import
- Este mecanismo existe desde Python 2.1 y se introdujo sin un PEP aparte
- El equipo de FutureSearch reportó la primera afectación: uvx instaló automáticamente la versión más reciente de litellm (sin fijar versión), y luego Cursor cargó automáticamente un servidor MCP local, provocando la infección
Ruta del ataque y relación con TeamPCP
- Se confirmó que el ataque fue realizado por el mismo actor que comprometió recientemente Trivy: el grupo TeamPCP
- Ruta del compromiso: hackeo de Trivy → filtración completa de credenciales de CircleCI → robo del token de publicación de PyPI + GitHub PAT → distribución del paquete malicioso
- Las cuentas de GitHub del CEO/CTO de LiteLLM también fueron totalmente comprometidas; las descripciones de todos sus repositorios personales se cambiaron a "teampcp owns BerriAI" y también se cerraron issues, entre otras acciones
- El token
PYPI_PUBLISH estaba guardado como variable de entorno en el proyecto de GitHub, y eso se filtró a través de Trivy
- La cuenta tenía 2FA habilitado, pero el robo del token permitió evadirlo
- Los atacantes publicaron repetidamente la misma frase en los issues de GitHub usando cientos de cuentas bot, bloqueando la discusión real
- En el repositorio de Trivy también se confirmaron más de 700 comentarios spam con el mismo patrón
- Algunas de esas cuentas de spam pertenecían a usuarios reales de GitHub con historial de contribuciones; se confirmó que desde febrero habían insertado ladrones de credenciales en workflows de CI con commits titulados "Update workflow configuration"
- El compromiso de Trivy ocurrió al menos 5 días antes y, como el aviso más reciente del ataque se publicó apenas el día anterior, es posible que el mantenimiento no estuviera enterado cuando ocurrió el daño
- Los atacantes también usaron canisters de Internet Computer Protocol (ICP) para entregar la carga, por lo que bloquear DNS por sí solo no basta como defensa
Cómo funcionaba la carga maliciosa
- Creaba un proceso de Python en segundo plano y decodificaba etapas incrustadas para ejecutarlas
- Se ejecutaba un recolector de credenciales que, si lograba reunir datos, cifraba la clave AES con la clave pública RSA del atacante y enviaba la información robada a un host remoto
- URLs encontradas en el malware:
checkmarx.zone/raw y models.litellm.cloud
- Principalmente intentaba robar claves SSH de
~/.git-credentials e información de wallets cripto
- Como realizaba trabajo intensivo de CPU, sobrecargaba el sistema y eso facilitó su detección; incluso hubo reportes de personas que notaron algo raro por el ruido de los ventiladores
- Durante instalaciones de Harbor también se observó el mismo síntoma: procesos
grep -r rpcuser\rpcpassword corriendo con patrón de fork bomb para buscar wallets cripto
Respuesta del equipo de LiteLLM
- Las versiones afectadas (v1.82.7 y v1.82.8) ya fueron eliminadas de PyPI
- Se cambiaron las contraseñas de todas las cuentas de mantenimiento y se borraron y reemplazaron todas las claves de GitHub/Docker/CircleCI/pip
- Las nuevas cuentas de mantenimiento fueron reemplazadas por @krrish-berri-2 y @ishaan-berri
- Todo el paquete fue puesto temporalmente en cuarentena en PyPI y luego se liberó tras eliminar las versiones infectadas
- Se suspendieron todos los nuevos releases y se congeló la distribución hasta completar una revisión de toda la cadena de suministro
- Se está trabajando con el equipo de seguridad de Google Mandiant en la investigación y recuperación
- Trivy quedó fijado en la última versión segura, v0.35.0 (cambiado desde la fijación inicial en v0.69.3 tras comentarios de la comunidad)
- A futuro se evalúan mejoras de seguridad como migrar a Trusted Publishing (OIDC con token JWT) y usar una cuenta separada de PyPI
- La hora inicial de publicación de la versión maliciosa fue aproximadamente UTC 8:30 y la cuarentena de PyPI ocurrió cerca de UTC 11:25
Alcance del impacto y proyectos downstream
- LiteLLM es la única biblioteca de llamadas a proveedores LLM en DSPy, y CrewAI también la usa como fallback
- Airflow, Dagster, Unsloth.ai, Polar y nanobot, entre otros, también dependen de LiteLLM
- Según búsquedas en GitHub, se encontraron más de 628 proyectos que incluyen LiteLLM en
requirements.txt sin fijar versión
- Los usuarios de la ruta oficial de despliegue con Proxy Docker no se vieron afectados porque
requirements.txt tenía la versión fijada
- En despliegues con Docker, el acceso al filesystem del host y a las variables de entorno está más restringido y por eso son relativamente más seguros, pero las credenciales montadas siguen en riesgo
- El objetivo principal del atacante eran las claves SSH personales; el acceso a claves de LLM era secundario
- También hubo reportes de daño indirecto en usuarios de herramientas como Harbor y browser-use, que instalan LiteLLM automáticamente como dependencia
- CrewAI fijó
litellm en 1.82.6 (la última versión segura), aunque el mensaje del commit no menciona el compromiso
- DSPy abrió un issue públicamente para responder al incidente
- LangChain tiene su propia capa para llamadas a proveedores LLM, por lo que no se vio afectado directamente por este compromiso de la cadena de suministro (salvo si se usa el paquete opcional
langchain-litellm)
Debate de la comunidad: seguridad de la cadena de suministro y sandboxing
- Ya no se puede confiar en dependencias ni en entornos de desarrollo; se necesita defensa en profundidad, con aislamiento por VM + primitivas de contenedores + allowlists + filtros de salida + seccomp + gVisor
- Se ve como un retorno de 50 años de comodidad por encima de la seguridad, y se plantea rediseñar todo el modelo de seguridad
- También se propuso sandboxing a nivel de lenguaje de programación para cada módulo
- Java tenía esta capacidad desde la versión 1.2 en los años 90, pero se abandonó por problemas de usabilidad
- Algunos opinan que es el momento adecuado para desarrollar lenguajes basados en capabilities
- Se mencionó el runtime workerd de Cloudflare como una solución existente capaz de aislar módulos
- Ya existen herramientas de aislamiento a nivel de sistema operativo, como pledge/unveil de OpenBSD, chroot/namespace/cgroup en Linux y Capsicum en FreeBSD
- Guix puede crear contenedores aislados en segundos para instalar dependencias sin acceso a
$HOME
- Se destacó la necesidad de usar activamente herramientas de aislamiento en espacio de usuario como Firejail y bwrap
- En móviles ya existe un modelo de sandboxing + permisos (Intents), pero en escritorio suele haber más resistencia a limitar operaciones generales
- Frente a eso, se argumentó que la seguridad por sandboxing y el carácter cerrado de las app stores de Apple/Meta son temas distintos, y que es posible construir herramientas que den control al usuario sin sacrificar seguridad
- Se compartió una herramienta de canary/honeypot para macOS (github.com/dweinstein/canary): monta secretos falsos en WebDAV/NFS para detectar accesos anómalos
- También se propuso que debe existir una barrera entre la publicación de paquetes y los repositorios públicos: configurar un repositorio público directamente como Trusted Publisher amplía la superficie de ataque
- Como contraargumento, se señaló que el propósito original de Trusted Publishing es ofrecer un vínculo auditable entre el código fuente y el artefacto publicado, por lo que pasar por un repositorio privado sería un retroceso
Recomendaciones prácticas de seguridad
- Es imprescindible fijar versiones de dependencias junto con checksums SHA256
- Operar un mirror interno de paquetes para evitar usar directamente la versión más reciente
- Usar artefactos de build y no depender de instalaciones al vuelo en despliegue con
uv run u otros comandos
- Eso también elimina el riesgo estructural de que el sistema se caiga si PyPI tiene una interrupción
- Entre las ventajas de los artefactos desplegables están la auditabilidad, los rollbacks rápidos y la posibilidad de bloquear endpoints peligrosos de red saliente
- Con
exclude-newer de uv es posible excluir paquetes nuevos dentro de un período determinado
- Se puede configurar en
pyproject.toml como [tool.uv] exclude-newer = "5 days"
- En CI/CD, la solución de fondo es migrar los tokens de publicación a workflows basados en OIDC, eliminando el token mismo
- Tanto GitHub como PyPI soportan OIDC: si solo se concede acceso al endpoint OIDC para tareas de publicación, no existe un token que Trivy pueda robar
- Herramientas de escaneo como Trivy deben ejecutarse en workers separados sin permisos de publicación
- Se recomienda gestionar lockfiles y actualizar semanalmente para evitar adoptar de inmediato la versión más reciente
- Los archivos
.pth de Python permiten ejecución automática de código; la opción -S puede impedir la importación de site, aunque con posibles problemas de compatibilidad
- Se recomienda hacer un escaneo de todas las dependencias del proyecto con herramientas como
osv-scanner
- Comandos para verificar si hubo infección:
find / -name "litellm_init.pth" -type f 2>/dev/null
find / -path '*/litellm-1.82.*.dist-info/METADATA' -exec grep -l 'Version: 1.82.[78]' {} \; 2>/dev/null
- También se planteó la necesidad de una rotación masiva de credenciales en todo el ecosistema de gestores de paquetes
Problemas de auditoría SOC2 y confiabilidad
- Se señaló que la empresa que auditó el SOC2 de LiteLLM fue Delve, recientemente envuelta en controversia
- SOC2 solo verifica si una organización sigue realmente los procesos documentados, pero no garantiza el nivel de seguridad en sí
- Incluso con un SOC2 adecuado, no está claro si habría prevenido este ataque a la cadena de suministro
Proyectos alternativos a LiteLLM
- Bifrost (github.com/maximhq/bifrost): alternativa basada en Rust, con configuración de claves virtuales incluso en instancias open source gratuitas
- Portkey (portkey.ai): servicio proxy, con plan gratuito, considerado por algunos más rápido que LiteLLM
- pydantic-ai: alternativa basada en Python
- any-llm (github.com/mozilla-ai/any-llm): proyecto de Mozilla
- LLM Gateway (llmgateway.io): ofrece una guía de migración desde LiteLLM
- InferXgate (github.com/jasmedia/InferXgate): proyecto nuevo, con soporte limitado de proveedores
- Algunos desarrolladores sostienen que las APIs de proveedores LLM en la práctica se reducen a OpenAI y Anthropic, por lo que llamar directamente con
requests.post() sería más seguro
- Como contraargumento, se señaló que la API compatible con OpenAI de Anthropic no se recomienda como solución de largo plazo o para producción, y que las APIs nativas de cada proveedor tienen funciones propias que no se pueden mapear al API de OpenAI
1 comentarios
Opiniones en Hacker News
Soy el maintainer de LiteLLM. La situación todavía está bajo investigación, pero hasta ahora esto es lo que sabemos
requirements.txtActualmente estamos revisando la causa raíz y las medidas para reforzar la seguridad, y lamentamos los inconvenientes
.venv, uv y el sistemaSeguimos sin poder confiar en las dependencias y los entornos de desarrollo. Los dev containers tienen poco aislamiento y además son incómodos de usar. Ahora hay que pasar a entornos de desarrollo basados en sandbox. Se necesitan entornos con aislamiento a nivel de VM, filtros de egress y capas defensivas como seccomp y gVisor. En un entorno así, incluso si ocurre una intrusión, el contenedor se termina de inmediato y el problema se puede identificar fácilmente
Presenta una herramienta canary para macOS (enlace). Es un binario simple en Go que detecta archivos a los que un paquete no debería acceder. Expone secretos falsos por WebDAV o NFS y envía alertas cuando alguien intenta acceder. Con este enfoque tipo honeypot se pueden detectar comportamientos anómalos
Esto está relacionado con la actividad de TeamPCP de las últimas semanas. Creo que la línea de tiempo que armé puede ser útil
Señalaron que el sistema de detección de spam de GitHub es demasiado débil. Dicen que al issue de litellm le llegaron más de 170 comentarios spam
Esperaba que algo así pasara tarde o temprano. Se intentó defender con fijación de versiones de dependencias, pero ni eso es perfecto. Por la complejidad de la cadena de suministro en open source, es imposible verificar todo el código. Gracias a los LLM, el riesgo de que el malware se propague en masa es 100 veces mayor
Si el código escrito por IA logra infiltrarse en LLVM o Linux, entonces sí estaríamos frente al verdadero problema de “trusting trust”
curl | bashsin pensarlo. El caso del backdoor de XZ fue una señal de alarma sobre esta realidadSe mencionó que la firma auditora SOC2 de LiteLLM era Delve.
Al instalar Harbor, el CPU se disparó al 100% y el sistema se congeló. Parece que un proceso
grep -r rpcuser\rpcpasswordestaba buscando wallets de criptomonedas. Por suerte, no se instaló ningún backdoorParece que este incidente fue obra del mismo grupo atacante, TeamPCP, que hackeó Trivy. Que el issue se llenara de comentarios bot sigue el mismo patrón. Es muy probable que haya sido un ataque automatizado con ayuda de LLM