Diferencia entre revisiones de «Node-ipc npm Supply Chain Attack Campaign»
(Descripcion: Node-ipc npm Supply Chain Attack Campaign) |
Sin resumen de edición |
||
| Línea 444: | Línea 444: | ||
== Etiquetas / Categorías == | == Etiquetas / Categorías == | ||
<code>node-ipc</code> <code>npm</code> <code>supply-chain-attack</code> <code>infostealer</code> <code>credential-theft</code> <code>dns-tunneling</code> <code>c2</code> <code>azure-typosquatting</code> <code>iihe</code> <code>commonjs</code> <code>javascript-obfuscator</code> <code>atiertant</code> <code>riaevangelist</code> <code>peacenotwar</code> <code>stepsecurity</code> <code>socket</code> <code>snyk</code> <code>bf9d8c0c3ed3ceaa831a13de27f1b1c7c7b7f01d2db4103bfdba4191940b0301</code> <code>sh.azurestaticprovider.net</code> <code>37.16.75.69</code> <code>bt.node.js</code> <code>qZ8pL3vNxR9wKmTyHbVcFgDsJaEoUi</code> <code>__ntw</code> <code>npm-supply-chain</code> <code>ci-cd</code> <code>cloud-credentials</code> <code>ssh-keys</code> <code>kubernetes-tokens</code> <code>terraform</code> <code>claude-ai</code> <code>kiro-ide</code> <code>ciberwiki</code> <code>dragora</code> <code>stepsecurity</code> <code>likhith</code> <code>nullcharb</code> <code>carlini</code> <code>jimmytsadiotis</code> <code>ashishkurmi</code> <code>cyb3rjerry</code> <code>danielweck</code> <code>roni-carta</code> | <code>node-ipc</code> <code>npm</code> <code>supply-chain-attack</code> <code>infostealer</code> <code>credential-theft</code> <code>dns-tunneling</code> <code>c2</code> <code>azure-typosquatting</code> <code>iihe</code> <code>commonjs</code> <code>javascript-obfuscator</code> <code>atiertant</code> <code>riaevangelist</code> <code>peacenotwar</code> <code>stepsecurity</code> <code>socket</code> <code>snyk</code> <code>bf9d8c0c3ed3ceaa831a13de27f1b1c7c7b7f01d2db4103bfdba4191940b0301</code> <code>sh.azurestaticprovider.net</code> <code>37.16.75.69</code> <code>bt.node.js</code> <code>qZ8pL3vNxR9wKmTyHbVcFgDsJaEoUi</code> <code>__ntw</code> <code>npm-supply-chain</code> <code>ci-cd</code> <code>cloud-credentials</code> <code>ssh-keys</code> <code>kubernetes-tokens</code> <code>terraform</code> <code>claude-ai</code> <code>kiro-ide</code> <code>ciberwiki</code> <code>dragora</code> <code>stepsecurity</code> <code>likhith</code> <code>nullcharb</code> <code>carlini</code> <code>jimmytsadiotis</code> <code>ashishkurmi</code> <code>cyb3rjerry</code> <code>danielweck</code> <code>roni-carta</code> | ||
[[Category:CAMPAÑAS|CAMPAÑAS]] | |||
Revisión actual - 00:28 15 may 2026
node-ipc npm Supply Chain Attack Campaign es un ataque a la cadena de suministro de software descubierto el 14 de mayo de 2026, en el que tres versiones maliciosas del popular paquete npm node-ipc (9.1.6, 9.2.3 y 12.0.1) fueron publicadas simultáneamente en el registro npm por una cuenta de mantenedor comprometida llamada atiertant (a.tiertant@atlantis-software.net). node-ipc es una biblioteca fundamental de comunicación entre procesos (IPC) para Node.js con más de 10 millones de descargas semanales, ampliamente utilizada en proyectos empresariales y entornos de desarrollo modernos. Las versiones comprometidas contienen una carga útil ofuscada idéntica de 80 KB (byte por byte en las tres versiones) inyectada como una Expresión de Función Invocada Inmediatamente (IIFE) al final del archivo node-ipc.cjs (el paquete CommonJS), después de la última línea legítima module.exports. A diferencia de ataques anteriores a la cadena de suministro que dependían de scripts preinstall, install o postinstall en package.json (fáciles de detectar), esta carga útil se ejecuta automáticamente en tiempo de ejecución cuando cualquier aplicación llama a require('node-ipc'), lo que la hace invisible para las herramientas de seguridad que solo escanean hooks de instalación. El malware realiza un reconocimiento exhaustivo del sistema, recopilando más de 90 categorías de credenciales incluyendo: credenciales de AWS, Azure, GCP, claves SSH, tokens de Kubernetes, configuraciones de GitHub CLI, ajustes de Claude AI y Kiro IDE, estado de Terraform, contraseñas de bases de datos (PostgreSQL, MySQL), historial de shell (bash, zsh, python, mysql), archivos de entorno (.env), credenciales de npm y mucho más. Los datos se empaquetan en un archivo TAR, se comprimen con GZIP y se exfiltran a través de dos canales independientes: (1) HTTPS POST al dominio de typosquatting sh.azurestaticprovider[.]net (diseñado para confundirse con infraestructura legítima de Azure), y (2) un sofisticado túnel DNS que sobrescribe el resolvedor del sistema con Google Public DNS (8.8.8.8/1.1.1.1) y luego redirige las consultas directamente al servidor C2 (37.16.75.69) en el puerto 53, evitando completamente los registros DNS corporativos y las herramientas SIEM tradicionales. La versión 12.0.1 incluye una puerta de selección de objetivo basada en SHA-256: calcula el hash del nombre del archivo principal del módulo y solo se activa si coincide con un valor codificado (ensamblado a partir de ocho fragmentos de tabla ofuscados), lo que sugiere un ataque dirigido a un proyecto o desarrollador específico. Las versiones 9.1.6 y 9.2.3 no tienen esta restricción y ejecutan la carga útil completa en cualquier sistema que las cargue. La publicación simultánea en tres versiones (dos líneas principales, 9.x y 12.x) fue una estrategia deliberada para maximizar el radio de explosión: los usuarios vinculados a ~9.1.x, ~9.2.x, ^9, ^12 o ~12.0 recibieron automáticamente el paquete comprometido en su próxima instalación o actualización del archivo de bloqueo. La cuenta atiertant no tenía historial previo de publicación en node-ipc; la última versión legítima (12.0.0) fue publicada por el autor original RIAEvangelist (Brandon Nozaki Miller) el 12 de agosto de 2024, creando un lapso de 21 meses (un patrón recurrente en ataques a paquetes inactivos de alta descarga). El dominio atlantis-software.net fue abandonado y reregistrado el 10 de marzo de 2026, lo que sugiere un email takeover para restablecer la contraseña de npm. Este ataque es independiente del incidente peacenotwar de 2022 (versiones 10.1.1/10.1.2), que fue un ataque destructivo con motivación geopolítica por parte del mantenedor original. El ataque de 2026 tiene una motivación puramente financiera (robo de credenciales) y es obra de un actor diferente.
Nombres Alternativos / Aliases
- node-ipc Supply Chain Attack 2026 (Por el paquete y año)
- atiertant npm Compromise (Por la cuenta comprometida)
- Azure Typosquatting DNS Exfiltration Campaign (Por la técnica C2)
- IIFE Infostealer Attack (Por el método de inyección)
- 21-Month Dormant Package Attack (Por el patrón de ataque)
Fecha de Detección / Actividad
- Última Versión Legítima: 12.0.0 (12 de agosto de 2024, por RIAEvangelist)
- Fecha de Publicación de Versiones Maliciosas: 14 de mayo de 2026 (tres versiones en una ventana de 55 segundos)
- Fecha de Detección: 14 de mayo de 2026 (detectado por StepSecurity AI Package Analyst)
- Período de Actividad: El ataque fue detectado el mismo día de la publicación
- Estado: Las versiones maliciosas han sido identificadas; se recomienda a los usuarios que las eliminen inmediatamente. npm aún no ha eliminado los paquetes del registro al momento del análisis.
Actor de Amenaza (Atribución)
- Nombre del Actor: No atribuido a un grupo específico; la cuenta comprometida es atiertant (
a.tiertant@atlantis-software.net) - Tipo de Actor: Atacante de cadena de suministro con motivación financiera (robo de credenciales).
- Mecanismo de Compromiso: Email takeover del dominio
atlantis-software.net(reregistrado el 10 de marzo de 2026 en Namecheap con registros MX de PrivateEmail), utilizado para restablecer la contraseña de npm de la cuenta atiertant. La cuenta no había publicado nada desde abril de 2022. - Sofisticación: Muy alta. El atacante demuestra capacidades excepcionales: (a) identificación de un paquete inactivo de alta descarga (21 meses sin actualizaciones), (b) compromiso de una cuenta de mantenedor mediante email takeover, (c) estrategia de publicación simultánea en tres versiones para maximizar el radio de explosión, (d) inyección de payload en CommonJS bundle (no en scripts de instalación) para evadir detección, (e) ofuscación avanzada con cuatro capas (array shuffling, control flow flattening, dead code injection, custom base-16 encoding con nibbles invertidos), (f) puerta de selección de objetivo basada en SHA-256 para ataques dirigidos, (g) exfiltración de doble canal (HTTPS + DNS tunneling), (h) bypass de DNS corporativo mediante override a 8.8.8.8 y redirección directa al C2, (i) demonización mediante
fork()condetached: trueyunref(), (j) recopilación de más de 90 categorías de credenciales, y (k) uso de typosquatting (azurestaticprovider.net) para confundir a los equipos de seguridad.
Resumen Ejecutivo
node-ipc npm Supply Chain Attack Campaign es un ataque a la cadena de suministro de software de alta sofisticación descubierto por StepSecurity AI Package Analyst el 14 de mayo de 2026. El atacante comprometió la cuenta de npm atiertant (mediante email takeover del dominio atlantis-software.net, abandonado y reregistrado el 10 de marzo de 2026) y publicó simultáneamente tres versiones maliciosas de node-ipc (9.1.6, 9.2.3, 12.0.1), un paquete fundamental con más de 10 millones de descargas semanales que no había recibido actualizaciones legítimas en 21 meses (última versión limpia: 12.0.0 el 12 de agosto de 2024). La estrategia de publicación en tres versiones fue deliberada: los rangos semver ~9.1.x, ~9.2.x, ^9, ^12 y ~12.0 afectaron a innumerables proyectos que no tenían versiones fijas. Las versiones 9.1.6 y 9.2.3 son particularmente insidiosas porque la línea 9.x nunca había tenido un bundle CommonJS; el atacante copió la estructura del paquete 12.x y creó paquetes sintéticos completamente falsificados. El malware está inyectado como una IIFE (Immediately Invoked Function Expression) de 80 KB al final del archivo node-ipc.cjs, después de la última línea legítima module.exports. No hay scripts preinstall, install o postinstall en package.json, una elección deliberada para evadir herramientas que solo escanean hooks de instalación. La carga útil se ejecuta automáticamente cuando cualquier aplicación llama a require('node-ipc') (o cuando un bundler resuelve el campo "main" a node-ipc.cjs). Una vez activada, la carga útil realiza un reconocimiento exhaustivo del sistema: ejecuta uname -a, serializa todas las variables de entorno, y recopila archivos que coinciden con más de 90 patrones de ruta (codificados en un bloque de 5.141 caracteres, decodificado a 2.570 bytes), incluyendo credenciales de proveedores de nube (AWS, Azure, GCP, OCI, DigitalOcean, Hetzner, Scaleway, Alibaba, IBM Cloud, Fly.io, Vercel, Railway, Snowflake, MinIO), claves SSH (~/.ssh/id_rsa, ~/.ssh/id_ed25519, ~/.ssh/id_ecdsa, ~/.ssh/authorized_keys, ~/.ssh/known_hosts), Git (~/.git-credentials, ~/.gitconfig, ~/.config/gh/hosts.yml), Kubernetes (~/.kube/config, /var/run/secrets/kubernetes.io/serviceaccount/token, /etc/rancher/k3s/k3s.yaml), herramientas de IA (.claude.json, ~/.claude.json, ~/.claude/mcp.json, .kiro/settings/mcp.json), Terraform (~/.terraform.d/credentials.tfrc.json, **/terraform.tfvars, **/*.auto.tfvars), bases de datos (~/.pgpass, ~/.my.cnf, **/config/database.yml), historial de shell (~/.bash_history, ~/.zsh_history, ~/.python_history, ~/.mysql_history), archivos de entorno (.env, **/.env.local, **/.env.production), llaveros de macOS (~/Library/Keychains/*.keychain-db), y más. Todos los datos se ensamblan en un archivo TAR en formato ustar (con cabeceras personalizadas que incluyen los bytes mágicos ustar\0, permisos 0000644 y codificación octal del tamaño), se comprimen con zlib.gzipSync(), y se exfiltran a través de dos canales independientes simultáneamente. El Canal 1 es una solicitud HTTPS POST al dominio sh.azurestaticprovider[.]net (IP 37.16.75.69) en el puerto 443, con autenticación HMAC-SHA256 usando la clave codificada qZ8pL3vNxR9wKmTyHbVcFgDsJaEoUi. El dominio es un typosquatting de Azure (imita azurestaticapps.net y azurewebsites.net), diseñado para mezclarse con el tráfico legítimo de la nube. El Canal 2 es un túnel DNS mucho más sofisticado: la carga útil sobrescribe el resolvedor del sistema con 1.1.1.1 (Cloudflare) y 8.8.8.8 (Google) para eludir los filtros DNS corporativos, resuelve el dominio C2 para obtener su IP, y luego redirige el resolvedor directamente al servidor C2 (37.16.75.69) en el puerto 53 para todas las consultas de exfiltración. Los datos se dividen en fragmentos, se codifican en hexadecimal, y se incrustan en etiquetas de subdominio de consultas DNS TXT con el formato <data_chunk>.<session_id>.<chunk_index>.<total>.bt.node.js. El sufijo bt.node.js no tiene registro TLD; existe únicamente como un sufijo cosmético dentro de los paquetes UDP que nunca salen de la infraestructura del atacante, por lo que no aparece en los registros DNS públicos. La versión 12.0.1 incluye una puerta de selección de objetivo adicional: calcula SHA256(path.basename(module.filename).toLowerCase()) y lo compara con un hash codificado ensamblado a partir de ocho fragmentos de tabla ofuscados (bf9d8c0c3ed3ceaa831a13de27f1b1c7c7b7f01d2db4103bfdba4191940b0301). Si no coincide, la carga útil no se ejecuta. Esto significa que el atacante precalculó el hash del punto de entrada de un proyecto o desarrollador específico antes de publicar, y la versión 12.0.1 es completamente inerte en cualquier otro sistema. Las versiones 9.x no tienen esta restricción y se ejecutan incondicionalmente. El malware también implementa demonización: si la variable de entorno __ntw no está presente, crea un proceso hijo independiente (detached) con __ntw=1 usando child_process.fork(), con stdio: 'ignore', detached: true, y unref() para que el padre pueda salir sin esperar. Luego, el proceso hijo ejecuta la carga útil completa. Si el archivo principal es el punto de entrada (require.main === module) y el hash coincide, también se crea un proceso hijo demonio. De lo contrario (para dependencias transitivas, el caso más común), la carga útil se ejecuta inmediatamente en el proceso actual. La ofuscación utiliza javascript-obfuscator con cuatro capas: (1) array shuffling de 443 entradas rotadas 340 posiciones a la izquierda (validado por una suma de verificación con objetivo 0xb5c88), (2) control flow flattening con patrones de despacho '5|1|4|3|0|2', (3) dead code injection (funciones de comparación ficticias, predicados opacos), y (4) un custom base-16 encoding con el alfabeto 0123456789GHJKMP (las letras G=10, H=11, J=12, K=13, M=14, P=15) y orden de nibbles invertido (little-endian), lo que significa que incluso si un analista identifica el alfabeto personalizado, una decodificación estándar produce basura; es necesario invertir el orden de los pares de nibbles. Este ataque es independiente del incidente peacenotwar de 2022 (versiones 10.1.1/10.1.2), donde el mantenedor original RIAEvangelist introdujo una carga útil de destrucción de archivos dirigida a Rusia y Bielorrusia como protesta por la invasión de Ucrania. El ataque de 2026 tiene un actor diferente, una motivación puramente financiera (robo de credenciales), y afecta a un conjunto diferente de versiones.
Vectores de Ataque / Métodos de Distribución
- Compromiso de Cuenta de Mantenedor npm: El atacante realizó un email takeover del dominio
atlantis-software.net(abandonado, reregistrado el 10 de marzo de 2026) para restablecer la contraseña de npm de la cuentaatiertant, que no había publicado desde abril de 2022. - Publicación Simultánea de Versiones Maliciosas: El atacante publicó
node-ipc@9.1.6,@9.2.3y@12.0.1en una ventana de 55 segundos, apuntando a rangos semver populares (~9.1.x,~9.2.x,^9,^12,~12.0). - Inyección IIFE en CommonJS Bundle: La carga útil de 80 KB se agregó al final de
node-ipc.cjs(el bundle CommonJS), después demodule.exports. No hay scripts enpackage.json. - Ejecución Automática en Tiempo de Ejecución: La carga útil se ejecuta cuando cualquier aplicación llama a
require('node-ipc')(dependencias directas o transitivas). No se requiere interacción del usuario más allá de la instalación del paquete. - Estrategia de Radio de Explosión: La publicación en tres versiones simultáneamente maximiza el impacto: usuarios con
package.jsonflexible reciben automáticamente la versión maliciosa en su próxima instalación. - Falsificación de Versiones 9.x: La línea 9.x nunca tuvo un bundle CommonJS; el atacante copió la estructura de 12.x, creando paquetes sintéticos completamente falsificados.
Técnicas, Tácticas y Procedimientos (TTPs) - MITRE ATT&CK
| Táctica (MITRE ATT&CK) | Técnica / Subtécnica | Descripción / Implementación |
|---|---|---|
| Resource Development (TA0042) | Compromise Accounts (T1586) - Cloud Accounts (T1586.003) | Email takeover del dominio atlantis-software.net para comprometer la cuenta npm atiertant.
|
| Resource Development (TA0042) | Acquire Infrastructure (T1583) - Domains (T1583.001) | Registro del dominio typosquatting sh.azurestaticprovider[.]net para C2.
|
| Initial Access (TA0001) | Supply Chain Compromise (T1195) - Compromise Software Supply Chain (T1195.002) | Publicación de versiones maliciosas de node-ipc en el registro npm. |
| Execution (TA0002) | Command and Scripting Interpreter: Node.js (T1059.013) | La carga útil IIFE se ejecuta automáticamente cuando se requiere el módulo Node.js. |
| Persistence (TA0003) | Create or Modify System Process (T1543) | Demonización mediante child_process.fork() con detached: true y unref().
|
| Defense Evasion (TA0005) | Obfuscated Files or Information (T1027) | Ofuscación con array shuffling (443 entradas, rotación 340), control flow flattening, dead code injection, custom base-16 encoding. |
| Defense Evasion (TA0005) | Deobfuscate/Decode Files or Information (T1140) | Decodificación en tiempo real del custom base-16 (alfabeto 0123456789GHJKMP, nibbles invertidos).
|
| Defense Evasion (TA0005) | Masquerading (T1036) - Match Legitimate Name or Location (T1036.005) | Dominio C2 sh.azurestaticprovider[.]net imita nombres legítimos de Azure (azurestaticapps.net, azurewebsites.net).
|
| Defense Evasion (TA0005) | Virtualization/Sandbox Evasion (T1497) - System Checks (T1497.001) | Puerta de selección de objetivo en 12.0.1 basada en SHA-256 del nombre del archivo principal. |
| Discovery (TA0007) | System Information Discovery (T1082) | Recopilación de uname -a, variables de entorno, PID, CWD, /etc/hosts.
|
| Discovery (TA0007) | File and Directory Discovery (T1083) | Búsqueda de más de 90 patrones de ruta de archivos de credenciales (AWS, SSH, Kubernetes, etc.). |
| Discovery (TA0007) | Security Software Discovery (T1518.001) | No explícito, pero la recopilación de variables de entorno puede incluir variables de seguridad. |
| Credential Access (TA0006) | Unsecured Credentials: Credentials In Files (T1552.001) | Robo de credenciales de proveedores de nube (AWS, Azure, GCP), claves SSH, tokens de Kubernetes, archivos .env.
|
| Credential Access (TA0006) | Credentials from Password Stores (T1555.003) | Robo de cookies y credenciales de navegadores (a través de patrones de archivos). |
| Collection (TA0009) | Data from Local System (T1005) | Recopilación de archivos de credenciales, historial de shell, configuraciones. |
| Collection (TA0009) | Archive Collected Data (T1560) - Archive via Utility (T1560.001) | Empaquetado en TAR (formato ustar) y compresión GZIP. |
| Command and Control (TA0011) | Application Layer Protocol: Web Protocols (T1071.001) | Exfiltración HTTPS a sh.azurestaticprovider[.]net:443.
|
| Command and Control (TA0011) | DNS (T1071.004) | Túnel DNS para exfiltración (consultas TXT con subdominios codificados). |
| Command and Control (TA0011) | Encrypted Channel (T1573) | HTTPS con TLS (certificado Let's Encrypt). |
| Command and Control (TA0011) | Non-Standard Port (T1571) | El servidor C2 también actúa como receptor DNS en el puerto 53. |
| Exfiltration (TA0010) | Exfiltration Over Web Service (T1567) | Exfiltración HTTPS a dominio de typosquatting. |
| Exfiltration (TA0010) | Exfiltration Over Alternative Protocol (T1048) | Túnel DNS (protocolo alternativo para exfiltración). |
| Impact (TA0040) | Financial Theft (sin código ATT&CK específico) | Motivación financiera: robo de credenciales para acceso a infraestructura cloud y criptomonedas. |
Flujo de Ataque (Cyber Kill Chain)
- Reconocimiento: El atacante identifica paquetes npm inactivos de alta descarga (node-ipc, 21 meses sin actualizaciones). Identifica cuentas de mantenedores inactivas (
atiertant). Investiga el dominioatlantis-software.net. - Armamento: El atacante desarrolla la carga útil de 80 KB con ofuscación de cuatro capas, patrones de ruta para 90+ categorías de credenciales, lógica de demonización, y dos canales de exfiltración (HTTPS y DNS tunneling). Configura el dominio C2
sh.azurestaticprovider[.]net(typosquatting de Azure) y el servidor37.16.75.69. Registra el dominioatlantis-software.net(reregistro el 10 de marzo de 2026) para el email takeover. - Entrega: El atacante realiza email takeover de la cuenta
atiertantusando el dominio reregistrado, restablece la contraseña de npm, y publica tres versiones maliciosas (9.1.6,9.2.3,12.0.1) en una ventana de 55 segundos. - Explotación: No se explota una vulnerabilidad técnica. Los desarrolladores y pipelines CI/CD que ejecutan
npm install(sin versiones fijas) descargan automáticamente las versiones maliciosas. - Instalación: El paquete se instala en
node_modules/. La carga útil no se ejecuta durante la instalación (no hay scripts). Permanece latente hasta que una aplicación llama arequire('node-ipc'). - Comando y Control (C2): Cuando se ejecuta
require('node-ipc'), la IIFE se activa. El malware demoniza el proceso, recopila credenciales, empaqueta los datos en TAR+GZIP, y exfiltra a través de HTTPS y DNS tunneling al C2. - Acción sobre Objetivos: El atacante recibe las credenciales robadas (AWS, Azure, GCP, claves SSH, tokens Kubernetes, etc.). Puede usar estas credenciales para acceder a infraestructura cloud, robar datos adicionales, desplegar ransomware, o vender las credenciales en mercados clandestinos.
Infraestructura Utilizada
| Tipo | Indicador / Característica | Propósito |
|---|---|---|
| Cuenta npm Comprometida | atiertant (a.tiertant@atlantis-software.net)
|
Publicación de versiones maliciosas. |
| Dominio para Email Takeover | atlantis-software.net (reregistrado 2026-03-10, Namecheap, MX PrivateEmail)
|
Restablecimiento de contraseña de npm. |
| Dominio C2 (Typosquatting) | sh.azurestaticprovider[.]net (no es de Microsoft)
|
Exfiltración HTTPS, imita Azure. |
| IP C2 | 37.16.75.69
|
Servidor C2 (HTTPS y DNS sink). |
| Puertos C2 | 443 (HTTPS), 53 (DNS sink) | Exfiltración principal y túnel DNS. |
| Resolvedores DNS Override | 1.1.1.1, 8.8.8.8
|
Bypass de filtros DNS corporativos. |
| Sufijo DNS de Exfiltración | *.bt.node.js
|
Sufijo cosmético; no tiene TLD registrado. |
| Payload | IIFE de 80 KB en node-ipc.cjs
|
Carga principal. |
| Clave HMAC | qZ8pL3vNxR9wKmTyHbVcFgDsJaEoUi
|
Autenticación de exfiltración. |
| Identificador de Módulo | bt.node.js
|
Identificador en consultas DNS. |
| Hash Objetivo (12.0.1) | bf9d8c0c3ed3ceaa831a13de27f1b1c7c7b7f01d2db4103bfdba4191940b0301
|
Selección de objetivo específico. |
| Directorio de Preparación | $TMPDIR/nt-<PID>/
|
Almacenamiento temporal del archivo TAR. |
| Variable de Entorno Demonio | __ntw=1
|
Prevención de ejecución múltiple. |
Objetivos y Sectores Afectados
- Objetivo Principal: Desarrolladores de software, equipos de DevOps, y pipelines CI/CD que utilizan Node.js y npm.
- Sector Prioritario: Tecnología, Desarrollo de Software, Servicios en la Nube, Cualquier organización que use Node.js.
- Paquetes Afectados:
node-ipc@9.1.6,node-ipc@9.2.3,node-ipc@12.0.1 - Descargas Semanales del Paquete (legítimo): Más de 10 millones
- Ecosistema: npm (Node.js)
- Versiones Limpias Recomendadas:
node-ipc@9.2.1(para usuarios de 9.x),node-ipc@12.0.0(para usuarios de 12.x) - Datos Robados: Credenciales de AWS, Azure, GCP, OCI, DigitalOcean, Hetzner, Scaleway, Alibaba Cloud, IBM Cloud, Fly.io, Vercel, Railway, Snowflake, MinIO; claves SSH (privadas y públicas); tokens de Kubernetes (
~/.kube/config, tokens de servicio); configuraciones de GitHub CLI; claves API de Claude AI; configuraciones de Kiro IDE; archivos de estado de Terraform; contraseñas de bases de datos (PostgreSQL, MySQL); historial de shell (bash, zsh, python, mysql); archivos.env; credenciales de npm; archivos de configuración de Git; llaveros de macOS; y más (90+ categorías).
Impacto y Riesgo
- Nivel de Riesgo: Crítico para cualquier organización o desarrollador que haya instalado las versiones comprometidas, ya sea directamente o como dependencia transitiva. El impacto en la cadena de suministro es masivo debido a las 10 millones de descargas semanales del paquete.
- Impacto Potencial (Desarrolladores/Organizaciones):
- Compromiso de Infraestructura Cloud: Las credenciales de AWS, Azure y GCP robadas permiten a los atacantes acceder a servidores, bases de datos, almacenamiento y otros recursos cloud, potencialmente causando fugas de datos, despliegue de malware, o minería de criptomonedas.
- Acceso a Repositorios de Código: Los tokens de GitHub CLI robados pueden permitir a los atacantes acceder a repositorios privados, robar código fuente, o inyectar malware en pipelines CI/CD.
- Compromiso de Clústeres Kubernetes: Los tokens de Kubernetes (
~/.kube/config) permiten a los atacantes controlar clústeres enteros, desplegar contenedores maliciosos o robar secretos del clúster. - Robo de Propiedad Intelectual: El código fuente, las claves API de servicios de IA (Claude AI), y las configuraciones de herramientas de desarrollo pueden ser robados.
- Pivote a Sistemas Internos: Las claves SSH robadas pueden ser utilizadas para acceder a servidores internos, sistemas de producción, y otros recursos de la red corporativa.
- Suplantación de Identidad en npm: Los tokens de npm robados permiten a los atacantes publicar versiones maliciosas de otros paquetes, propagando el ataque a través de la cadena de suministro.
- Exfiltración de Datos de Clientes: Si las credenciales robadas incluyen acceso a bases de datos de producción, los atacantes pueden exfiltrar datos de clientes, causando violaciones de datos y multas regulatorias (GDPR, CCPA).
- Contexto del Ataque (Estrategia de Radio de Explosión): El atacante publicó en tres versiones simultáneamente para maximizar el impacto. La etiqueta
latestde npm apunta a12.0.1, por lo que cualquiernpm install node-ipcsin versión fija descarga la versión maliciosa. Los proyectos que usan rangos como^9.1.0o^12.0.0también se ven afectados. - Falsificación de Versiones 9.x: La línea 9.x nunca tuvo un bundle CommonJS. La publicación de
9.1.6y9.2.3es particularmente peligrosa porque los usuarios que confían en la línea 9.x (creyendo que es más estable) instalan paquetes completamente falsificados. - Puerta de Selección de Objetivo (12.0.1): La versión 12.0.1 solo se activa en un proyecto específico (cuyo punto de entrada tiene un hash SHA-256 precalculado). Esto sugiere que el atacante tenía un objetivo específico en mente, posiblemente una empresa o proyecto de alto valor. Las versiones 9.x no tienen esta protección y se ejecutan incondicionalmente.
Recomendaciones de Mitigación
- Eliminación Inmediata de Versiones Comprometidas (M1033):
- Identificar si
node-ipc@9.1.6,9.2.3o12.0.1están presentes enpackage-lock.json,yarn.lockopnpm-lock.yaml:
- Identificar si
npm ls node-ipc
grep -E '"node-ipc".*"(9\.1\.6|9\.2\.3|12\.0\.1)"' package-lock.json
Eliminar las versiones comprometidas e instalar versiones limpias:
npm install node-ipc@9.2.1 # para proyectos que usan 9.x
npm install node-ipc@12.0.0 # para proyectos que usan 12.xRegenerar el archivo de bloqueo después de la actualización.
- Rotación de Credenciales (M1026, M1053):
- Rotar todas las credenciales que estaban presentes en el sistema durante el período en que las versiones comprometidas estuvieron instaladas. Prioridad:
- Claves de acceso de AWS IAM y tokens de sesión
- Claves de cuenta de servicio de Azure y GCP
- Tokens de Kubernetes (revocar y regenerar
~/.kube/config) - Claves SSH privadas (revocar de todas las listas
authorized_keys) - Tokens de acceso personal de GitHub y OAuth
- Tokens de npm (
~/.npmrc) - Claves API de Claude AI y otras herramientas de IA
- Contraseñas de bases de datos (PostgreSQL
~/.pgpass, MySQL~/.my.cnf) - Todos los secretos en archivos
.env
- No esperar confirmación de exfiltración. Asumir que todas las credenciales están comprometidas.
- Rotar todas las credenciales que estaban presentes en el sistema durante el período en que las versiones comprometidas estuvieron instaladas. Prioridad:
- Auditoría de Logs y Actividad Sospechosa (M1040, M1047):
- Auditar logs de DNS (si se utilizan resolvedores corporativos) en busca de consultas a
sh.azurestaticprovider[.]netobt.node.js. Nota: El túnel DNS bypassa los resolvedores corporativos porque el malware sobrescribe el resolvedor con8.8.8.8/1.1.1.1. Sin embargo, las consultas DNS aún pueden ser visibles en los logs del firewall si se inspecciona el tráfico UDP/53 saliente. - Auditar logs de proxy/egress para conexiones HTTPS a
sh.azurestaticprovider[.]net(IP37.16.75.69) en el puerto 443. - Auditar logs de cloud (CloudTrail, Azure Activity Log, GCP Audit Log) para detectar acciones realizadas por identidades IAM cuyas credenciales estaban presentes durante el período de compromiso.
- Buscar directorios
nt-*en/tmpo$TMPDIR. - Buscar la variable de entorno
__ntw=1en procesos en ejecución.
- Auditar logs de DNS (si se utilizan resolvedores corporativos) en busca de consultas a
- Implementación de Controles de Seguridad en CI/CD (M1030, M1037):
- Implementar un registro npm privado (como StepSecurity Secure Registry, JFrog Artifactory, o GitHub Packages) con un período de enfriamiento (cooldown) para versiones recién publicadas (ej., 10 días). Las versiones maliciosas se detectarían antes de ser servidas.
- Restringir el tráfico de red saliente desde los runners de CI/CD utilizando una lista de permitidos (allowlist). Bloquear tráfico a IPs no autorizadas (como
37.16.75.69). - Usar herramientas de análisis de paquetes como StepSecurity AI Package Analyst, Socket, o Snyk para detectar comportamientos sospechosos en dependencias.
- Prevención de Future Supply Chain Attacks (M1032, M1018):
- Fijar versiones de paquetes en
package.json(evitar rangos como^o~). Usarnpm cien lugar denpm installen entornos de CI/CD para respetar el archivo de bloqueo. - Auditar las cuentas de mantenedores de paquetes críticos. Revocar acceso de cuentas inactivas. Implementar autenticación multifactor (MFA) en npm (si está disponible).
- Monitorear dominios abandonados asociados con cuentas de mantenedores. Implementar un proceso para detectar email takeovers.
- Fijar versiones de paquetes en
Herramientas de Detección
- StepSecurity AI Package Analyst: Detectó este ataque en tiempo real, evaluando el riesgo de la cadena de suministro de paquetes npm basado en anomalías (tamaño del tarball 3.7x mayor, inyección de código en la raíz del paquete, referencias a forks de GitHub en
optionalDependencies). - Socket: Herramienta de análisis de dependencias que detecta comportamiento malicioso en paquetes npm (acceso a archivos del sistema, exfiltración de datos, ofuscación sospechosa).
- Snyk: Herramienta de seguridad de código abierto que puede detectar vulnerabilidades en dependencias (incluyendo ataques a la cadena de suministro).
- Monitoreo de Tráfico de Red (NDR): Herramientas que inspeccionan el tráfico UDP/53 pueden detectar consultas DNS inusualmente largas (subdominios codificados) con sufijos como
bt.node.js. - EDR / XDR: Soluciones como CrowdStrike, SentinelOne, Microsoft Defender for Endpoint pueden detectar procesos Node.js leyendo archivos de credenciales (
~/.aws/credentials,~/.ssh/id_rsa, etc.), creando directoriosnt-*, o realizando consultas DNS anómalas. - SIEM: Correlacionar logs de npm (
npm audit), logs de instalación de paquetes, logs de red, y logs de endpoints para detectar patrones de ataque.
Referencias y Fuentes
- Dragora. (2026, 14 de mayo). Malware detectado en versiones npm de node-ipc. (Artículo proporcionado por el usuario).
- StepSecurity. (2026, 14 de mayo). Active Supply Chain Attack: Malicious node-ipc Versions Published to npm. (Análisis técnico proporcionado por el usuario).
- Likhith, S. (2026). StepSecurity AI Package Analyst. (Análisis citado en el artículo).
- GitHub Issue #15: *[SECURITY] node-ipc@12.0.1 CJS bundle contains obfuscated infostealer payload*. (Reporte de nullcharb y otros).
- MITRE ATT&CK Framework. Enterprise Matrix. (Para mapeo de TTPs).
Historial de Revisiones
| Fecha | Versión | Autor | Cambios Realizados |
|---|---|---|---|
| 2026-05-14 | 1.0 | Fernando Vargas Hincapié | Creación inicial de la entrada basada en el análisis de StepSecurity y GitHub sobre el ataque a node-ipc. |
Indicadores de Compromiso (IOCs)
| Tipo | Valor |
|---|---|
| Paquete Afectado | node-ipc (npm)
|
| Versiones Maliciosas | 9.1.6, 9.2.3, 12.0.1
|
| Versiones Limpias | 9.2.1 (para 9.x), 12.0.0 (para 12.x)
|
| Cuenta npm Maliciosa | atiertant (a.tiertant@atlantis-software.net)
|
| Cuenta Legítima | riaevangelist (brandon@diginow.it)
|
| Dominio Email Takeover | atlantis-software.net (reregistrado 2026-03-10, Namecheap)
|
| SHA256 (node-ipc.cjs) | 96097e0612d9575cb133021017fb1a5c68a03b60f9f3d24ebdc0e628d9034144 (idéntico en las tres versiones)
|
| SHA256 (Tarball 12.0.1) | 78a82d93b4f580835f5823b85a3d9ee1f03a15ee6f0e01b4eac86252a7002981
|
| SHA256 (Tarball 9.2.3) | c2f4dc64aec4631540a568e88932b61daebbfb7e8281b812fa01b7215f9be9ea
|
| SHA256 (Tarball 9.1.6) | 449e4265979b5fdb2d3446c021af437e815debd66de7da2fe54f1ad93cbcc75e
|
| SHA256 (IIFE bloque) | b2001dc4e13d0244f96e70258346700109907b90e1d0b09522778829dcd5e4cf
|
| Dominio C2 | sh.azurestaticprovider[.]net (typosquatting de Azure, no es de Microsoft)
|
| IP C2 | 37.16.75.69
|
| Puerto C2 (HTTPS) | 443
|
| Puerto C2 (DNS sink) | 53 (UDP)
|
| Resolvedores DNS Override | 1.1.1.1, 8.8.8.8
|
| Sufijo DNS de Exfiltración | bt.node.js
|
| Prefijos DNS | xh (header), xd (data), xf (footer)
|
| Clave HMAC | qZ8pL3vNxR9wKmTyHbVcFgDsJaEoUi
|
| Hash Objetivo (12.0.1) | bf9d8c0c3ed3ceaa831a13de27f1b1c7c7b7f01d2db4103bfdba4191940b0301
|
| Directorio de Preparación | $TMPDIR/nt-<PID>/
|
| Variable de Entorno Demonio | __ntw=1
|
| Archivos Temporales | uname.txt, envs.txt
|
| Archivo de Archivo | secure_prefs.zip (en memoria)
|
| Patrón de Tubería (N/A para npm) | No aplica (no hay tuberías con nombre en este ataque) |
| Fechas de Publicación | 14 de mayo de 2026 (ventana de 55 segundos) |
| Última Versión Legítima | 12 de agosto de 2024 (12.0.0)
|
| Lapso de Inactividad | 21 meses |
| Número de Patrones de Credenciales | 90+ categorías |
| Tamaño del Payload | 80,079 bytes (IIFE) |
| Tamaño del Tarball (anomalía) | 3.7x más grande que la versión limpia |
| Comportamiento Anómalo (Archivos) | node-ipc.cjs aumenta de 37 KB a 117 KB
|
| Comportamiento Anómalo (Red) | Tráfico HTTPS a sh.azurestaticprovider[.]net
|
| Comportamiento Anómalo (Red) | Consultas DNS TXT con subdominios largos y sufijo bt.node.js
|
| Comportamiento Anómalo (Procesos) | Procesos Node.js con __ntw=1 en el entorno
|
| Comportamiento Anómalo (Archivos) | Directorios nt-* en /tmp o $TMPDIR
|
| Comportamiento Anómalo (Archivos) | Acceso a ~/.aws/credentials, ~/.ssh/id_rsa, etc., desde procesos Node.js
|
Etiquetas / Categorías
node-ipc npm supply-chain-attack infostealer credential-theft dns-tunneling c2 azure-typosquatting iihe commonjs javascript-obfuscator atiertant riaevangelist peacenotwar stepsecurity socket snyk bf9d8c0c3ed3ceaa831a13de27f1b1c7c7b7f01d2db4103bfdba4191940b0301 sh.azurestaticprovider.net 37.16.75.69 bt.node.js qZ8pL3vNxR9wKmTyHbVcFgDsJaEoUi __ntw npm-supply-chain ci-cd cloud-credentials ssh-keys kubernetes-tokens terraform claude-ai kiro-ide ciberwiki dragora stepsecurity likhith nullcharb carlini jimmytsadiotis ashishkurmi cyb3rjerry danielweck roni-carta