- Bitácora de respuesta minuto a minuto que detectó y analizó en tiempo real la infección del paquete malicioso LiteLLM 1.82.8 distribuido a través de PyPI
- La infección ocurrió durante una actualización automática de Cursor IDE, y el archivo
litellm_init.pth se ejecutó provocando robo de credenciales e infección del sistema
- El código malicioso realizó acciones compuestas como recolección de claves SSH y credenciales de la nube, intentos de propagación en Kubernetes y creación de una bomba fork
- Se reportó de inmediato al equipo de seguridad de PyPI y a los mantenedores de LiteLLM, lo que derivó en el aislamiento del paquete y el registro de un CVE
- Herramientas de análisis de código impulsadas por IA como Claude Code cumplieron un papel clave en la detección del ataque y dejaron en evidencia la necesidad de reforzar la seguridad de la cadena de suministro del ecosistema de IA
Registro de respuesta al ataque a la cadena de suministro de LiteLLM
- La versión LiteLLM 1.82.8 fue identificada como un paquete malicioso distribuido por PyPI, y se documentó en una bitácora de respuesta minuto a minuto el proceso desde la detección de la infección hasta su aislamiento
- La infección ocurrió durante el proceso de actualización automática de Cursor IDE, y entre las dependencias instaladas mediante Claude Code y el gestor de paquetes uv, se ejecutó el archivo
litellm_init.pth, provocando la infección del sistema
- El ataque consistió en acciones compuestas que incluían robo de credenciales, instalación de persistencia en el sistema, intentos de propagación en Kubernetes y una bomba fork (fork bomb)
- Se reportó de inmediato al equipo de seguridad de PyPI y a los mantenedores de LiteLLM, lo que derivó en el aislamiento del paquete y la emisión de un CVE
- Las herramientas de análisis de código basadas en IA desempeñaron un papel clave en la detección y el análisis en tiempo real de actividades maliciosas
Detección inicial y señales anómalas en el sistema
- Hacia las 11:13 UTC, se generaron más de 11,000 procesos de Python en una laptop con macOS, dejando el sistema prácticamente congelado
- Se ejecutaban repetidamente comandos con la forma
exec(base64.b64decode('...')), saturando la CPU y la memoria
- Tras un cierre forzado y reinicio, no se encontraron rastros relacionados con persistencia
- Al principio se pensó que se trataba de un bucle no malicioso causado por un loop interno de Claude Code o por un error en un script de
uv run
- Más tarde, mediante una captura de
htop y los logs, se confirmó que un script de Python codificado en base64 se estaba ejecutando repetidamente
Identificación de la causa de la infección
- Hacia las 11:40, se encontró el archivo
litellm_init.pth dentro de una herramienta de Python instalada y se confirmó que se trataba de actividad maliciosa
- Los archivos
.pth se ejecutan automáticamente al iniciar Python y funcionan en todos los procesos de Python
- Recolectaban claves SSH, credenciales de la nube, contraseñas de bases de datos, variables de entorno e historial de shell, entre otros datos
- Los datos recolectados se cifraban con RSA y se enviaban a
https://models.litellm.cloud/
- Se intentó instalar persistencia en
~/.config/sysmon/sysmon.py, pero el reinicio forzado interrumpió el proceso
- La infección ocurrió durante una actualización automática de Cursor IDE (10:58 UTC)
- La extensión
futuresearch-mcp-legacy descargó litellm 1.82.8 mediante uvx
- Esa versión solo existía en PyPI y no tenía tag de release en GitHub
- La hora de carga a PyPI fue 10:52 UTC, por lo que se confirmó que se distribuyó justo antes de la infección
Estructura del código malicioso
- Fase 1 (
litellm_init.pth): se ejecuta automáticamente al iniciar Python, decodifica una carga útil en base64 y luego la ejecuta
- Fase 2: incluye una clave pública RSA para cifrar los datos robados
- Fase 3 (B64_SCRIPT): realiza la recolección y el envío efectivos de credenciales
- Instalación de persistencia: intentó registrar
sysmon.py como un servicio de systemd
- Código de propagación en Kubernetes: intentó crear pods privilegiados en cada nodo usando la imagen
alpine:latest
- Causa de la bomba fork: la llamada
subprocess.Popen([sys.executable, "-c", ...]) volvió a ejecutar el archivo .pth también en los procesos hijo, provocando un bucle infinito
Alcance del daño y medidas de respuesta
-
Credenciales expuestas
- Claves SSH, credenciales de GCloud y Kubernetes, claves API dentro de archivos
.env, y contraseñas de Supabase, ClickHouse y Grafana, entre otras
- Acciones inmediatas recomendadas
- Rotar todas las credenciales SSH y de la nube
- Reemitir las claves secretas dentro de
.env y .mcp.json
- Eliminar la caché de
~/.cache/uv
- Reportarlo al equipo de seguridad de PyPI (
security@pypi.org) y a los mantenedores de LiteLLM
-
Resultado de la revisión del clúster de Kubernetes
- No se encontraron pods maliciosos (
node-setup-*, sysmon)
- Al haberse ejecutado en un entorno macOS, la propagación dentro del clúster falló
- Aun así, debido a la posible exposición de
~/.kube/config, es necesario rotar las credenciales
Respuesta pública y en PyPI
- A las 11:58 UTC, tras descargar litellm 1.82.8 desde PyPI dentro de un entorno Docker aislado, se volvió a confirmar la presencia del archivo
.pth malicioso
- Se reportó de inmediato al equipo de seguridad de PyPI y al repositorio BerriAI/litellm
- Después se registró como PYSEC-2026-2 (CVE)
- A las 12:01 UTC, se redactó y publicó en el blog de FutureSearch una entrada pública sobre el ataque a la cadena de suministro
- El PR se redactó y fusionó en 3 minutos
- A las 12:04 UTC, se propuso compartirlo en las comunidades r/Python, r/netsec, r/LocalLLaMA, r/MachineLearning y r/devops
- Con ello se buscó inducir una respuesta rápida de las comunidades de Python y seguridad
Significado del incidente
- La herramienta de análisis de código basada en IA Claude Code identificó actividad maliciosa en tiempo real y generó advertencias antes de la intervención de investigadores de seguridad
- Este caso mostró un ataque a la cadena de suministro dirigido directamente al ecosistema de desarrolladores de IA, subrayando la necesidad de reforzar la seguridad de las cuentas de PyPI y la verificación de actualizaciones automáticas
- También demostró que las herramientas de IA pueden usarse no solo como apoyo al desarrollo, sino también para la detección y respuesta automatizada ante amenazas cibernéticas
1 comentarios
Comentarios en Hacker News
Soy el desarrollador que descubrió y reportó primero la vulnerabilidad de litellm
Compartí el registro de análisis en tiempo real tal como ocurrió
Claude me fue guiando paso a paso sobre a quién contactar y en qué orden actuar, así que fue una experiencia de gran ayuda incluso para alguien que no es experto en seguridad
Me pregunto si que personas no especialistas descubran y reporten vulnerabilidades de esta forma ayuda a la comunidad de seguridad o si más bien genera confusión
Aun así, la parte de “apenas volví a abrir Cursor se ejecutó el paquete malicioso” sí se ve algo peligrosa
En cuanto surgió la sospecha, lo primero debió ser aislar el dispositivo y contactar al equipo de seguridad
Si el archivo
.pthno hubiera actuado como una fork bomb, quizás se habría detectado mucho más tardeFue una buena decisión preguntarle a Claude por la ruta de contacto
Como no conocía los contactos relacionados con PyPI, le envié un correo al maintainer y también lo publiqué en Hacker News
Creo que, incluso sin pertenecer a la comunidad de seguridad, cualquiera debería poder reportar una vulnerabilidad grave como esta
La mayoría de los problemas vienen de gente que busca dinero y afirma que cualquier cosa es una vulnerabilidad
Pero tu reporte era de alta calidad, y algo así sube de inmediato en la prioridad de parchado
Si se podía resolver sin interrumpir el negocio, se actuaba de inmediato, y si era grave, se reportaba enseguida al CISO o al CTO
Gracias a tu reporte, básicamente se evitó un incidente mayor
Nosotros también resumimos el tema en dos publicaciones del blog
post del blog de grith.ai
Pero este caso me parece un buen ejemplo de cómo, con ayuda de la IA, el análisis de la causa y el reporte fueron mucho más rápidos
Es la primera vez que veo que mi herramienta claude-code-transcripts se incrusta como datos dentro de un post de blog
Normalmente la compartía como página HTML de Gist, así que este uso me parece interesante
Intentamos adaptarla al estilo del blog y fracasamos, pero eso me hizo valorar de nuevo la importancia de la experiencia base
Claude va raspando logs como si escaneara toda mi computadora, así que sentí que hace falta un sistema automático de redacción de logs
Es especialmente incómodo al colaborar con el equipo durante un debugging urgente
Peticiones como “¿puedes mostrar el contenido del script malicioso sin ejecutarlo?” son peligrosas
Los agentes LLM no tienen noción de responsabilidad, así que si por error emiten un comando de ejecución, eso puede terminar en un incidente grave
Al descargar archivos desde PyPI, hay que hacerlo siempre en un entorno sandbox
Cuando te dicen “no lo hagas”, uno tiende a obsesionarse todavía más con eso
Escuché que PyPI soporta digital attestation, pero me da curiosidad si este paquete estaba firmado
documentación de PyPI Trusted Publishers
Creo que registros de paquetes como GitHub, npm y PyPI deberían ofrecer un firehose de eventos para análisis de seguridad en tiempo real
Un escáner automático habría detectado este ataque de inmediato
Los socios de seguridad pueden escanear paquetes y reportarlos mediante una API por invitación
Ver post del blog de PyPI
texto relacionado
La idea es darles tiempo a los escáneres automáticos para detectar anomalías como archivos
.pthEl daño económico puede ser enorme, y solo los afectados por la infección de litellm ya superan las 47 mil personas
La parte de “post de blog escrito, PR y merge en menos de 3 minutos” fue lo más impactante
Va más rápido de lo que toma leerlo, y eso da ansiedad
Si no hubiera existido la fork bomb de 11 mil procesos, quizá este ataque habría permanecido oculto por mucho más tiempo
Si hubieran ralentizado la bomba, el daño habría sido mucho mayor
Hay dos formas en que una gran empresa puede ejecutar código open source no confiable
En la práctica, (1) es lo más seguro
Para pymes o personas individuales, la mejor defensa es fijar dependencias (pinning) y dejar suficiente tiempo de espera
Con Bazel se puede acercar uno a (1), pero la mayoría no tiene más opción que depender de fuentes externas
Que PyPI haya puesto el paquete en cuarentena apenas 30 minutos después del reporte fue una respuesta realmente rápida
Una de las mejores cosas de la IA/LLM es la democratización de la ingeniería inversa
Antes era una habilidad difícil de aprender y poco gratificante, pero ahora la IA te va marcando el rumbo
El patrón
exec(base64.b64decode(...))se usa con frecuencia cuando herramientas de Python entregan código,pero en general cualquier código que se ejecute desde
/tmp,/var/tmpo/dev/shmdebería verse como muy sospechosoSi hubiera habido una herramienta de monitoreo de red como Lulu o LittleSnitch, probablemente habría bloqueado el tráfico anómalo
Eso sí, subir binarios a Claude para que los analice es otro riesgo distinto