
Defensa contra el ataque a la cadena de suministro Shai-Hulud
Una herramienta de seguridad para detectar paquetes npm comprometidos en los ataques a la cadena de suministro Shai-Hulud (septiembre de 2025 original y Shai-Hulud 2.0 noviembre de 2025). Escanea tanto archivos package.json como package-lock.json para detectar versiones instaladas exactas e Indicadores de Compromiso (IoC). Disponible en implementaciones Python y Node.js con configuración YAML centralizada para un mantenimiento sencillo.
Última actualización: 24 de noviembre de 2025 - 738+ paquetes comprometidos rastreados con 1,291 combinaciones únicas paquete@versión. Ahora detecta tanto las variantes originales de Shai-Hulud como las de Shai-Hulud 2.0.
Para escaneo multi-ecosistema, consulte ore-mal-pkg-inspector.
Para escaneo de paquetes maliciosos multi-ecosistema (npm, PyPI, Maven, RubyGems, Go, Cargo), consulte: ore-mal-pkg-inspector - Escáner completo de paquetes maliciosos con inteligencia de amenazas dinámica.
OreNPMGuard se enfoca específicamente en la defensa contra ataques Shai-Hulud para paquetes npm.
Shai-Hulud es un gusano autorreplicante que comenzó a comprometer paquetes npm el 14 y 15 de septiembre de 2025, representando el primer ataque autopropagante exitoso en el ecosistema npm y uno de los ataques más graves a la cadena de suministro de JavaScript observados hasta la fecha. Nombrado en honor a los gusanos de arena gigantes de la serie Dune de Frank Herbert, este malware ha evolucionado en múltiples variantes.
El ataque original infectó 200+ paquetes npm (según lo rastreado en esta herramienta) con múltiples versiones afectadas por paquete.
Una nueva variante surgió en noviembre de 2025 con cambios significativos:
preinstall (no solo postinstall)setup_bun.js y bun_environment.js (además de bundle.js)Referencia: Wiz Research - Artículo del Blog Shai-Hulud 2.0
Paciente Cero: El ataque comenzó con el paquete rxnt-authentication publicado el 14 de septiembre de 2025 a las 17:58:50 UTC por la cuenta npm comprometida "techsupportrxnt".
Cadena de Ataque (Shai-Hulud Original):
postinstall que ejecuta bundle.js (payload JavaScript de 3MB+)data.json (codificado en base64 doble).github/workflows/shai-hulud-workflow.yml) que exfiltra secretos del repositorio a webhook[.]sitepostinstallCadena de Ataque (Shai-Hulud 2.0 - noviembre de 2025):
preinstall que ejecuta setup_bun.js o bun_environment.js (nuevos archivos de payload)cloud.json, contents.json, environment.json y truffleSecrets.json.github/workflows/discussion.yaml con runner autoalojado para acceso de puerta trasera.github/workflows/formatter_*.yml para exfiltración de secretos (luego elimina el workflow para ocultar la actividad)docker run --rm --privileged -v /:/hostghp_*, gho_*), tokens de autenticación npmShai-Hulud Original (septiembre de 2025):
@ctrl/tinycolor, ngx-bootstrap)Shai-Hulud 2.0 (noviembre de 2025):
Robo de Credenciales Verificado (de ~20,000 repositorios analizados):
CRÍTICO: Wiz Research ha confirmado que se está produciendo exfiltración cruzada entre víctimas. Esto significa:
Implicación para la Investigación: Al revisar datos exfiltrados en sus repositorios, verifique si los datos realmente pertenecen a su organización o a otra víctima.
Este ataque está directamente vinculado al compromiso s1ngularity/Nx de agosto de 2025, donde el robo inicial de tokens de GitHub permitió el ataque más amplio a la cadena de suministro. Muchas víctimas iniciales de Shai-Hulud eran víctimas conocidas del ataque s1ngularity. Los investigadores de seguridad también notan la integración de contenido generado por IA dentro de la campaña, con una confianza moderada de que se utilizó un LLM para generar el script bash malicioso.
Campaña Original de Shai-Hulud:
rxnt-authentication ("Paciente Cero")Campaña Shai-Hulud 2.0:
PyYAML (pip install pyyaml)js-yaml (npm install js-yaml)# Hacer ejecutable
chmod +x shai_hulud_scanner.py
# Escanear un solo package.json
python3 shai_hulud_scanner.py ./package.json
# Escanear package-lock.json para versiones exactas
python3 shai_hulud_scanner.py ./package-lock.json
# Escanear todo el directorio del proyecto
python3 shai_hulud_scanner.py ./my-project
# Escanear el directorio actual
python3 shai_hulud_scanner.py .
# Instalar dependencias primero
npm install
# Hacer ejecutable
chmod +x shai_hulud_scanner.js
# Escanear un solo package.json
node shai_hulud_scanner.js ./package.json
# Escanear package-lock.json para versiones exactas
node shai_hulud_scanner.js ./package-lock.json
# Escanear todo el directorio del proyecto
node shai_hulud_scanner.js ./my-project
# Escanear el directorio actual
node shai_hulud_scanner.js .
✅ Detección de Coincidencia Exacta: Identifica paquetes con coincidencias exactas de versión con versiones comprometidas conocidas
⚠️ Detección de Riesgo Potencial: Marca paquetes con el mismo nombre pero diferentes versiones (pueden seguir en riesgo)
🔍 Soporte de Doble Archivo: Escanea tanto package.json (dependencias declaradas) como package-lock.json (versiones instaladas exactas)
📦 Cobertura Integral: El escaneo de package-lock.json incluye dependencias anidadas y paquetes transitivos
🔄 Escaneo Recursivo: Escanea automáticamente todos los subdirectorios omitiendo node_modules
📋 Informes Detallados: Muestra nombres de paquetes, versiones, secciones de dependencia y versiones afectadas
🔎 Detección de IoC: Identifica Indicadores de Compromiso tanto para Shai-Hulud original como para Shai-Hulud 2.0:
"postinstall": "node bundle.js", archivos bundle.js, shai-hulud-workflow.yml"preinstall", archivos setup_bun.js, bun_environment.js, workflows discussion.yaml, formatter_*.ymlwebhook.site, patrones de runner SHA1HULUD, escalada de privilegios en Docker🚨 Crítico (Paquetes Comprometidos Encontrados):
🚨 CRÍTICO: Se encontraron 2 paquetes CONFIRMADOS como comprometidos:
• @ctrl/deluge v7.2.2 en dependencias
Versiones afectadas: 7.2.2, 7.2.1
• ngx-bootstrap v19.0.3 en devDependencies
Versiones afectadas: 18.1.4, 19.0.3, 20.0.4, 20.0.5, 20.0.6, 19.0.4, 20.0.3
⚠️ Advertencia (Desajuste de Versión):
⚠️ ADVERTENCIA: Se encontró 1 paquete con versiones diferentes:
• @ctrl/deluge v7.2.0 en dependencias
Versiones afectadas conocidas: 7.2.2, 7.2.1
✅ Limpio:
✅ No se encontraron paquetes afectados
npm uninstall <nombre-paquete>npm cache clean --forcerm -rf node_modules"postinstall": "node bundle.js" en archivos package.jsonbundle.js (de 3MB+ de tamaño, contienen el payload malicioso).github/workflows/shai-hulud-workflow.yml"preinstall" en archivos package.jsonsetup_bun.js y bun_environment.jscloud.json, contents.json, environment.json, truffleSecrets.jsonLos datos de los paquetes están centralizados en affected_packages.yaml. Para añadir nuevos paquetes comprometidos:
affected_packages.yaml- name: "nombre-paquete"
versions: ["1.0.0", "1.0.1"]
Este enfoque centralizado elimina la necesidad de actualizar múltiples archivos cuando se descubren nuevas amenazas.
# Crear script de escaneo central
curl -O https://su-dominio.com/shai_hulud_scanner.py
chmod +x shai_hulud_scanner.py
# Escaneo masivo de múltiples proyectos
for dir in /projects/*/; do
echo "Escaneando $dir"
python3 shai_hulud_scanner.py "$dir"
done
# Ejemplo de GitHub Actions
- name: Escanear paquetes Shai-Hulud
run: |
curl -O https://su-dominio.com/shai_hulud_scanner.js
npm install js-yaml
node shai_hulud_scanner.js .
if [ $? -ne 0 ]; then
echo "ALERTA DE SEGURIDAD: ¡Paquetes comprometidos detectados!"
exit 1
fi
# Añadir al kit de herramientas de seguridad
cp shai_hulud_scanner.py /usr/local/bin/
cp shai_hulud_scanner.js /usr/local/bin/
cp affected_packages.yaml /usr/local/bin/
# Crear alias para acceso fácil
echo 'alias scan-shai="python3 /usr/local/bin/shai_hulud_scanner.py"' >> ~/.bashrc
postinstall, Shai-Hulud 2.0 usa preinstall (aumenta la exposición en entornos de construcción)Shai-Hulud Original (septiembre de 2025):
"postinstall": "node bundle.js" en package.jsonbundle.js (típicamente JavaScript minificado de 3MB+)webhook.site.github/workflows/shai-hulud-workflow.yml para persistenciashai-hulud que contienen commits maliciososShai-Hulud 2.0 (noviembre de 2025):
"preinstall": "node setup_bun.js" o "preinstall": "node bun_environment.js" en package.jsonsetup_bun.js, bun_environment.js (además de bundle.js)cloud.json, contents.json, environment.json, truffleSecrets.json.github/workflows/discussion.yaml (con runs-on: self-hosted y RUNNER_TRACKING_ID: 0).github/workflows/formatter_*.yml (coincidencia de patrones, utilizado para exfiltración de secretos)Común a Ambas Variantes:
webhook.sitepreinstall (fase de ejecución de Shai-Hulud 2.0)setup_bun.js y bun_environment.jscloud.json, contents.json, environment.json, truffleSecrets.jsondiscussion.yaml y formatter_*.ymlprevention/block-shai-hulud.shPara problemas o preguntas:
.github/workflows/discussion.yaml (con runner autoalojado).github/workflows/formatter_*.ymldocker run --rm --privileged -v /:/host)webhook.site en el código o registros de reddocker run --rm --privileged -v /:/hostwebhook.site (igual que el original)