Atacantes no identificados comprometieron el proceso de publicación de LiteLLM el miércoles 21 de octubre. Por PyPI y por los registros de Docker distribuyeron una versión maliciosa, la 1.107.0, con malware que roba credenciales de nube y de servicios de IA y con un troyano de acceso remoto (RAT) capaz de ejecutar código arbitrario en las máquinas infectadas.
PyPI puso en cuarentena la versión troyanizada de esta popular pasarela de IA de código abierto en cuestión de horas, y la imagen de Docker (litellm/litellm:1.107.0) se retiró poco después de Docker Hub y de GHCR. Aun así, quien haya corrido el paquete comprometido en cualquier plataforma tiene que asumir que sus secretos fueron robados.
"Revisen si existe /tmp/.pc_once_* (si el archivo existe, la exfiltración ya se disparó) y /tmp/remote_code_loader.lock (si existe, el daemon de comando y control corrió o sigue corriendo)", recomendó Ilyas Makari, cazador de malware de Aikido Security. "Lo mismo aplica para quien haya corrido la imagen oficial de Docker litellm/litellm:1.107.0, o la haya bajado con las etiquetas latest, main-latest o main-stable".
La última versión segura es la v1.106.2.
¿Cuántos pueden estar afectados?
Todavía es temprano para medir el alcance de este nuevo ataque a la cadena de suministro de LiteLLM. Un compromiso anterior de LiteLLM, en marzo, pudo exponer a más de 2.500 organizaciones y 434.000 pipelines de CI/CD en el mundo, según CloudSEK. The Register recomienda tomar en serio las medidas y revisar los entornos en busca de indicadores de compromiso.
Aikido, Wiz (la empresa de seguridad en la nube de Google) y Socket, especialista en seguridad de la cadena de suministro, publicaron guías detalladas de búsqueda de amenazas y de mitigación para usuarios de LiteLLM y equipos de seguridad.
LiteLLM, desarrollado por BerriAI, entrega una interfaz común para proveedores de modelos de lenguaje como OpenAI, Anthropic y Google Gemini, y suma cerca de 23 millones de descargas semanales. Por eso una instalación comprometida puede quedar corriendo junto a claves de API de proveedores de IA, identidades de nube y cadenas de conexión a bases de datos, y exponer una gran cantidad de credenciales y datos sensibles a quien subió el paquete malicioso.
"Los equipos que usan la 1.107.0 deben dejar de desplegarla e investigar los entornos donde corrió Python después de la instalación, incluidos los contenedores de proxy y los runners de CI", dijeron los investigadores de Socket el miércoles.
¿Cómo entró el código malicioso?
La versión maliciosa se subió a las 11:39 UTC. Según Benjamin Read y Rami McCarthy, de Wiz, la carga viene de commits maliciosos hechos en github.com/Berri-AI/litellm, una variante con guion de la organización legítima BerriAI.
Los atacantes usaron ese repositorio para inyectar tres archivos maliciosos en el proceso de publicación de LiteLLM. Según Makari, uno es cook.pth, que hace que el segundo archivo, cook.py, se ejecute solo cada vez que se invoca Python en la máquina, sin ninguna acción del usuario.
cook.py contiene el ladrón de credenciales. El tercer archivo, sitecustomize.py, es el RAT. Python también lo ejecuta al arrancar el intérprete, y este archivo lanza un daemon en segundo plano que consulta cada hora la infraestructura del atacante en busca de nuevos comandos.
Qué se lleva el malware
Al ejecutarse, el ladrón de credenciales recolecta datos sensibles con 16 módulos dirigidos a navegadores, proveedores de nube y servicios de IA, según Read y McCarthy.
- Credenciales y cookies de Chrome, Firefox, Edge y Safari.
- Credenciales de AWS guardadas en
~/.aws/, variables de entorno y metadatos de instancias EC2 y ECS (IMDS). - Claves de cuentas de servicio y credenciales por defecto de Google Cloud Platform, más tokens de Microsoft Azure del caché de la CLI.
- Claves de API de OpenAI, Anthropic, Cohere y otros proveedores de modelos, además de llaves privadas SSH, llaves GPG y el historial de la shell.
Después cifra todo lo robado con AES-256-CBC, envuelve la llave de cifrado con una llave pública RSA-4096 y manda los datos cifrados por HTTP POST a un dominio controlado por el atacante, http://www[.]litellm[.]dev/healthcheck.
BerriAI no respondió a las consultas de The Register, que sigue actualizando la nota.




