El proyecto LiteLLM, una popular interfaz y proxy de Python para proveedores de modelos de lenguaje de gran tamaño (LLM), fue recientemente objetivo de un ataque de cadena de suministro que involucró la versión 1.107.0. Los investigadores de seguridad identificaron que, si bien el repositorio upstream en GitHub permaneció limpio, las 'wheels' distribuidas (paquetes de Python precompilados) en PyPI contenían tres archivos maliciosos: `cook.pth`, `cook.py` y `sitecustomize.py`. Estos archivos fueron diseñados para ejecutarse automáticamente cada vez que se iniciaba un proceso de Python en un host, independientemente de si la aplicación realmente importaba la biblioteca LiteLLM o no.

Un gráfico de banner que ilustra el compromiso de la versión 1.107.0 de LiteLLM en PyPI.
Los investigadores de seguridad identificaron un ataque de cadena de suministro donde se inyectaron archivos maliciosos en las ruedas precompiladas de la biblioteca LiteLLM.safedep.io

La imagen sirve como el recurso visual principal para el ataque de cadena de suministro de LiteLLM que involucra la versión 1.107.0.

El compromiso funcionaba a través de dos mecanismos principales. Primero, `cook.pth` actuaba como un gancho de inicio que importaba `cook.py`, el cual contenía un extractor de credenciales llamado 'privcollect'. Este extractor apuntaba a una amplia gama de datos sensibles, incluyendo llaves SSH, credenciales de la nube (AWS, Azure, GCP), contraseñas de navegadores e incluso las claves API de proveedores de LLM almacenadas en las bases de datos del proxy de LiteLLM. El código cifraba estos datos y los exfiltraba a un servidor remoto. Segundo, `sitecustomize.py` iniciaba un demonio en segundo plano que verificaba un repositorio remoto de GitHub cada hora en busca de un nuevo dominio. Si se encontraba uno, el demonio descargaba y ejecutaba una carga útil de segunda etapa, proporcionando al atacante un canal persistente de ejecución remota de código (RCE).

El análisis de los artefactos de construcción sugiere que la inyección ocurrió durante el proceso de construcción de la rueda en lugar de a través de una simple carga manual de un archivo ZIP modificado. El archivo `pyproject.toml` en la distribución de origen contenía una instrucción específica (`data = "cook"`) que dirigía a la herramienta de construcción, Maturin, a incluir una carpeta llamada `cook` en el paquete final. Debido a que esta carpeta y su contenido estaban ausentes del repositorio público de Git, el código malicioso solo era visible para los usuarios que descargaban la rueda compilada. Los investigadores creen que el ataque probablemente se originó en una tubería de lanzamiento privada comprometida, una credencial de mantenedor robada o una rama privada comprometida, ya que las ruedas maliciosas coincidían con la salida de la tubería de construcción estándar del proyecto. PyPI ha eliminado desde entonces la versión afectada, y se aconseja a los usuarios fijar sus versiones a la 1.106.2 o anteriores.