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:

  1. Auditar si tu entorno fue afectado por estas versiones.
  2. Contener la infección y evitar la exfiltración de datos.
  3. 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
El vector de ataque principal es la ejecución automática de scripts durante 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-scripts desactivado (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 superiorRequerido 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**CualquieraPara descargar herramientas de auditoría.
**Python 3**3.8+Para scripts de rotación de credenciales (opcional).
**AWS CLI / Azure CLI**Última versiónPara rotar credenciales de cloud.
**Volatility**2.4+ (Linux/macOS)Herramienta forense para análisis de memoria (opcional, avanzado).
### Accesos requeridos
  • 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 -u
Resultado esperado:
8.14.0
8.16.0
8.17.0
8.18.0
8.20.0

Si 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 --all
Señales de infección:
  • Procesos con nombres aleatorios (ej: .x1a2b3c).
  • Conexiones a IPs desconocidas (ver Paso 4).
  • Tareas de cron o systemd que 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 UpdateHelper o WindowsUpdateX.
  • Archivos .exe en %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.43
Ips/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:
  1. Desconecta la máquina de la red.
  2. Captura memoria (opcional, con LiME o AVML para 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>.service

Windows

# 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.plist

Paso 6: Rotar credenciales críticas

Prioriza estas rotaciones (el orden importa):
**Servicio****Comando****Notas**
**AWS**BLOCK38Usa BLOCK39 para actualizar.
**Azure**BLOCK40 (usando creds nuevas)Revoca credenciales antiguas con Azure CLI.
**GitHub**BLOCK41Revoca tokens en Settings > Developer Settings.
**Docker Hub**BLOCK42 y regenerar tokens en hub.docker.com
**API keys de IA**Revisa BLOCK43, BLOCK44Borra claves en plataformas como Anthropic.
Ejemplo práctico para AWS:
# 1. Crear nueva clave
NEW_KEY=$(aws iam create-access-key --output text)

# 2. Actualizar AWS CLI
aws configure set aws_access_key_id $(echo $NEW_KEY | awk '{print $2}')
aws configure set aws_secret_access_key $(echo $NEW_KEY | awk '{print $4}')

# 3. Revocar clave antigua
aws iam delete-access-key --access-key-id <ID_ANTIGUA>

Paso 7: Actualizar a una versión limpia

# 1. Instalar [email protected] (la última versión limpia)
npm install [email protected] --save-dev

# 2. Verificar que no haya scripts maliciosos
npm view [email protected] scripts
Resultado esperado:
{}

Si ves { preinstall: 'setup.js' }, no instales la versión.

En entornos de CI/CD:

Asegúrate de que tu pipeline use npm ≥12 o ejecute:

# Ejemplo para GitHub Actions
- name: Install dependencies
  run: npm install --ignore-scripts

Paso 8: Hardenizar tu entorno (opcional pero recomendado)

Para desarrolladores

  1. Usa npm ≥12 (desactiva preinstall hooks por defecto):
   npm install -g npm@12
   
  1. Instala npm-force-resolutions para evitar versiones comprometidas:
   npm install --save-dev npm-force-resolutions
   

Luego añade al package.json:

   "resolutions": {
     "jscrambler": "8.22.0"
   }
   

Para equipos de DevOps/SRE

  1. Bloquea versiones sospechosas en tu registry:
   # Ejemplo con Verdaccio
   npm install -g verdaccio
   echo '{"jscrambler": "8.22.0"}' > /path/to/verdaccio/storage/blocked.json
   
  1. Monitorea con eBPF:
   # Instalar Falco para detección de eBPF malicioso
   sudo falco -rules https://falco.org/rules/falco_rules.yaml
   

Consideraciones y buenas prácticas

Limitaciones conocidas

  1. El malware ya ejecutó: Si el infostealer se ejecutó, la exfiltración de datos ya ocurrió. Rotar credenciales es obligatorio, incluso si eliminas los artefactos.
  2. npm no revocó las versiones: Las versiones 8.14.0-8.20.0 siguen disponibles en el registry. Depender de ^8.14.0 en tu package.json es peligroso.
  3. Detección evasiva: El malware usa:
eBPF para ocultar procesos en Linux.

TLS + Tor para comunicaciones.

Nombres aleatorios para binarios y tareas.

Alternativas si no puedes actualizar

Si tu proyecto depende de una versión afectada y no puedes migrar:

  1. Usa npm install --ignore-scripts para evitar la ejecución del preinstall hook.
  2. Ejecuta jscrambler en un contenedor aislado (ej: Docker con --read-only y --tmpfs):
   FROM node:18
   RUN npm install [email protected] --global
   CMD ["jscrambler", "--help"]
   
  1. Aísla el entorno de CI/CD:
– Usa GitHub Actions con permisos mínimos.

– Ejecuta pipelines en contenedores efímeros (ej: ubuntu-latest con docker:dind).

Controles preventivos para equipos

**Control****Implementación****Herramienta**
**Análisis de dependencias**Escanea BLOCK55 con BLOCK56 o BLOCK57 en cada PR.GitHub Dependabot, Snyk
**CI/CD seguro**Ejecuta BLOCK58 y escanea binarios con BLOCK59.GitHub Actions, Trivy
**eBPF en producción**Monitorea llamadas a BLOCK60 con Falco o Tracee.Falco, Tracee
**Rotación automática**Usa herramientas como BLOCK61 o BLOCK62.HashiCorp Vault, AWS Secrets
**SBOMs (Software Bill of Materials)**Genera SBOMs con BLOCK63 o BLOCK64 para detectar binarios sospechosos.Syft, Trivy
## Conclusión

El incidente de jscrambler 8.14.0-8.20.0 demuestra cómo un supply chain attack puede comprometer no solo tu código, sino también tu infraestructura completa (cloud, CI/CD, herramientas de IA). Los pasos clave para mitigar el riesgo son:

  1. Auditar tu entorno con los comandos proporcionados.
  2. Contener la infección eliminando artefactos y rotando credenciales.
  3. Prevenir futuros incidentes con controles técnicos (npm ≥12, SBOMs, aislamiento de CI/CD).
Si tu proyecto usa jscrambler, actualiza a 8.22.0 y aplica los hardening recomendados. Si no puedes actualizar, aisla el entorno y monitorea con eBPF. La seguridad de tu cadena de suministro no es opcional: es una responsabilidad operativa.

Fuentes

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *