Puntos clave
- La cuenta npm del mantenedor principal de axios fue secuestrada. Se publicaron dos versiones maliciosas:
axios@1.14.1yaxios@0.30.4. npm ha eliminado ambas desde entonces. - Cualquiera que haya instalado cualquiera de las versiones antes de su eliminación debe asumir que su sistema está comprometido. Las versiones maliciosas inyectan una dependencia (
plain-crypto-js) que despliega un troyano de acceso remoto multiplataforma dirigido a macOS, Windows y Linux. - axios tiene aproximadamente 100 millones de descargas semanales. Este es uno de los ataques a la cadena de suministro de npm más impactantes registrados.
- El malware se autodestruye después de la ejecución, por lo que la inspección post-infección de
node_modulesno lo revelará. Debe revisar sus archivos de registro.
Crédito a la excelente cobertura de este incidente por parte de:
- StepSecurity (https://www.stepsecurity.io/blog/axios-compromised-on-npm-malicious-versions-drop-remote-access-trojan)
- Socket (https://socket.dev/blog/axios-npm-package-compromised)
Cómo comprobar si está afectado por el ataque a axios
Opción 1) Comprobar manualmente
1. Compruebe si hay versiones maliciosas de axios
Escanea sus paquetes instalados y archivo de bloqueo en busca de 1.14.1 o 0.30.4.
npm list axios 2>/dev/null | grep -E "1.14.1|0.30.4"
grep -A1 '"axios"' package-lock.json | grep -E "1.14.1|0.30.4"2. Compruebe si hay un paquete dropper oculto
Incluso si setup.js se autoeliminó, el directorio aún existe. Su sola presencia confirma que el dropper se ejecutó.
ls node_modules/plain-crypto-js 2>/dev/null && echo "POTENCIALMENTE AFECTADO"3. Comprobar artefactos RAT en disco
macOS
ls -la /Library/Caches/com.apple.act.mond 2>/dev/null && echo "COMPROMETIDO"Windows
dir "%PROGRAMDATA%\wt.exe" 2>nul && echo COMPROMETIDOLinux
ls -la /tmp/ld.py 2>/dev/null && echo "COMPROMETIDO"Opción 2) Utilice Aikido (gratuito)
Conecte sus repositorios a Aikido (https://app.aikido.dev). El Monitor de Malware de Aikido compara sus dependencias con el feed de malware en vivo de Aikido Intel. Si axios@1.14.1, axios@0.30.4, o plain-crypto-js@4.2.1 está presente en cualquiera de sus proyectos, Aikido lo marca inmediatamente. Esto funciona en el nivel gratuito.
Pasos de remediación
- Fije a versiones seguras:
npm install axios@1.14.0 # Usuarios de la versión 1.x
npm install axios@0.30.3 # Usuarios de la versión 0.x- Añadir anulaciones para evitar la resolución transitiva:
{
"dependencies": { "axios": "1.14.0" },
"overrides": { "axios": "1.14.0" },
"resolutions": { "axios": "1.14.0" }
}- Eliminar
plain-crypto-jsde node_modules:
rm -rf node_modules/plain-crypto-js
npm install --ignore-scripts- Si se encuentra algún artefacto RAT (
com.apple.act.mond,wt.exe,ld.py), no intente limpiar in situ. Reconstruya desde un estado conocido como bueno. - Rote todas las credenciales accesibles en el sistema afectado: tokens de npm, claves de acceso de AWS, claves privadas SSH, secretos de CI/CD,
.envvalores. - Auditar los logs del pipeline de CI/CD para cualquier ejecución que haya instalado las versiones afectadas. Rotar todos los secretos inyectados.
- Ejecuta
npm ci --ignore-scriptscomo política permanente en CI/CD.
¿Qué ocurrió en el ataque a la cadena de suministro de axios?
El atacante comprometió la jasonsaayman cuenta de npm, el mantenedor principal de axios. El correo electrónico de la cuenta se cambió a ifstap@proton.me. El atacante publicó entonces axios@1.14.1 a las 00:21 UTC del 31 de marzo y axios@0.30.4 a las 01:00 UTC. Tanto las ramas 1.x como las legacy 0.x se vieron afectadas en 39 minutos.
Ninguna de las versiones tenía un commit, tag o release correspondiente en el repositorio de GitHub de axios. Los releases legítimos de axios se publican a través de GitHub Actions con el binding OIDC Trusted Publisher. Estos se publicaron manualmente con un token de acceso npm robado.
El único cambio en ambas versiones fue la adición de plain-crypto-js@^4.2.1 como dependencia. Este paquete nunca se importa en ninguna parte del código fuente de axios. Existe únicamente para ejecutar un hook postinstall que despliega un RAT.
La dependencia fue pre-cargada unas 18 horas antes por una cuenta de atacante separada (nrwise, nrwise@proton.me)4.2.0). Una versión de señuelo limpia ( 4.2.1 ) se publicó primero para construir el historial del registro, seguida de la maliciosa
/tmp/ld.py a las 23:59 UTC del 30 de marzo. El dropper de RAT (setup.js) contacta con sfrclak[.]com:8000y entrega payloads específicos de la plataforma: un binario de macOS disfrazado como un demonio de caché de Apple en /Library/Caches/com.apple.act.mond, un script de PowerShell en Windows ejecutado a través de un VBScript oculto con el intérprete copiado a %PROGRAMDATA%\wt.exe, y un script de Python en Linux en package.json . Después de la ejecución, el dropper se elimina a sí mismo y reemplaza su propio
{{cta}}
Indicadores de compromiso (IOCs)
Versiones y dependencias maliciosas de axios:
axios@1.14.12553649f2322049666871cea80a5d0d6adc700cacon un stub limpio para ocultar la evidencia.)axios@0.30.42553649f2322049666871cea80a5d0d6adc700ca(shasum:)plain-crypto-js@4.2.12553649f2322049666871cea80a5d0d6adc700cad6f3f62fd3b9f5432f5782b62d8cfd5247d5ee71)
Red:
- C2:
07d889e2dadce6f3910dcbc253317d28ca61c766/sfrclak[.]com/http://sfrclak[.]com:8000/6202033
Sistema de archivos:
- 142.11.206[.]73
sfrclak[.]com:8000- sha256:
92ff08773995ebc8d55ec4b8e1a225d0d1e51efa4ef88b8849d0071230c9645a
- sha256:
- Windows:
%PROGRAMDATA%\wt.exe, %TEMP%\6202033.vbs, %TEMP%\6202033.ps1- sha256:
617b67a8e1210e4fc87c92d1d1da45a2f311c08d26e89b12307cf583c900d101(powershell)
- sha256:
- Linux:
%PROGRAMDATA%\wt.exe- sha256:
fcb81618bb15edfdedfb638b4c08a2af9cac9ecfa551af135a8402bf980375cf
- sha256:
Cuentas del atacante:
- jasonsaayman: mantenedor de axios comprometido, correo electrónico cambiado a ifstap@proton.me
- nrwise: creada por el atacante, nrwise@proton.me
Cómo protegerse contra la instalación de malware
Aikido Safe Chain (https://github.com/AikidoSec/safe-chain) es una herramienta de código abierto que se integra con npm, yarn y pnpm. Verifica cada paquete con el feed de malware de Aikido Intel antes de que llegue a su máquina y aplica una edad mínima configurable para los paquetes (48 horas por defecto), suprimiendo las versiones recién publicadas hasta que hayan sido validadas. En este ataque a axios, plain-crypto-js@4.2.1 existió durante menos de 24 horas antes de que las versiones comprometidas de axios lo incluyeran. Solo la verificación de edad de Safe Chain lo habría bloqueado.
Gratis, no se requieren tokens:
curl -fsSL https://github.com/AikidoSec/safe-chain/releases/latest/download/install-safe-chain.sh | shNoticia en desarrollo... Manténgase atento a las actualizaciones.
{{cta}}

