Un gusano autopropagante conocido como Mini Shai-Hulud logró publicar código malicioso en npm y PyPI usando firmas criptográficas legítimas.
Según reportes de Socket, Wiz y StepSecurity, el ataque comprometió 169 paquetes en menos de 24 horas. Entre los afectados están @tanstack/react-router (12 millones de descargas semanales), Mistral AI, UiPath y OpenSearch.
El grupo TeamPCP ejecutó así la quinta oleada de una familia de gusanos que comenzó en septiembre de 2025. Cada versión ha sido más sofisticada que la anterior.
Cómo burlaron la seguridad sin robar contraseñas
El ataque no usó contraseñas robadas. TeamPCP explotó tres vulnerabilidades encadenadas de GitHub Actions. Primero, abrieron un pull request contra TanStack usando un fork renombrado como “configuration” para evitar sospechas.
Ese PR activó un workflow con pull_request_target, que ejecuta código del fork pero con permisos del repositorio original.
Luego envenenaron la caché de GitHub Actions con un store de pnpm corrupto de 1.1 GB. Cuando un push legítimo activó el workflow de publicación, la caché se restauró. Los binarios maliciosos extrajeron el token OIDC directamente de la memoria del runner mediante /proc/[pid]/mem.
Así publicaron 84 versiones maliciosas sin robar ninguna credencial npm.

Cada paquete contenía un archivo router_init.js de 2.3 MB. Al instalarse, el gusano recolectaba tokens de GitHub Actions, credenciales AWS, GCP y Azure, llaves SSH, wallets de criptomonedas y secretos de Kubernetes.
El payload usaba tres capas de ofuscación: rotación de strings, cifrado Fisher-Yates con PBKDF2-SHA256 y 11 bloques cifrados con AES-256-GCM.
Lo más grave es la autopropagación. El gusano descubre paquetes del mantenedor víctima vía API de npm, descarga el tarball, inyecta el código malicioso y lo republica usando el token OIDC robado.
En cuestión de horas saltó de 84 versiones en TanStack a más de 373 versiones en 169 paquetes. Microsoft Threat Intelligence descubrió que la variante de Mistral AI en PyPI contenía una rutina de sabotaje dirigida a usuarios en Israel e Irán.
Esta es la primera vez que un gusano npm produce attestaciones SLSA Build Level 3 válidas para paquetes maliciosos. Las firmas Sigstore certifican que los paquetes fueron construidos por el pipeline legítimo de TanStack. Lo que no verifican es que el código fuera seguro. El equipo de TanStack publicó un postmortem confirmando que ni el 2FA activado en todas las cuentas detuvo el ataque.
El malware también instalaba un daemon gh-token-monitor que cada 60 segundos verificaba si el token robado seguía activo. Si detectaba su revocación, ejecutaba rm -rf ~/ para borrar el home directory.
El daemon se autodesactivaba tras 24 horas. La lección es clara: la seguridad basada solo en autenticación ya no es suficiente cuando los atacantes secuestran los pipelines de CI/CD.
Si instalaste algún paquete @tanstack/* entre el 11 y 12 de mayo, trata tu sistema como comprometido. Rota todas las credenciales: tokens de npm, GitHub, cloud providers y servicios de IA.
Referencias: Socket · Wiz · StepSecurity · The Hacker News · TanStack postmortem


