Se detecta malware con temática Shai-Hulud en la biblioteca de entrenamiento de IA PyTorch Lightning
(semgrep.dev)- Las versiones 2.6.2 y 2.6.3 del framework de deep learning
lightningfueron usadas en un ataque a la cadena de suministro; con solo ejecutarpip install lightning, se ejecutaba automáticamente una carga útil de JavaScript ofuscada desde el directorio oculto_runtime - Como es un framework ampliamente usado para construir clasificadores de imágenes, hacer fine-tuning de LLM, modelos de difusión y pronóstico de series temporales, es muy probable que ya esté incluido en el árbol de dependencias de muchos equipos de IA/ML
- Cuando el malware se ejecuta, escanea más de 80 rutas en el sistema de archivos local para robar tokens de GitHub (
ghp_,gho_), tokens de npm (npm_), variables de entorno y secretos de la nube, procesando hasta 5 MB por archivo - Enumera y extrae secretos de los tres principales proveedores de nube, incluyendo AWS (archivos de credenciales, IMDSv2, ECS, Secrets Manager, SSM), Azure (Key Vault) y GCP (Secret Manager)
- En entornos de GitHub Actions, usa el Python integrado para volcar la memoria del proceso
Runner.Workery extraer todos los secretos marcados como"isSecret":true, junto con información del repositorio y del workflow - El punto de entrada es PyPI (Python), pero la propagación tipo gusano se expande a través de npm (JavaScript): con los tokens de npm robados, inyecta un dropper (
setup.mjs) y el malware (router_runtime.js) en todos los paquetes que puede publicar, sube la versión patch y los vuelve a publicar, encadenando la infección hasta las máquinas de desarrolladores que instalen esos paquetes - La exfiltración de datos usa 4 canales paralelos al mismo tiempo para evitar que se bloquee con una sola ruta: ① envío al servidor C2 por HTTPS POST, ② dead drop usando la API de búsqueda de commits de GitHub (insertando el token con doble codificación Base64 en el mensaje del commit), ③ commit como
results-<timestamp>.jsonen un repositorio público de GitHub con nombres del universo de Dune, ④ push directo al repositorio de la víctima - Después de infiltrarse en un repositorio, siembra hooks de persistencia en herramientas de desarrollo para garantizar la reinfección: escribe un hook
SessionStarten.claude/settings.jsonde Claude Code para ejecutarse automáticamente al iniciar la sesión, y coloca una tarea conrunOn: folderOpenen.vscode/tasks.jsonde VS Code para ejecutarse cada vez que se abra la carpeta- Ambos hooks llaman al dropper autocontenido
setup.mjs; si el runtime de Bun no está presente, lo descarga silenciosamente desde GitHub y ejecuta la carga útilrouter_runtime.jsde 14.8 MB
- Ambos hooks llaman al dropper autocontenido
- Si obtiene un token de GitHub con permisos de escritura, hace push de un workflow camuflado llamado
Formatteral repositorio de la víctima: en cada push, vuelca los secretos del repositorio con${{ toJSON(secrets) }}y los sube como artifact de Actions - Todas las máquinas que hayan instalado esas versiones durante el período afectado deben considerarse completamente comprometidas; se deben rotar de inmediato los tokens de GitHub, credenciales de nube y API keys, y auditar los directorios
.claude/y.vscode/en busca de archivos inesperados - Indicadores de ataque: el prefijo
EveryBoiWeBuildIsAWormyBoien mensajes de commit, la descripción del repositorio"A Mini Shai-Hulud has Appeared"y la presencia del directorio_runtime/en el repositorio, todo ello verificable directamente con búsquedas en GitHub
2 comentarios
Ahora ya no habrá que actualizar...
Comentarios de Hacker News
Puede que sea simplemente una ilusión de frecuencia, pero últimamente se ven bastantes ataques a la cadena de suministro muy sonados en paquetes importantes
Incluso en las primeras páginas de HN ahora mismo hay varias publicaciones sobre casos distintos
Al mirar atrás a
left-padhace 10 años, da la impresión de que hoy hay más ataques exitosos que antes, y probablemente sí sea asíTambién debe haber aumentado claramente el valor de que un ataque tenga éxito, pero me pregunto si, como comunidad en general, realmente estamos mejorando en la capacidad de detectarlos antes del lanzamiento de paquetes
Las empresas de software comercial deberían hacerlo mejor, pero todavía parece faltar una herramienta universal y sencilla para los casos en que algo empieza como código amateur o de hobby y termina siendo una dependencia de muchísimos proyectos
Ya puse el mismo comentario en el hilo sobre el ataque a la cadena de suministro de SAP: https://news.ycombinator.com/item?id=47964003
Antes era más común ejecutar
npm installmanualmente, y seguramente solo se hacía cuando se rompía el build o muy de vez en cuandoLos ataques a la cadena de suministro dependen de que la gente, o más exactamente los pipelines, actualicen paquetes automáticamente en cuanto sale una nueva versión sin pensarlo mucho
No sé si eso sea un buen modelo de negocio; probablemente no
left-padno fue un ataque, fue un bug de NPMNo debería haber sido posible borrar una versión de un paquete del que ya dependían otros paquetes públicos, y en cambio sí debería haber sido posible borrar una versión nueva específica de un paquete de la que nadie dependía
Cuando el autor de
left-padintentó borrar todos sus datos con la intención de abandonar el servicio, NPM debió haber devuelto un código de errorSegún Wikipedia, cuando Koçulu se decepcionó de la decisión de npm, Inc. y dijo que no quería seguir siendo parte de la plataforma, Schlueter, creador de NPM, le proporcionó el comando para borrar los 273 módulos que había registrado
Lo raro es que se abrieron 4 issues de seguridad y en todos el bot
pl-ghostcomentó automáticamente y los cerró [1][2][3][4]Al final, solo [4] se atendió correctamente y todos los comentarios del bot fueron eliminados
En otro reporte [5] se puede ver el comentario del bot, y da más información que la publicación original
[1] https://github.com/Lightning-AI/pytorch-lightning/issues/216...
[2] https://github.com/Lightning-AI/pytorch-lightning/issues/216...
[3] https://github.com/Lightning-AI/pytorch-lightning/issues/216...
[4] https://github.com/Lightning-AI/pytorch-lightning/issues/216...
[5] https://socket.dev/blog/lightning-pypi-package-compromised
El atacante creó un nuevo workflow de Actions con esa cuenta y, desde ese workflow ejecutado, extrajo y se llevó los secretos de PyPI
Después de publicar el paquete, usó esa misma cuenta para comentar y burlarse un poco de nosotros
Ojalá llegue pronto el día en que no haya dependencias en absoluto
Como ejemplo extremo, ahora cuando hago apps educativas interactivas para mi hija le pido a Opus que use solo JavaScript y HTML puros
Desde péndulos dobles hasta simulaciones de fluidos, todo funciona de una sola vez, y antes eso implicaba cientos de dependencias
Si el código tiene licencia MIT, puedo pedirle a Opus que extraiga exactamente las partes necesarias, las adapte a mi caso de uso y las incluya
En proyectos de hobby me ha funcionado bien hasta ahora, y ojalá en el futuro también el software de producción pueda quedarse sin dependencias
Si Chrome cambia la forma de alguna API, tú mismo tendrás que encontrarlo y corregirlo; y si Marruecos cambia la fecha de inicio del horario de verano, también tendrás que actualizar por tu cuenta el código de fechas y horas
Esas son cosas que las librerías nos resolvían y que dábamos por sentadas
No es gran cosa para un simulador de péndulo doble del que tu hija perderá interés la próxima semana, pero sí es un problema para una empresa que construye algo que debe seguir funcionando indefinidamente
Debería publicar algún código de acceso remoto con licencia MIT para que entre en los datos de entrenamiento de Opus
Cuando tomé el curso de deep learning de Fast.AI, me sorprendió la cantidad de dependencias de Python que arrastra un proyecto de machine learning
Siempre pensé que los proyectos de frontend web tenían muchas dependencias de terceros, pero a mí el ecosistema de machine learning me parece mucho más enredado
Además, el desarrollo web siempre se ha considerado sensible a la seguridad, así que ha acumulado mucha sabiduría y prácticas al respecto, mientras que el desarrollo de ML parece mucho más improvisado y como que ni siquiera aplica muchas prácticas generales de ingeniería de software
Por ejemplo, en ese momento una de las formas de desplegar modelos de ML era con Python pickle, que es básicamente un objeto ejecutable sin restricciones por defecto
Un modelo en ese formato podía hacer cualquier cosa en la computadora que lo importara, y ese ecosistema tipo lejano oeste de los inicios puede facilitar mucho más las intrusiones de seguridad y los ataques a la cadena de suministro
Algunos aprendieron algo de programación sobre la marcha, algunos son matemáticos, y otros son como desarrolladores intoxicados con la IA
También existe la mentalidad de “el código ya no importa, mientras funcione”
Para mucha gente, una gestión de dependencias adecuada no es más que trabajo tedioso del que no quiere ocuparse
En muchos proyectos de machine learning se combinan todos esos factores, cuando en realidad los proyectos de ML deberían ser de los que más se enfocan en la reproducibilidad
Busqué en repositorios y me salieron 2.2 mil repositorios creados en el último día que contienen el texto
"A Mini Shai-Hulud has Appeared": https://github.com/search?q=A%20Mini%20Shai-Hulud%20has%20Ap...Eso parece indicar que se usaron para crear repositorios después de comprometer cuentas, probablemente tokens de autenticación de GitHub/Actions
Ya había pasado algo parecido antes, así que pensé que habrían aprendido la lección
Este malware no se esforzó mucho, y Microsoft tampoco parece estar esforzándose mucho
Para ser claro, nunca he usado pytorch y tampoco sé mucho de prácticas de seguridad de software
Pero no se me ocurren muchos escenarios en los que pytorch necesite acceso a red
Parece incorrecto que desde cualquier parte del código base se pueda importar cualquier módulo y usar esa API
Da la impresión de que hacen falta restricciones adicionales de importación o análisis estático
El lenguaje no parece tener la abstracción adecuada para tratar estos problemas
En comparación, me gusta que en Rust puedas ver mutabilidad y lifetimes solo con la firma de una función, sin entender el código interno
Siento que hace falta algo parecido para las dependencias
Los desarrolladores deberían poder auditar fácilmente todas las dependencias sin meterse al código inferior y ver “ah, esta dependencia usa
eval()” o “tiene acceso a red”Las apps móviles obligan a pedir permisos; uno pensaría que los desarrolladores también deberían poder poner en lista blanca solo ciertas capacidades, en lugar de tragarse bloques enormes de funcionalidad
No me gusta generalizar, pero parece que la comunidad de desarrollo de IA en particular prioriza la comodidad por encima de cualquier otra consideración
Por ejemplo, ya casi es estándar que un proyecto descargue automáticamente un modelo grande en la primera ejecución
Normalmente se puede desactivar, pero encontrar el parámetro correcto es un dolor terrible por las capas profundas de clases y código repartidas entre varias librerías
Está bien que sea muy fácil empezar con cosas complejas, por lo general casi juguetes, pero este ambiente permisivo es bastante incómodo
Siento que el primer paso para resolver cualquier problema siempre es “
pip install …”, y algunos entornos, como MacOS, ni siquiera virtualizan bien el acceso a GPUEsta semana me estaba preguntando si era buena idea usar uv para gestionar versiones de Python
El sitio web [1] dice: “Como Python no ofrece binarios oficiales para distribución, uv usa distribuciones del proyecto Astral python-build-standalone”
Apunta a este repositorio de GitHub https://github.com/astral-sh/python-build-standalone, y ahí luego menciona https://gregoryszorc.com/docs/python-build-standalone/main/r...
Si lo entendí bien, parece que no toman directamente de python.org el código fuente para compilar Python, y no estoy seguro de qué tan seguro sea eso
Tengo la misma preocupación con asdf [2], aunque asdf usa pyenv [3] y eso me suena más cercano a lo oficial
¿Alguien puede explicar cuál herramienta es mejor y más segura entre uv y asdf para instalar Python?
[1] https://docs.astral.sh/uv/guides/install-python/
[2] https://github.com/asdf-community/asdf-python
[3] https://github.com/pyenv/pyenv/tree/master/plugins/python-bu...
De hecho, ¿de dónde más lo sacaría?
[1]: https://github.com/astral-sh/python-build-standalone/blob/a2...
uvycpythonno me preocupan demasiado. El proceso es sólido, responden rápido y ahora además tienen bastante financiamientoLo que sí me preocupa es, por ejemplo, un formateador como
mdformat, muy usado pero mantenido principalmente por una sola persona en su tiempo libre, o una dependencia súper específica que lleva años sin actualizarse y está tres niveles abajo en el árbol de dependenciasNo quiero fijar y aprobar manualmente todas las actualizaciones en una app desarrollada activamente, pero para una app seria eso ya empieza a parecer obligatorio
Mientras tanto voy a sacar las claves API de archivos
.envsin cifrarSi te pasa en una gran webapp de consumo da vergüenza, pero se entiende; perder cientos o miles de dólares por una dependencia indirecta de un repositorio demo de juguete que casualmente está en el mismo host y sistema duele muchísimo
¿Alguien sabe si OAI o Anthropic reembolsan cuando te roban claves de esta manera, o se considera error del usuario?
No sé cuánto cambia el riesgo si ellos compilan los binarios de Python o si los compila alguien más
Últimamente la mayoría de mis
pip installvienen de sugerencias de Claude Code, y yo solo aprieto EnterEl modelo fue entrenado con datos de hace unos meses, así que no tiene forma de saber qué se comprometió esta semana
Básicamente armé el peor filtro posible para decidir si “este paquete es seguro en este momento”
Dijiste que dejas que Claude Code recomiende software para instalar desde internet, y luego lo instalas tal cual
Nunca he oído a nadie sugerir que Claude Code, ni ningún LLM, sea un filtro para decidir “si este paquete es seguro en este momento”, y por las razones que mencionaste parece una heurística pésima
setup.pyen tu máquinaEso es porque no hay una inspección real del paquete antes de ejecutarlo
Lo que hace falta es una herramienta que obtenga metadatos antes de ejecutar nada y verifique qué hooks existen
Claude Code se actualiza casi todos los días, a veces varias veces por día
Si algún día comprometen Anthropic, a todos nos va a ir muy mal
Pero hoy en día todo es YOLO
Vi este mensaje en GitHub del 20 de abril y me dejó algo confundido
"deependujha hi @thebaptiste, thanks for inquiring. Release of 2.6.2 is blocked due to some internal reasons. Will notify once release is made."Si sabían del problema desde entonces y no advirtieron hasta ahora, eso sí me parecería muy mal
Ojalá alguien que sepa más pueda aclararlo bien
https://github.com/Lightning-AI/pytorch-lightning/issues/216...
Antes de eso no había distribuciones afectadas y no sabíamos de la filtración
La release original en GitHub no tenía problema, pero la bajamos para evitar confusiones