Introducción
El 11 de julio de 2026, se publicó en npm la versión [email protected] con un preinstall hook malicioso que descarga e instala un infostealer multiplataforma (Windows, macOS, Linux) escrito en Rust. Este malware no solo roba credenciales de desarrolladores y secrets de herramientas de IA, sino que también inyecta código en el kernel de Linux mediante eBPF y establece persistencia en sistemas Windows y macOS. Las versiones 8.16.0, 8.17.0, 8.18.0 y 8.20.0 también están comprometidas, con cambios en su vector de entrega (de preinstall hook a ejecución durante la importación del paquete). Ninguna de estas versiones ha sido revocada de npm, por lo que siguen instalables si tu proyecto las especifica en el package.json.
Este artículo te guía para:
- Auditar si tu entorno fue afectado por estas versiones.
- Contener la infección y evitar la exfiltración de datos.
- Prevenir futuros incidentes con controles técnicos y procesos de CI/CD seguros.
Qué es y para qué sirve el ataque
El infostealer incluido en jscrambler 8.14.0-8.20.0 es un malware multi-etapa con las siguientes capacidades:
| **Capa** | **Acciones** | **Plataforma** |
|---|---|---|
| **Dropper** | Descarga un archivo binario aleatorio en BLOCK19 (Linux/macOS) o BLOCK20 (Windows). | Todas |
| **Infostealer** | Roba: credenciales de AWS/Azure/GCP, wallets de cripto, contraseñas de navegadores, API keys de herramientas de IA (Claude, Cursor, VS Code), tokens de CI/CD. | Todas |
| **eBPF (Linux)** | Inyecta un programa eBPF en el kernel para ocultar procesos y evadir detección. | Linux |
| **Persistencia** | Crea tareas programadas en Windows ( BLOCK21 ) o *LaunchAgents* en macOS. | Windows, macOS |
| **C2 Encrypted** | Comunica con servidores C2 mediante TLS y rutas de Tor. | Todas |
npm install (en versiones 8.14.0-8.17.0) o durante la importación del paquete (8.18.0-8.20.0). Esto afecta especialmente a:- Entornos de desarrollo local con permisos elevados.
- Agentes de CI/CD (GitHub Actions, Azure Pipelines, GitLab CI) que instalan dependencias con
--ignore-scriptsdesactivado (o usan npm <12). - Máquinas con npm <12, ya que npm 12+ desactiva los preinstall hooks por defecto.
Prerequisitos
Software y permisos necesarios
| **Componente** | **Versión mínima** | **Notas** |
|---|---|---|
| **npm** | 6.x (para detección) | En npm ≥12, los *preinstall hooks* no se ejecutan automáticamente. |
| **Node.js** | 14.x o superior | Requerido para ejecutar comandos de auditoría. |
| **jq** | 1.6+ | Para parsear archivos BLOCK24 . |
| **sha256sum** | Coreutils (Linux/macOS) | Verificación de hashes de archivos sospechosos. |
| **curl/wget** | Cualquiera | Para descargar herramientas de auditoría. |
| **Python 3** | 3.8+ | Para scripts de rotación de credenciales (opcional). |
| **AWS CLI / Azure CLI** | Última versión | Para rotar credenciales de cloud. |
| **Volatility** | 2.4+ (Linux/macOS) | Herramienta forense para análisis de memoria (opcional, avanzado). |
- Administrador/root en la máquina afectada (para eliminar archivos y procesos).
- Credenciales de administrador en servicios de cloud (AWS, Azure) para rotación.
- Acceso a logs de CI/CD si sospechas que la infección provino de un pipeline.
Notas críticas
- No confíes en herramientas locales: El malware puede haber modificado herramientas de seguridad (ej:
ps,netstat,ls). - Prioriza contención sobre limpieza: Si el malware ya ejecutó, rotar credenciales es crítico antes de analizar.
Guía paso a paso
Paso 1: Identificar si estás usando una versión afectada
Ejecuta estos comandos en el directorio de tu proyecto:
# Buscar [email protected] en package-lock.json
grep '"jscrambler@8\.' package-lock.json | awk -F'"' '{print $4}' | sort -uResultado esperado:8.14.0
8.16.0
8.17.0
8.18.0
8.20.0Si ves alguna de estas versiones, tu proyecto está en riesgo.
En entornos de CI/CD:# Buscar en lockfiles de pipelines (ej: GitHub Actions)
find .github/workflows -name "*.yml" -exec grep -l "jscrambler" {} \;Paso 2: Auditar procesos sospechosos en Linux
Ejecuta estos comandos como root para detectar el binario malicioso y su persistencia:
# 1. Buscar procesos ocultos con eBPF
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_execve { printf("%s -> %s\n", comm, str(args->filename)); }' &
# 2. Listar tareas ocultas en /tmp
sudo find /tmp -type f -name ".*" -o -name ".*.exe" | grep -vP "^\.\.git"
# 3. Verificar tareas programadas (persistence)
sudo crontab -l
sudo systemctl list-timers --allSeñales de infección:- Procesos con nombres aleatorios (ej:
.x1a2b3c). - Conexiones a IPs desconocidas (ver Paso 4).
- Tareas de
cronosystemdque ejecuten scripts en/tmp.
Paso 3: Auditar en Windows
Ejecuta estos comandos en PowerShell (Administrador):
# 1. Buscar tareas programadas ocultas
Get-ScheduledTask | Where-Object { $_.TaskName -like "*jscrambler*" -or $_.TaskName -like "*update*" } | Format-List
# 2. Listar archivos sospechosos en %TEMP%
Get-ChildItem -Path $env:TEMP -Recurse -File | Where-Object { $_.Name -match "^\..*" -or $_.Name -like "*.exe" } | Select-Object FullName
# 3. Verificar servicios ocultos
Get-WmiObject Win32_Service | Where-Object { $_.PathName -like "*tmp*" -or $_.PathName -like "*jscrambler*" }Señales de infección:- Tareas con nombres como
UpdateHelperoWindowsUpdateX. - Archivos
.exeen%TEMP%con timestamps recientes.
Paso 4: Verificar conexiones de red sospechosas
El malware se comunica con IPs y dominios de Tor. Usa estas herramientas:
# Linux/macOS (requiere netstat o ss)
sudo ss -tulnp | grep -E "443|80|9050|9051" # Puertos típicos de Tor
# Windows (PowerShell)
Get-NetTCPConnection -State Established | Where-Object { $_.RemoteAddress -notin @("127.0.0.1","::1") } | Select-Object LocalAddress, RemoteAddress, State, OwningProcess
# Usar curl para verificar IPs reportadas (ej: 185.143.223.43)
curl -I http://185.143.223.43Ips/C2 conocidas (según análisis de StepSecurity):185.143.223.43
89.248.165.78
*.onion (rango Tor)Si detectas tráfico a estas IPs:- Desconecta la máquina de la red.
- Captura memoria (opcional, con
LiMEoAVMLpara Volatility).
Paso 5: Eliminar artefactos maliciosos
Linux/macOS
# 1. Matar procesos sospechosos (ej: nombre aleatorio)
sudo pkill -f "\.[a-z0-9]{6}"
# 2. Eliminar binarios en /tmp
sudo find /tmp -type f -name ".*" -exec rm -f {} \;
# 3. Eliminar tareas de persistence
sudo crontab -r # Borra crontab del usuario
sudo systemctl stop <servicio-sospechoso>.serviceWindows
# 1. Eliminar tareas programadas
Get-ScheduledTask | Where-Object { $_.TaskName -like "*jscrambler*" } | Unregister-ScheduledTask -Confirm:$false
# 2. Eliminar archivos en %TEMP%
Remove-Item -Path "$env:TEMP\.*" -Recurse -Force -ErrorAction SilentlyContinue
# 3. Limpiar LaunchAgents (macOS)
launchctl unload ~/Library/LaunchAgents/com.jscrambler.update.plist
rm ~/Library/LaunchAgents/com.jscrambler.update.plistPaso 6: Rotar credenciales críticas
Prioriza estas rotaciones (el orden importa):| **Servicio** | **Comando** | **Notas** |
|---|---|---|
| **AWS** |
