2026-08-09 18:51:59 +02:00

Detección de Shai-Hulud

He creado un script en Python para la detección en tus repositorios de código. Además te incluyo el protocolo de respuesta ante una infección confirmada.

1. Explicación del Script de Python (shai_hulud_detector.py)

El script está diseñado para realizar una auditoría estática y dinámica en tres niveles sobre cualquier proyecto o repositorio Node.js dentro del directorio de trabajo actual: Nivel 1: Detección de Droppers Físicos (Análisis Estático)

¿Qué busca?: Archivos con nombres clave que utiliza el malware (setup.mjs, math_init.js, Math_Symbol.js).
¿Cómo lo hace?: Escanea recursivamente el árbol de archivos. Si encuentra un paquete susceptible en node_modules (como flat-cache o file-entry-cache), comprueba si dentro de su carpeta existen dichos archivos dropper. Si la dependencia está presente pero no contiene los droppers, la marca como LIMPIA [OK].

Nivel 2: Inspección de Configuración (package.json)

Hooks de ciclo de vida (preinstall): Analiza si el campo "scripts" de algún package.json intenta ejecutar comandos sospechosos (por ejemplo, "preinstall": "node setup.mjs").
Versiones infectadas conocidas: Contrasta las versiones declaradas e instaladas con la lista negra de publicaciones maliciosas confirmadas (keyv@6.0.0, cacheable@2.5.1, cache-manager@7.2.10, etc.).

Nivel 3: Auditoría del Árbol de Dependencias (Análisis Dinámico)

Equivalente a npm list: Identifica las raíces de los proyectos Node.js (donde hay un package-lock.json o node_modules) y ejecuta automáticamente una inspección del árbol de dependencias resueltas para las familias de riesgo (keyv, cacheable, flat-cache, file-entry-cache, etc.).
Esto permite visibilizar la cadena de dependencias transitivas (por ejemplo, ver si llegan a través de eslint).

2. Procedimiento de Actuación en Caso de Infección Confirmada

Si el script o tus revisiones confirman la presencia de un dropper o de una versión infectada, se debe asumir que el entorno ha sido comprometido y aplicar inmediatamente el siguiente protocolo: Paso 1: Aislamiento del Entorno

Detener procesos activos: Cancela inmediatamente cualquier servidor, pipeline de CI/CD o proceso de construcción (npm run build, npm start) que se esté ejecutando en ese equipo.
Desconectar de la red: Si es una máquina o servidor en producción, aíslala temporalmente de la red para evitar que la carga útil descargue el entorno Bun o intente exfiltrar credenciales.

Paso 2: Revocación Inmediata de Credenciales (Crítico)

Como el objetivo principal de Shai-Hulud es el robo y reutilización de credenciales:

Revocar Tokens de NPM: Entra en tu cuenta de npmjs.com y revoca todos los Access Tokens activos inmediatamente.
Revocar Tokens de GitHub / CI/CD: Revoca cualquier Personal Access Token (PAT), clave SSH o credenciales de integración de CI/CD (GitHub Actions, Gitea, etc.) que estuvieran almacenadas en la máquina infectada (~/.npmrc, ~/.ssh, variables de entorno).

Paso 3: Limpieza y Eliminación

Limpiar la caché global de npm:

npm cache clean --force

Borrar directorios y bloqueos contaminados: Elimina las carpetas node_modules y el archivo package-lock.json del proyecto afectado:

rm -rf node_modules package-lock.json

Paso 4: Reinstalación Segura

Fijar versiones seguras: Asegúrate en tu package.json de que las dependencias estén apuntando a versiones anteriores estables o a las versiones parcheadas que hayan publicado los mantenedores oficiales.

Desactivar scripts automáticos: Fuerza la instalación sin ejecutar los hooks de ciclo de vida para evitar que cualquier dependencia infectada vuelva a dispararse:

npm install --ignore-scripts

Paso 5: Auditar Publicaciones (Si eres mantenedor)

Si tenías permisos de publicación en algún paquete de npm en esa máquina:

Revisa tu perfil en el registro de npm para comprobar si el gusano publicó versiones no autorizadas (versiones parche como x.x.+1) a tu nombre el 4 de agosto o en fechas posteriores.
Despublica (unpublish) o marca como deprecadas (deprecate) de inmediato las versiones maliciosas generadas en tus paquetes.

Script de Detección

Puedes usar el fichero shai_hulud_detector.py se trata de la segunda versión en la que he ampliado la revision del análisis.

Simplemente dale permisos de ejecución:

chmod +x shai_hulud_detector.py`

Para detectarlo simplemente invocalo desde la ruta en que desees se analicen todos los directorios y subdirectorios:

cd ~/mi-repositorio-de-codigo
/ruta-detector/shai_hulud_detector.py

Ejemplo de salida:

$ shai_hulud_detector.py

...

[+] Ejecutando auditoría del árbol de dependencias en: /home/soloconlinux/repo/drawdb/node_modules/url
--- Árbol de dependencias resuelto ---
url@0.11.1 /home/soloconlinux/repo/drawdb/node_modules/url
└── (empty)
--------------------------------------

[+] Ejecutando auditoría del árbol de dependencias en: /home/soloconlinux/repo/drawdb/node_modules/tailwindcss
--- Árbol de dependencias resuelto ---
tailwindcss@3.3.6 /home/soloconlinux/repo/drawdb/node_modules/tailwindcss
└── (empty)
--------------------------------------

============================================================
[OK] Escaneo finalizado: No se detectaron archivos dropper ni versiones maliciosas.
============================================================

Description
Script para la detección de compromiso por Shai-Hulud en paquetes NPM
Readme 31 KiB
Languages
Python 100%