Campaña

Shai-Hulud

Shai-Hulud es la denominación asignada a una campaña de ataque contra la cadena de suministro en el famoso ecosistema npm (Node Package Manager). Fue escubierta el 14 de septiembre de 2025 y el nombre proviene del repositorio público que los atacantes empleaban para la exfiltración, describiendo así el comportamiento del malware a la vez que haciendo referencia a los gusanos de arena favoritos de Timothée Chalamet (de la saga Dune). Aunque tanto Shai-Hulud como Sandworm se refieren a la misma criatura, este ataque y la famosa APT Rusa no tienen nada que ver. Esta campaña no ha sido atribuida a ningún grupo a fecha de Agosto 2026.

Esta campaña fue detectada inicialmente en el paquete @ctrl/tinycolor (con 2,2 millones de descargas semanales) por el investigador Daniel dos Santos. Este evento ha representado un punto de inflexión en las campañas centradas en software supply chain: el primer gusano que se autoreplica de manera exitosa dentro del ecosistema npm. A diferencia de un troyano tradicional, que compromete un único host y requiere intervención manual del atacante para propagarse, Shai-Hulud automatiza su dispersión mediante el robo de credenciales de con permisos de publicación, extendiéndose sin intervención humana directa a través de los paquetes mantenidos por los desarrolladores previamente comprometidos.

La campaña fue analizada en profundidad por múltiples firmas de ciberseguridad como Unit 42 de Palo Alto Networks, ReversingLabs, Wiz, Xygeni, StepSecurity y Socket, además de recibir cobertura de cualquier medio que tuviera alguna relación con este mundo.

Campaña

El gusano Shai-Hulud se despliegó a través de un archivo JavaScript denominado bundle.js de aproximadamente 3 MB, empaquetado con Webpack y muy ofuscado ya de paso. Su ejecución se realizaba mediante un hook postinstall añadido al archivo package.json del paquete comprometido. Esto significa que el payload malicioso se activaba automáticamente en el momento de la instalación del paquete, sin requerir ninguna acción adicional por parte del desarrollador o del runner de CI/CD (la abreviación de Continuous Integration and Continuous Delivery).

Una vez ejecutado, el malware iniciaba un proceso de múltiples etapas:

  1. Discovery y recolección de secretos: El payload volcaba las variables de entorno (process.env), escaneba archivos locales en busca de "secretos de alta entropía" (high-entropy secrets) mediante patrones de tokens comunes, y posteriormente desplegaba la herramienta open-source TruffleHog (capaz de detectar más de 800 tipos de credenciales) para ampliar su cobertura. Adicionalmente, consultó los endpoints de metadatos de servicios cloud para recolectar credenciales temporales que permitieran movimiento lateral hacia estos entornos cloud.

  2. Exfiltración: Los datos robados se exfiltraban de dos formas. En la primera el malware creaba automáticamente un repositorio público en la cuenta de GitHub de la víctima con el nombre "Shai-Hulud", donde guardaba toda la información recolectada (contraseñas, tokens, claves de acceso) en un archivo oculto tras una doble capa de codificación. En la segunda, insertaba una automatización maliciosa dentro de los propios proyectos de la víctima que, al ejecutarse, extraía los secretos almacenados en GitHub y los enviaba a un servidor controlado por los atacantes.

  3. Propagación:Una vez que la mascota de T. Chalamet conseguía las credenciales de un desarrollador, las usaba para entrar en su cuenta de npm, localizar todos los paquetes que el individuo mantenía y los infectaba. A cada paquete le inyectaba el código malicioso y lo volvía a publicar como si fuera una actualización legítima. Así, cualquier otro desarrollador que descargase esos paquetes quedaba infectado también, y el ciclo volvía a empezar sin necesidad de contactar de vuelta con el atacante.

  4. Persistencia y exposición: El malware fuerza la migración de repositorios privados de GitHub a públicos, añadiendo el sufijo "-migration" al nombre del repositorio y la descripción "Shai-Hulud Migration". Esto expone código fuente propietario y secretos potencialmente embebidos en el historial de commits. Además, los workflows maliciosos de GitHub Actions permanecen activos hasta que son eliminados manualmente.

Unit 42 de Palo Alto Networks identificó (con confianza moderada eso sí) que los atacantes emplearon LLMs para asistir en la generación del código malicioso, basándose en la presencia de comentarios, emojis y patrones estilísticos en los scripts bash utilizados.

El 15 de septiembre de 2025, ReversingLabs identificó al "paciente cero": el paquete rxnt-authentication, cuyo mantenedor (techsupportrxnt) publicó la versión maliciosa 0.0.3 el 14 de septiembre a las 17:58 UTC. La campaña fue vinculada por Wiz Research con el ataque previo de s1ngularity/Nx (finales de agosto de 2025), donde el robo de tokens de GitHub habilitó esta cadena de compromisos tan entretenida.

Shai-Hulud 2.0 (Noviembre 2025)

A principios de noviembre de 2025, los investigadores de Unit 42 identificaron una segunda oleada de la campaña, denominada Shai-Hulud 2.0 o "Sha1-Hulud: The Second Coming". Esta nueva iteración introdujo cambios significativos:

  • Ejecución en fase preinstall en lugar de postinstall, ampliando drásticamente el área de impacto al garantizar la ejecución en prácticamente todos los servidores de build que procesan el paquete infectado y eludiendo herramientas de escaneo estático que inspeccionan el código en etapas posteriores.
  • Mecanismo de fallback destructivo: si el malware no logra robar credenciales ni establecer un canal de exfiltración, intenta destruir el directorio home de la víctima, sobrescribiendo y eliminando de forma segura todos los archivos con permisos de escritura del usuario actual.
  • Payloads renombrados: los archivos maliciosos pasaron a denominarse setup_bun.js y bun_environment.js (este último de más de 10 MB), haciéndose pasar por un instalador del runtime Bun.
  • Persistencia mediante runners autoalojados: el malware crea un workflow de GitHub Actions (discussion.yaml) que registra la máquina infectada como un runner autoalojado, permitiendo a los atacantes ejecutar comandos arbitrarios a través de la apertura de GitHub Discussions.

El alcance de Shai-Hulud 2.0 fue significativamente mayor: Unit 42 reportó más de 25.000 repositorios maliciosos distribuidos entre aproximadamente 350 usuarios únicos de GitHub.

Consecuencias e Impacto

El impacto de la campaña Shai-Hulud es uno de los más severos registrados en la historia del ecosistema JavaScript:

  • Alcance en el registro npm: Se identificaron cientos de paquetes comprometidos pertenecientes a decenas de mantenedores. Entre los más destacados se encuentran @ctrl/tinycolor (2,2M descargas semanales), ngx-bootstrap (300K descargas semanales), ng2-file-upload (100K), y paquetes de organizaciones como CrowdStrike (múltiples paquetes del scope @crowdstrike), además de librerías ampliamente utilizadas como ngx-toastr, ngx-color, angulartics2, ember-headless-form y koa2-swagger-ui.
  • Exposición de secretos: Wiz Research documentó inicialmente 36 usuarios de GitHub con secretos expuestos en repositorios "Shai-Hulud" y 8 usuarios cuyos repositorios privados fueron migrados a públicos. El análisis de las ramas shai-hulud reveló 64 repositorios adicionales con workflows maliciosos, exponiendo tokens de GitHub, credenciales npm, claves de Atlassian y claves API de Datadog, entre otros.
  • Exposición de código fuente propietario: La funcionalidad de migración de repositorios privados resultó en aproximadamente 700 repositorios con el sufijo -migration y la descripción "Shai-Hulud Migration" expuestos públicamente en GitHub, comprometiendo propiedad intelectual y potencialmente revelando vulnerabilidades en el código fuente.
  • Perfil de víctimas: Entre los afectados se encontraron fundadores y CTOs de empresas tecnológicas, compañías de desarrollo de software, organizaciones sin ánimo de lucro, empresas de hardware de juego, desarrolladores en compañías de IA, e incluso un vendor líder de EDR.

El gusano favorito de Denis Villeneuve demostró que el ecosistema de paquetes open source constituye un entorno muy fértil para la propagación de malware a gran velocidad. Esta combinación de robo de credenciales, exfiltración automatizada y autorreplicación redujo el tiempo de propagación de semanas a horas. La campaña además ha evidenciado la necesidad de controles más exhaustivos y automatizados en los pipelines de desarrollo: escaneo de paquetes antes de la instalación, detección de anomalías en la actividad de publicación, tokens de corta duración y scope limitado, y verificación de integridad de builds. Por otra parte, es interesante ver en retrospectiva como TeamPCP se inspiró en esta campaña para llevar a cabo sus ataques unos meses más tarde.

CONTENIDO RELACIONADO

  1. OCGOCGTeamPCP