Versión 2.0.0 - Detección Shai-Hulud 2.0 y Sistema de Prevención Mejorado
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 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.
🚨 Acerca de los Ataques 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.
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):
Instalación: El paquete malicioso ejecuta el script postinstall que ejecuta bundle.js (payload JavaScript de 3MB+)
Recolección de Credenciales: Utiliza TruffleHog para escanear tokens de GitHub/npm, credenciales de AWS/GCP/Azure, variables de entorno y claves de nube expuestas por IMDS
Exfiltración de Datos: Crea un repositorio público "Shai-Hulud" en la cuenta de GitHub de la víctima con secretos robados en data.json (codificado en base64 doble)
Persistencia: Inyecta un workflow malicioso de GitHub Actions (.github/workflows/shai-hulud-workflow.yml) que exfiltra secretos del repositorio a webhook[.]site
Migración de Repositorios: Fuerza que los repositorios organizacionales privados se conviertan en repositorios personales públicos con el sufijo "-migration" y la descripción "Shai-Hulud Migration"
Propagación del Gusano: Utiliza tokens npm robados para inyectar malware en otros paquetes mantenidos por la víctima, incrementando números de versión y añadiendo hooks postinstall
Cadena de Ataque (Shai-Hulud 2.0 - noviembre de 2025):
Instalación: El paquete malicioso ejecuta el script preinstall que ejecuta setup_bun.js o bun_environment.js (nuevos archivos de payload)
Creación de Archivos de Datos: Crea archivos cloud.json, contents.json, environment.json y truffleSecrets.json
Recolección de Credenciales: Orientación multi-nube (AWS, Azure, GCP) utilizando SDKs oficiales, extrayendo credenciales de archivos de configuración, variables de entorno e IMDS
Registro de Runner Autoalojado: Registra la máquina infectada como runner autoalojado llamado 'SHA1HULUD'
Inyección de Workflow de GitHub:
Crea .github/workflows/discussion.yaml con runner autoalojado para acceso de puerta trasera
Crea .github/workflows/formatter_*.yml para exfiltración de secretos (luego elimina el workflow para ocultar la actividad)
Escalada de Privilegios en Docker: Intenta obtener acceso root mediante docker run --rm --privileged -v /:/host
Volcado de Secretos en la Nube: Utiliza sesiones autenticadas para volcar secretos de AWS Secrets Manager, Google Secret Manager y Azure Key Vault
Creación de Repositorios: Crea repositorios con "Shai-Hulud" en la descripción para la exfiltración
🎯 Qué se Roba
Credenciales de Desarrollo: PAT de GitHub (ghp_*, gho_*), tokens de autenticación npm
Credenciales de Nube: Claves de acceso y tokens de AWS, GCP, Azure
Claves API: Atlassian, Datadog y otras credenciales de servicios
Información del Sistema: Variables de entorno, detalles del host, cuentas de usuario
Código Fuente: Repositorios privados hechos públicos o clonados
📊 Escala del Impacto
Shai-Hulud Original (septiembre de 2025):
200+ paquetes comprometidos en esta base de datos de seguimiento (incluyendo paquetes populares como @ctrl/tinycolor, ngx-bootstrap)
Múltiples cuentas de GitHub comprometidas (el número exacto varía según la fuente de reporte)
Repositorios públicos creados con la etiqueta "Shai-Hulud Migration"
Desarrolladores potencialmente afectados a través de dependencias de paquetes
Shai-Hulud 2.0 (noviembre de 2025):
738+ paquetes comprometidos con 1,291 combinaciones únicas paquete@versión
25,000+ repositorios afectados creados en ~350 usuarios únicos
1,000+ repositorios nuevos añadidos cada 30 minutos durante las horas iniciales de la campaña
Afecta a paquetes de ecosistemas importantes: Zapier, ENS Domains, PostHog, Postman, AsyncAPI y más
Robo de credenciales multi-nube (AWS, Azure, GCP)
Intentos de escalada de privilegios en Docker
Robo de Credenciales Verificado (de ~20,000 repositorios analizados):
775 tokens de acceso de GitHub comprometidos
373 credenciales de AWS expuestas
300 credenciales de GCP expuestas
115 credenciales de Azure expuestas
⚠️ Advertencia de Exfiltración Cruzada entre Víctimas
CRÍTICO: Wiz Research ha confirmado que se está produciendo exfiltración cruzada entre víctimas. Esto significa:
Los secretos robados de una víctima pueden publicarse en repositorios propiedad de una víctima diferente y no relacionada
Si encuentra datos sospechosos en sus repositorios de GitHub, pueden pertenecer a otro usuario comprometido
Sus datos pueden haber sido exfiltrados a repositorios que usted no posee
Esto complica la atribución y la respuesta a incidentes
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.
🔗 Conexión con Ataques Anteriores
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.
📅 Cronología del Ataque
Campaña Original de Shai-Hulud:
26 de agosto de 2025: Ocurre el compromiso s1ngularity/Nx (ataque precursor)
14 de septiembre de 2025 a las 17:58 UTC: Se publica el primer paquete malicioso rxnt-authentication ("Paciente Cero")
15 de septiembre de 2025: Investigadores de seguridad detectan y reportan el ataque
15 y 16 de septiembre de 2025: El gusano se propaga rápidamente por el ecosistema npm
16 de septiembre de 2025: Se confirman más de 180 paquetes comprometidos
17 de septiembre de 2025: Esfuerzos continuos de monitoreo y limpieza
18 de septiembre de 2025: Lanzamiento v1.2.0 con 200 paquetes rastreados y herramientas de prevención mejoradas
Campaña Shai-Hulud 2.0:
21-23 de noviembre de 2025: Paquetes maliciosos subidos al registro npm
24 de noviembre de 2025: Wiz Research y Aikido detectan y reportan el ataque
24 de noviembre de 2025: Lanzamiento v2.0.0 con 738+ paquetes rastreados y capacidades de detección de Shai-Hulud 2.0
En curso: GitHub continúa eliminando repositorios creados por el atacante; el atacante continúa creando nuevos repositorios
# 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 .
Escáner Node.js
root@kitploit:~
# 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 .
Qué Hace el Escáner
✅ 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:
Tanto los escáneres Python como JavaScript utilizarán automáticamente los datos actualizados
Este enfoque centralizado elimina la necesidad de actualizar múltiples archivos cuando se descubren nuevas amenazas.
Opciones de Implementación
Para Equipos de Seguridad
root@kitploit:~
# 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
Integración CI/CD
root@kitploit:~
# 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
Implementación Empresarial
root@kitploit:~
# 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
Notas Técnicas
Plataformas Objetivo: Linux, macOS y Windows (Shai-Hulud 2.0 añade soporte para Windows)
Tamaño del Payload: Paquete JavaScript minificado de 3MB+ (original), nuevos payloads en Shai-Hulud 2.0
Autopropagación: Primer gusano autorreplicante exitoso en el ecosistema npm
Fases de Ejecución: Original usa postinstall, Shai-Hulud 2.0 usa preinstall (aumenta la exposición en entornos de construcción)
Seguro: Operaciones de solo lectura, no modifica sus archivos
Rápido: Optimizado para escaneo rápido de bases de código grandes
Preciso: Basado en listas oficiales de IoC de investigadores de seguridad (Wiz Research, Aikido)
Componentes Generados por IA: Los investigadores de seguridad evalúan con confianza moderada que se utilizó un LLM para generar partes del script bash malicioso
Mecanismos de Persistencia:
Original: Workflows de GitHub Actions, ramas maliciosas y migraciones de repositorios
Shai-Hulud 2.0: Runners autoalojados, workflows basados en discusión, workflows de formateo
Integración en la Nube:
Original: Apunta a entornos AWS y GCP utilizando bibliotecas SDK y puntos finales IMDS
Shai-Hulud 2.0: Orientación multi-nube (AWS, Azure, GCP) con SDKs oficiales, volcado de gestores de secretos
Indicadores de Compromiso (IoC)
Shai-Hulud Original (septiembre de 2025):
Hook postinstall malicioso: "postinstall": "node bundle.js" en package.json
Archivo de payload: bundle.js (típicamente JavaScript minificado de 3MB+)
Punto final de exfiltración: Referencias a dominios webhook.site
Workflow de GitHub: .github/workflows/shai-hulud-workflow.yml para persistencia
Nomenclatura de repositorios: Repos con "Shai-Hulud" o sufijos "-migration"
Indicadores de rama: Ramas llamadas shai-hulud que contienen commits maliciosos
Shai-Hulud 2.0 (noviembre de 2025):
Hook preinstall malicioso: "preinstall": "node setup_bun.js" o "preinstall": "node bun_environment.js" en package.json
Nuevos archivos de payload: setup_bun.js, bun_environment.js (además de bundle.js)
Archivos de datos: cloud.json, contents.json, environment.json, truffleSecrets.json
Workflows de GitHub:
.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)
Runner autoalojado: Runner llamado 'SHA1HULUD' registrado en máquinas infectadas
Escalada de privilegios en Docker: Comandos como docker run --rm --privileged -v /:/host
Descripciones de repositorios: Repos con "Shai-Hulud" en la descripción
Orientación multi-nube: Intentos de acceso a AWS Secrets Manager, Google Secret Manager, Azure Key Vault
Punto final de exfiltración: Referencias a dominios webhook.site (igual que el original)
Común a Ambas Variantes:
Punto final de exfiltración: Referencias a dominios webhook.site
Nomenclatura de repositorios: Repos con "Shai-Hulud" en el nombre o descripción