Shai-Hulud 2.0 Supply Chain Attack Campaign (también conocido como Mini Shai-Hulud o Shai-Hulud: The Second Coming) es una campaña de ataque a la cadena de suministro de software de escala masiva, considerada uno de los compromisos más significativos en el ecosistema nativo de la nube observados hasta la fecha. La campaña, que afectó a cientos de paquetes en los registros npm y PyPI, representa una evolución táctica de ataques anteriores (incluyendo el compromiso s1ngularity/Nx de agosto de 2025) y se distingue por ser el primer gusano autorreplicante exitoso en comprometer paquetes de npm, propagándose automáticamente a nuevos paquetes y convirtiendo a cada víctima en un vector para un mayor compromiso. El nombre "Shai-Hulud" hace referencia a los icónicos gusanos de arena de la serie "Dune" de Frank Herbert, y la campaña utilizó consistentemente nombres de repositorios y descripciones inspirados en Dune (como "Shai-Hulud Migration", "Sha1-Hulud: The Second Coming"). La campaña inicial fue detectada en septiembre de 2025, con una resurgencia significativa ("Mini Shai-Hulud") detectada por Microsoft Security Research el 11 de mayo de 2026, comprometiendo 170+ paquetes npm y 2 paquetes PyPI a través de 404 versiones maliciosas. El ataque se originó cuando los atacantes comprometieron cuentas de mantenedores de proyectos ampliamente utilizados (incluyendo TanStack, Mistral AI, Zapier, PostHog, Postman, UiPath, Bitwarden CLI, SAP, entre otros) y publicaron versiones maliciosas que ejecutaban código durante la fase de instalación (scripts preinstall o prepare). El malware, que utiliza el runtime Bun (un competidor rápido de Node.js), está triplemente ofuscado (obfuscator.io string table → PBKDF2 cipher → AES-256-GCM decryption) y realiza un reconocimiento exhaustivo del entorno, robando tokens de GitHub, tokens de npm, credenciales de AWS/GCP/Azure, tokens de Kubernetes, secretos de HashiCorp Vault, claves SSH, configuraciones de herramientas de IA (Claude Code), y variables de entorno. Utiliza TruffleHog (una herramienta legítima de escaneo de secretos) de manera ofensiva para buscar secretos en todo el sistema de archivos. Los datos robados son exfiltrados a repositorios públicos de GitHub creados bajo las cuentas de las víctimas (con nombres como "Shai-Hulud" o "Sha1-Hulud: The Second Coming"), y los atacantes también establecen persistencia inyectando flujos de trabajo de GitHub Actions maliciosos (shai-hulud-workflow.yml) que serializan todos los secretos del repositorio (${{ toJSON(secrets) }}). Una de las técnicas más innovadoras y peligrosas es el uso de publicación de confianza (trusted publishing) mediante OIDC: en lugar de robar tokens npm de larga duración, el malware aprovecha los permisos OIDC del flujo de trabajo de GitHub Actions comprometido para generar tokens de publicación de corta duración durante la compilación, publicando nuevas versiones maliciosas de paquetes con atestación de procedencia SLSA válida (firmas digitales legítimas), lo que significa que, para los sistemas de seguridad automatizados, los paquetes parecen 100% legítimos y construidos en el entorno oficial. La campaña también incluye un comportamiento de sabotaje selectivo: en entornos cuyas variables sugieren ubicación en Israel o Irán, el malware tiene una probabilidad aproximada de 1 entre 6 de ejecutar un comando rm -rf /, subrayando la naturaleza destructiva y posiblemente geopolítica de la operación. Microsoft Defender for Cloud, StepSecurity, Socket y otras firmas de seguridad han proporcionado detecciones y recomendaciones para esta campaña, que afectó a 28,000 repositorios de GitHub con más de 5,000 archivos que contenían secretos exfiltrados.
Nombres Alternativos / Aliases
- Shai-Hulud 2.0 (Por la segunda versión del ataque)
- Mini Shai-Hulud (Por la resurgencia de mayo de 2026)
- Shai-Hulud: The Second Coming (Por la descripción utilizada en repositorios)
- TanStack Supply Chain Attack (Por el ecosistema más afectado)
- Bun Runtime Worm (Por el runtime utilizado para ejecutar el malware)
Fecha de Detección / Actividad
- Primer Ataque Shai-Hulud: Septiembre de 2025
- Compromiso s1ngularity/Nx (Precursor): Agosto de 2025
- Shai-Hulud: The Second Coming: Noviembre de 2025
- Mini Shai-Hulud (Resurgencia Mayor): 11 de mayo de 2026 (detección por Microsoft Security Research)
- Período de Actividad: Agosto 2025 - mayo 2026 (y continúa)
- Estado: Activo. Las versiones maliciosas han sido identificadas y eliminadas del registro npm, pero los tokens comprometidos y la exposición de datos continúan siendo un riesgo.
Actor de Amenaza (Atribución)
- Nombre del Actor: No atribuido a un grupo específico; se sospecha que es el mismo actor o un actor relacionado con el ataque s1ngularity/Nx.
- Tipo de Actor: Grupo de ciberdelincuencia altamente sofisticado con motivación financiera (robo de credenciales) y posiblemente geopolítica (sabotaje selectivo en Israel/Irán).
- Sofisticación: Extremadamente alta. El actor demuestra capacidades excepcionales: (a) compromiso de cuentas de mantenedores de múltiples proyectos de alto perfil (TanStack, Mistral AI, Zapier, UiPath, SAP, etc.), (b) desarrollo de un gusano autorreplicante de varias etapas que se propaga automáticamente utilizando credenciales robadas, (c) ofuscación de triple capa (string table shuffle → PBKDF2 → AES-256-GCM), (d) uso del runtime Bun para ejecución rápida y multiplataforma, (e) abuso de publicaciones de confianza (trusted publishing) mediante OIDC para publicar paquetes con firmas SLSA válidas (eludiendo la detección basada en firmas), (f) uso ofensivo de TruffleHog para escaneo de secretos, (g) exfiltración a repositorios públicos de GitHub controlados por la víctima (técnica de "living off the land" para evasión), (h) inyección de flujos de trabajo maliciosos de GitHub Actions para persistencia, (i) sabotaje selectivo con
rm -rf / en sistemas con ubicación geográfica específica (Israel/Irán), (j) exfiltración dual mediante webhooks y repositorios públicos, y (k) creación de más de 28,000 repositorios comprometidos con descripciones inspiradas en Dune.
Resumen Ejecutivo
Shai-Hulud 2.0 Supply Chain Attack Campaign es una operación de ciberdelincuencia de una escala y sofisticación sin precedentes en el ecosistema de código abierto, descubierta inicialmente en septiembre de 2025 y con una resurgencia mayor ("Mini Shai-Hulud") detectada por Microsoft Security Research el 11 de mayo de 2026. La campaña representa el primer gusano autorreplicante exitoso en comprometer paquetes de npm, propagándose automáticamente a nuevos paquetes y convirtiendo a cada víctima en un vector de infección adicional. El ataque comenzó cuando los atacantes comprometieron cuentas de mantenedores de proyectos ampliamente utilizados, incluyendo TanStack, Mistral AI, Zapier, PostHog, Postman, UiPath, Bitwarden CLI, SAP, Guardrails AI, OpenSearch, y muchos otros. Los atacantes publicaron versiones maliciosas de paquetes (por ejemplo, @tanstack/react-router@1.169.8, @mistralai/mistralai@2.2.2, @zapier/zapier-sdk@0.15.7) que incluían un script preinstall o prepare en package.json que apuntaba a una dependencia opcional alojada en GitHub (por ejemplo, @tanstack/setup: "github:tanstack/router#79ac49eedf774dd4b0cfa308722bc463cfe5885c"). Cuando npm install se ejecuta, npm clona la dependencia de Git y ejecuta su script prepare, que a su vez ejecuta bun run tanstack_runner.js && exit 1. El && exit 1 es una técnica de evasión: dado que la dependencia es opcional, el código de salida 1 hace que npm trate la dependencia opcional como "fallida" y continúe silenciosamente, mientras que el payload ya se ha ejecutado en segundo plano. El payload (un archivo JavaScript de 2.3 MB triplemente ofuscado) se ejecuta utilizando el runtime Bun, que se descarga automáticamente si no está presente. La ofuscación se realiza en tres capas: (1) tabla de cadenas ofuscadas con javascript-obfuscator, (2) cifrado PBKDF2, y (3) descifrado AES-256-GCM. Una vez descifrado, el malware realiza un reconocimiento exhaustivo del entorno, recopilando: tokens de GitHub (~/.config/gh/hosts.yml, GITHUB_TOKEN de variables de entorno), tokens de npm (~/.npmrc, NPM_TOKEN), credenciales de proveedores de nube (AWS: ~/.aws/credentials, IMDSv2 en 169.254.169.254; Azure: ~/.azure/accessTokens.json; GCP: ~/.config/gcloud/application_default_credentials.json), tokens de Kubernetes (~/.kube/config, token de cuenta de servicio en /var/run/secrets/kubernetes.io/serviceaccount/token), secretos de HashiCorp Vault (punto final vault.svc.cluster.local:8200), claves SSH (~/.ssh/id_rsa, ~/.ssh/id_ed25519), configuraciones de herramientas de IA (Claude Code: .claude/settings.json, .claude.json, ~/.claude/mcp.json), variables de entorno completas (process.env), y archivos sensibles escaneados con TruffleHog (una herramienta legítima de escaneo de secretos utilizada ofensivamente). Los datos robados se comprimen y exfiltran a través de dos canales simultáneos: (1) repositorios públicos de GitHub creados bajo las cuentas de las víctimas con nombres como "Shai-Hulud" o "Sha1-Hulud: The Second Coming" (conteniendo archivos como actionsSecrets.json, cloud.json, contents.json, environment.json, truffleSecrets.json), y (2) webhooks a webhook[.]site. El malware también establece persistencia inyectando un flujo de trabajo de GitHub Actions (shai-hulud-workflow.yml) que serializa todos los secretos del repositorio (${{ toJSON(secrets) }}) y los sube como artefactos. Una de las técnicas más innovadoras es el uso de publicación de confianza (trusted publishing) mediante OIDC (OpenID Connect). En lugar de robar tokens npm de larga duración, el malware, al ejecutarse dentro de un flujo de trabajo de GitHub Actions comprometido, puede generar un token de publicación de npm de corta duración utilizando los permisos OIDC del flujo de trabajo. Luego publica nuevas versiones maliciosas de paquetes con atestación de procedencia SLSA válida (firmas digitales legítimas), lo que significa que, para los sistemas de seguridad automatizados, los paquetes parecen 100% legítimos y construidos en el entorno oficial. Esto hace que la detección basada únicamente en firmas sea completamente inútil. El malware también incluye un comportamiento de sabotaje selectivo: en entornos cuyas variables de entorno o configuraciones regionales sugieren ubicación en Israel o Irán, el malware tiene una probabilidad aproximada de 1 entre 6 de ejecutar rm -rf / (borrado recursivo de todo el sistema de archivos), subrayando una posible motivación geopolítica. El alcance del ataque es masivo: 28,000 repositorios de GitHub afectados, más de 5,000 archivos que contienen secretos exfiltrados, y más de 170 paquetes npm y 2 paquetes PyPI comprometidos a través de 404 versiones maliciosas. Microsoft Defender for Cloud, StepSecurity, Socket, Aikido Security y otras firmas han proporcionado detecciones y herramientas de mitigación.
Vectores de Ataque / Métodos de Distribución
- Compromiso de Cuentas de Mantenedores: Los atacantes comprometen cuentas de npm de mantenedores de proyectos populares (TanStack, Mistral AI, Zapier, UiPath, SAP, etc.) mediante robo de credenciales, email takeover, o reutilización de tokens comprometidos en ataques anteriores (como s1ngularity/Nx).
- Publicación de Versiones Maliciosas: Los atacantes publican nuevas versiones de paquetes legítimos que contienen una dependencia opcional maliciosa apuntando a un fork de GitHub (ej.,
@tanstack/setup: "github:tanstack/router#79ac49eedf774dd4b0cfa308722bc463cfe5885c").
- Ejecución durante Instalación npm: Cuando un desarrollador o pipeline CI/CD ejecuta
npm install, npm clona la dependencia de Git y ejecuta su script prepare, que invoca bun run tanstack_runner.js && exit 1.
- Ejecución del Payload con Bun: El script
tanstack_runner.js descarga o utiliza el runtime Bun existente para ejecutar el payload ofuscado de 2.3 MB.
- Propagación Automática (Gusano): Utilizando los tokens npm y GitHub robados, el malware consulta el registro npm en busca de otros paquetes propiedad del mantenedor comprometido, inyecta el código malicioso en esos paquetes, y publica nuevas versiones comprometidas, creando un efecto en cascada.
- Publicación de Confianza (Trusted Publishing) mediante OIDC: Si el malware se ejecuta dentro de un flujo de trabajo de GitHub Actions, puede generar un token de publicación de npm de corta duración utilizando OIDC, publicando paquetes con firmas SLSA válidas que parecen legítimos.
Técnicas, Tácticas y Procedimientos (TTPs) - MITRE ATT&CK
| Táctica (MITRE ATT&CK)
|
Técnica / Subtécnica
|
Descripción / Implementación
|
| Resource Development (TA0042)
|
Compromise Accounts (T1586) - Cloud Accounts (T1586.003)
|
Compromiso de cuentas de mantenedores de npm y GitHub.
|
| Resource Development (TA0042)
|
Acquire Infrastructure (T1583)
|
Creación de forks de GitHub y repositorios públicos para exfiltración.
|
| Initial Access (TA0001)
|
Supply Chain Compromise (T1195) - Compromise Software Supply Chain (T1195.002)
|
Publicación de versiones maliciosas de paquetes npm y PyPI.
|
| Execution (TA0002)
|
Command and Scripting Interpreter: Node.js (T1059.013)
|
El script prepare ejecuta bun run tanstack_runner.js.
|
| Execution (TA0002)
|
User Execution: Malicious File (T1204.002)
|
npm install ejecutado por desarrollador o pipeline CI/CD.
|
| Persistence (TA0003)
|
Event Triggered Execution (T1546)
|
Inyección de flujo de trabajo de GitHub Actions (shai-hulud-workflow.yml).
|
| Persistence (TA0003)
|
Create or Modify System Process (T1543)
|
Instalación de persistencia en ~/.bashrc, ~/.zshrc (ataque s1ngularity).
|
| Defense Evasion (TA0005)
|
Obfuscated Files or Information (T1027)
|
Triple ofuscación: string table shuffle → PBKDF2 → AES-256-GCM.
|
| Defense Evasion (TA0005)
|
Masquerading (T1036)
|
Uso de nombres de repositorios inspirados en Dune ("Shai-Hulud", "Sha1-Hulud").
|
| Defense Evasion (TA0005)
|
Deobfuscate/Decode Files or Information (T1140)
|
Descifrado del payload en tiempo real usando AES-256-GCM.
|
| Defense Evasion (TA0005)
|
Subvert Trust Controls: Code Signing (T1553.002)
|
Publicación de paquetes con atestación de procedencia SLSA válida (confianza en la firma).
|
| Credential Access (TA0006)
|
Credentials from Password Stores (T1555.003)
|
Robo de tokens de GitHub, npm, y credenciales de navegadores.
|
| Credential Access (TA0006)
|
Unsecured Credentials: Credentials In Files (T1552.001)
|
Lectura de ~/.aws/credentials, ~/.kube/config, ~/.npmrc, etc.
|
| Discovery (TA0007)
|
System Information Discovery (T1082)
|
Reconocimiento del sistema operativo, arquitectura, variables de entorno.
|
| Discovery (TA0007)
|
File and Directory Discovery (T1083)
|
Escaneo de sistema de archivos con TruffleHog.
|
| Discovery (TA0007)
|
Cloud Infrastructure Discovery (T1580)
|
Consulta a IMDSv2 (169.254.169.254) y ECS metadata (169.254.170.2).
|
| Collection (TA0009)
|
Archive Collected Data (T1560) - Archive via Utility (T1560.001)
|
Empaquetado de secretos en archivos JSON.
|
| Command and Control (TA0011)
|
Web Service (T1102) - Bidirectional Communication (T1102.002)
|
Exfiltración a webhook[.]site.
|
| Command and Control (TA0011)
|
Application Layer Protocol: Web Protocols (T1071.001)
|
Comunicación HTTPS a GitHub API y webhooks.
|
| Exfiltration (TA0010)
|
Exfiltration Over Web Service (T1567)
|
Subida de secretos a repositorios públicos de GitHub.
|
| Impact (TA0040)
|
Data Destruction (T1485)
|
rm -rf / con probabilidad 1/6 en sistemas con ubicación en Israel/Irán.
|
| Impact (TA0040)
|
Financial Theft (sin código ATT&CK específico)
|
Venta de credenciales robadas.
|
Flujo de Ataque (Cyber Kill Chain - Mini Shai-Hulud, mayo 2026)
- Reconocimiento: Los atacantes identifican proyectos populares con cuentas de mantenedores potencialmente vulnerables (TanStack, Mistral AI, Zapier, UiPath, SAP, etc.). Aprovechan credenciales robadas del ataque s1ngularity/Nx (agosto 2025).
- Armamento: Los atacantes desarrollan el payload de 2.3 MB triplemente ofuscado (obfuscator.io → PBKDF2 → AES-256-GCM). Crean forks de repositorios legítimos en GitHub (ej.,
tanstack/router#79ac49eedf774dd4b0cfa308722bc463cfe5885c). Preparan dependencias opcionales maliciosas.
- Entrega: Utilizando cuentas de mantenedores comprometidas, publican versiones maliciosas de paquetes npm (404 versiones en 170+ paquetes) y PyPI (2 paquetes).
- Explotación: Un desarrollador o pipeline CI/CD ejecuta
npm install (sin versiones fijas). npm resuelve la dependencia opcional, clona el fork de GitHub, y ejecuta el script prepare que invoca bun run tanstack_runner.js && exit 1.
- Instalación: Bun runtime ejecuta el payload descifrado. El malware: (a) realiza reconocimiento del sistema, (b) roba credenciales (GitHub, npm, AWS, Azure, GCP, Kubernetes, Vault, SSH, Claude AI), (c) escanea el sistema de archivos con TruffleHog.
- Comando y Control (C2): El malware exfiltra los datos robados a repositorios públicos de GitHub creados bajo las cuentas de las víctimas (nombres como "Shai-Hulud" o "Sha1-Hulud: The Second Coming") y a webhooks.
- Acción sobre Objetivos:
- Propagación (Gusano): Con los tokens npm robados, consulta el registro en busca de otros paquetes del mantenedor, inyecta el código malicioso, y publica nuevas versiones comprometidas.
- Persistencia: Inyecta flujos de trabajo de GitHub Actions (
shai-hulud-workflow.yml) que serializan secretos (${{ toJSON(secrets) }}).
- Publicación de Confianza (OIDC): Si está dentro de GitHub Actions, genera un token OIDC y publica paquetes con firmas SLSA válidas.
- Sabotaje Selectivo: Si las variables de entorno indican ubicación en Israel o Irán, ejecuta
rm -rf / con probabilidad 1/6.
- Migración de Repositorios: Clona repositorios privados y los vuelve a publicar como públicos con sufijo
-migration.
Infraestructura Utilizada
| Tipo
|
Indicador / Característica
|
Propósito
|
| Registros de Paquetes Afectados
|
npm, PyPI
|
Distribución de versiones maliciosas.
|
| Forks de GitHub
|
github:tanstack/router#79ac49eedf774dd4b0cfa308722bc463cfe5885c
|
Alojamiento del script tanstack_runner.js.
|
| Runtime
|
Bun
|
Ejecución del payload ofuscado.
|
| Repositorios de Exfiltración
|
Nombres: "Shai-Hulud", "Sha1-Hulud: The Second Coming"
|
Almacenamiento de secretos robados (actionsSecrets.json, cloud.json, etc.).
|
| Webhook C2
|
webhook[.]site/bb8ca5f6-4175-45d2-b042-fc9ebb8170b7
|
Exfiltración secundaria.
|
| Punto final de metadatos de AWS
|
169.254.169.254, 169.254.170.2
|
Robo de credenciales IAM efímeras.
|
| Punto final de Vault
|
vault.svc.cluster.local:8200
|
Robo de secretos de HashiCorp Vault.
|
| Herramienta de Escaneo
|
TruffleHog
|
Escaneo de secretos en sistema de archivos.
|
| Flujo de Trabajo de Persistencia
|
shai-hulud-workflow.yml
|
Exfiltración de secretos de GitHub Actions.
|
Objetivos y Sectores Afectados
- Objetivo Principal: Desarrolladores de software, equipos de DevOps, y pipelines CI/CD que utilizan npm, PyPI, GitHub Actions y entornos en la nube.
- Sector Prioritario: Tecnología, SaaS, Desarrollo de Software, Servicios en la Nube, Automatización, IA (Mistral AI).
- Ecosistemas Afectados: npm (más de 170 paquetes), PyPI (2 paquetes), GitHub Actions.
- Organizaciones Afectadas (Paquetes Comprometidos): TanStack, Mistral AI, Zapier, PostHog, Postman, UiPath, Bitwarden CLI, SAP, Guardrails AI, OpenSearch, CrowdStrike (paquetes @crowdstrike), ENS (Ethereum Name Service), Nx (s1ngularity), entre muchos otros.
- Número de Repositorios Afectados: 28,000 repositorios de GitHub.
- Número de Archivos con Secretos: 5,000+ archivos.
- Distribución Geográfica: Global, con sabotaje selectivo dirigido a Israel e Irán.
Impacto y Riesgo
- Nivel de Riesgo: Crítico para cualquier organización que haya instalado las versiones comprometidas de los paquetes afectados (directa o transitivamente). La naturaleza autorreplicante del gusano y la publicación con firmas SLSA válidas hacen que el ataque sea particularmente peligroso.
- Impacto Potencial (Secretos Robados):
- Tokens de GitHub: Acceso a repositorios privados, capacidad de publicar nuevas versiones maliciosas, inyección de flujos de trabajo maliciosos.
- Tokens de npm: Publicación de versiones maliciosas de paquetes populares, propagación del gusano.
- Credenciales de AWS, Azure, GCP: Acceso a infraestructura cloud, robo de datos, despliegue de ransomware, minería de criptomonedas.
- Tokens de Kubernetes: Control de clústeres enteros, despliegue de contenedores maliciosos.
- Secretos de Vault: Acceso a todos los secretos almacenados en HashiCorp Vault.
- Claves SSH: Acceso a servidores internos y sistemas de producción.
- Configuraciones de Claude AI: Uso no autorizado de APIs de IA, robo de datos de entrenamiento.
- Impacto Potencial (Adicional):
- Migración de Repositorios Privados: Más de 5,500 repositorios privados fueron expuestos públicamente en el ataque s1ngularity/Nx (precursor). Shai-Hulud continuó esta táctica.
- Sabotaje Destructivo:
rm -rf / con probabilidad 1/6 en sistemas en Israel/Irán.
- Pérdida de Confianza en la Cadena de Suministro: La capacidad de publicar paquetes con firmas SLSA válidas socava la confianza en los sistemas de verificación de procedencia.
- Contexto Más Amplio (Evolución): Shai-Hulud es la tercera fase de una trilogía de ataques (s1ngularity/Nx → Shai-Hulud → Shai-Hulud 2.0 / Mini Shai-Hulud). Los atacantes han refinado continuamente sus tácticas, pasando de compromisos aislados a un gusano autorreplicante completamente automatizado.
Recomendaciones de Mitigación
- Contención Inmediata y Rotación de Credenciales (M1026, M1053):
- Auditar dependencias: Buscar en
package-lock.json, yarn.lock, pnpm-lock.yaml las versiones comprometidas de los paquetes afectados (lista completa de paquetes y versiones en la tabla de este informe).
- Eliminar versiones maliciosas: Revertir a versiones limpias conocidas (ej.,
@tanstack/react-router@1.169.5 → versión anterior segura).
- Rotar todas las credenciales: Asumir que todos los secretos en máquinas o runners CI/CD que ejecutaron versiones comprometidas están expuestos. Rotar: tokens de GitHub, tokens de npm, claves AWS/Azure/GCP, tokens de Kubernetes, claves SSH, secretos de Vault, tokens de Claude AI.
- Auditar GitHub: Buscar repositorios públicos con nombres "Shai-Hulud", "Sha1-Hulud: The Second Coming", o sufijo
-migration. Eliminarlos inmediatamente.
- Fortalecimiento de Pipelines CI/CD (M1030, M1037):
- Usar runners efímeros: Destruir runners después de cada construcción para prevenir persistencia.
- Restringir conexiones salientes: Bloquear tráfico a IPs y dominios no autorizados (incluyendo
webhook[.]site, 169.254.169.254, vault.svc.cluster.local).
- Implementar períodos de enfriamiento (cooldown): No aceptar versiones de paquetes publicadas en las últimas 48-72 horas en entornos de producción.
- Fijar dependencias: Usar
npm ci en lugar de npm install, y fijar versiones exactas en package.json (evitar ^ y ~).
- Protección de Cuentas y Autenticación (M1032, M1018):
- Exigir autenticación multifactor (MFA) resistente al phishing (WebAuthn/FIDO2) para todas las cuentas de npm, GitHub y plataformas cloud.
- Usar publicación de confianza (trusted publishing) con OIDC de manera segura, pero auditar los flujos de trabajo que generan tokens OIDC para asegurar que no están comprometidos.
- Revisar y revocar tokens de larga duración: Eliminar tokens npm, PAT de GitHub y claves de API que no sean estrictamente necesarias.
- Detección de Malware en Tiempo de Ejecución (M1040):
- Monitorear procesos hijos de npm/Bun: Alertar sobre la ejecución de
bun durante npm install o la creación de procesos shai-hulud-workflow.yml.
- Detectar accesos a puntos finales de metadatos cloud: Alertar sobre tráfico a
169.254.169.254 o 169.254.170.2 desde procesos Node.js/Bun.
- Monitorear creación de repositorios públicos en GitHub: Alertar sobre repositorios con nombres sospechosos ("Shai-Hulud", "Sha1-Hulud").
- Prevención de Futuros Ataques (M1038, M1049):
- Implementar análisis de composición de software (SCA) con SBOM: Herramientas como Microsoft Defender for Cloud (agentless code scanning), Socket, StepSecurity, o Aikido Safe Chain pueden detectar paquetes maliciosos antes de la instalación.
- Usar registros privados con cuarentena: Implementar un registro npm privado (como StepSecurity Secure Registry) con un período de enfriamiento configurable (ej., 10 días) para versiones recién publicadas.
- Concientización de desarrolladores: Educar a los equipos sobre los riesgos de las dependencias opcionales y los scripts de ciclo de vida (
preinstall, prepare, postinstall).
Herramientas de Detección
- Microsoft Defender for Cloud: Detecta paquetes maliciosos de Shai-Hulud mediante escaneo de código sin agente (agentless code scanning) que genera un SBOM y lo compara con inteligencia de amenazas.
- Microsoft Defender XDR: Proporciona alertas como "Sha1-Hulud Campaign Detected – Possible command injection to exfiltrate credentials" y "Suspicious usage of shred command on hidden files detected".
- StepSecurity AI Package Analyst: Detectó la campaña Mini Shai-Hulud en tiempo real, evaluando anomalías como tamaños de tarball y dependencias opcionales sospechosas.
- Socket: Herramienta de análisis de dependencias que detecta comportamiento malicioso en paquetes npm (acceso a archivos, exfiltración, ofuscación).
- Aikido Safe Chain: Intercepta comandos
npm, npx, yarn, pnpm y verifica paquetes contra una base de datos de malware antes de la instalación.
- Caza Avanzada (KQL): Consultas en Microsoft Defender XDR para buscar ejecución de
bun run tanstack_runner.js, procesos hijos sospechosos de node, y creación de repositorios "Shai-Hulud".
Referencias y Fuentes
- Microsoft Defender Security Research Team. (2026, 13 de mayo). *Shai-Hulud 2.0: Guidance for detecting, investigating, and defending against the supply chain attack*. (Artículo proporcionado por el usuario).
- Henares Jimenez, S. (2026, 14 de mayo). Shai-Hulud: ataque a la cadena de suministro compromete cientos de paquetes en npm y PyPI. (Artículo proporcionado por el usuario).
- Silva, R. (2026, 12 de mayo). *Vuelve el «mini Shai-Hulud»: el gusano de npm afecta a más de 160 paquetes, entre ellos Mistral y Tanstack*. (Artículo proporcionado por el usuario).
- Ruiz, F. (2025, 25 de septiembre). Ataque de Shai-Hulud a la cadena de suministro de NPM: una nueva generación de amenazas auto-replicantes. (Artículo proporcionado por el usuario).
- Chailytko, A., Siman Tov Bustan, M., & Zadok, N. (2025, 24 de noviembre). The Second Coming: Shai-Hulud Is Back at It – How to Protect Your Org. OX Security. (Artículo proporcionado por el usuario).
- MITRE ATT&CK Framework. Enterprise Matrix. (Para mapeo de TTPs).
Historial de Revisiones
| Fecha
|
Versión
|
Autor
|
Cambios Realizados
|
| 2026-05-15
|
1.0
|
Fernando Vargas Hincapié
|
Creación inicial de la entrada basada en análisis de Shai-Hulud 2.0, Mini Shai-Hulud y The Second Coming.
|
Indicadores de Compromiso (IOCs)
| Tipo
|
Valor
|
| Nombre de la Campaña
|
Shai-Hulud 2.0, Mini Shai-Hulud, Shai-Hulud: The Second Coming
|
| Primer Ataque
|
Septiembre 2025
|
| Resurgencia Mayor
|
11 de mayo de 2026
|
| Ecosistemas Afectados
|
npm (170+ paquetes), PyPI (2 paquetes)
|
| Número de Versiones Maliciosas
|
404
|
| Número de Repositorios GitHub Afectados
|
28,000+
|
| Número de Archivos con Secretos
|
5,000+
|
| Runtime
|
Bun
|
| Tamaño del Payload
|
~2.3 MB (triplemente ofuscado)
|
| Técnicas de Ofuscación
|
String table shuffle → PBKDF2 → AES-256-GCM
|
| Archivos de Payload (npm)
|
router_init.js, router_runtime.js, tanstack_runner.js, setup_bun.js, bun_environment.js
|
| Dependencia Opcional Maliciosa
|
@tanstack/setup: "github:tanstack/router#79ac49eedf774dd4b0cfa308722bc463cfe5885c"
|
| Script Malicioso
|
"prepare": "bun run tanstack_runner.js && exit 1"
|
| SHA256 (router_init.js)
|
ab4fcadaec49c03278063dd269ea5eef82d24f2124a8e15d7b90f2fa8601266c
|
| SHA256 (tanstack_runner.js)
|
2ec78d556d696e208927cc503d48e4b5eb56b31abc2870c2ed2e98d6be27fc96
|
| SHA256 (setup_bun.js)
|
No especificado (del artículo original Shai-Hulud 2.0, noviembre 2025)
|
| SHA256 (bun_environment.js)
|
No especificado
|
| Dominios/URLs C2
|
webhook[.]site/bb8ca5f6-4175-45d2-b042-fc9ebb8170b7
|
| Puntos finales de Metadatos Cloud
|
169.254.169.254, 169.254.170.2
|
| Punto final Vault
|
vault.svc.cluster.local:8200
|
| Herramienta de Escaneo
|
TruffleHog
|
| Nombres de Repositorios de Exfiltración
|
"Shai-Hulud", "Sha1-Hulud: The Second Coming", sufijo -migration
|
| Descripciones de Repositorios
|
"Shai-Hulud Migration", "Sha1-Hulud: The Second Coming"
|
| Archivos Exfiltrados
|
actionsSecrets.json, cloud.json, contents.json, environment.json, truffleSecrets.json
|
| Flujo de Trabajo de Persistencia
|
shai-hulud-workflow.yml, shai-hulud.yml
|
| Comando de Sabotaje
|
rm -rf / (probabilidad 1/6 en Israel/Irán)
|
| Autor Falso en Commits
|
"Linus Torvalds" (suplantación)
|
| Paquetes Afectados (parcial, ver tabla completa en análisis)
|
@tanstack/* (42 paquetes, 84 versiones), @mistralai/mistralai, @zapier/zapier-sdk, @uipath/*, @squawk/*, @tallyui/*, @beproduct/nestjs-auth, @draftauth/*, @draftlab/*, @taskflow-corp/cli, @tolka/cli, @ml-toolkit-ts/*, @mesadev/*, @dirigible-ai/sdk, @supersurkhet/*
|
| Comportamiento Anómalo (npm)
|
Dependencias opcionales apuntando a forks de GitHub con scripts prepare que ejecutan bun
|
| Comportamiento Anómalo (Procesos)
|
bun run tanstack_runner.js durante npm install
|
| Comportamiento Anómalo (GitHub)
|
Repositorios públicos creados con nombres "Shai-Hulud" o "Sha1-Hulud"
|
| Comportamiento Anómalo (Red)
|
Tráfico a webhook[.]site, 169.254.169.254, vault.svc.cluster.local
|
| Comportamiento Anómalo (Archivos)
|
Creación de actionsSecrets.json, cloud.json, etc., en repositorios públicos
|
Etiquetas / Categorías
shai-hulud mini-shai-hulud supply-chain-attack npm pypi tanstack mistral-ai zapier uipath sap bitwarden crowdstrike bun trufflehog oidc trusted-publishing slsa self-replicating-worm github-actions credential-theft aws-imds kubernetes hashicorp-vault claude-ai rm-rf sabotage israel iran microsoft-defender stepsecurity socket aikido s1ngularity nx dune shai-hulud-migration linus-torvalds ciberwiki felipe-ruiz raphael-silva salvador-henares alexander-chailytko moshe-siman-tov nir-zadok