122 lines
5.4 KiB
Markdown
122 lines
5.4 KiB
Markdown
# 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.
|
|
============================================================
|
|
|
|
```
|
|
|
|
|