Uno de los clientes HTTP más utilizados en la ecosistema JavaScript, Axios, ha sido víctima de un ataque a la cadena de suministro en npm. Dos versiones maliciosas del paquete introdujeron de forma silenciosa una dependencia fraudulenta que, durante la instalación, desplegaba un Remote Access Trojan (RAT) multiplataforma con capacidades de control remoto sobre sistemas Windows, macOS y Linux.
Versiones de Axios comprometidas y dependencia maliciosa plain-crypto-js
La investigación de StepSecurity identificó que las versiones Axios 1.14.1 y Axios 0.30.4 fueron publicadas en npm con una dependencia adicional no legítima: [email protected]. El código fuente de Axios en sí no fue alterado; el vector de ataque se concentró exclusivamente en esta dependencia externa.
Es importante destacar que plain-crypto-js no era utilizada ni importada por el código de Axios. Su única finalidad era ejecutar un script postinstall tras la instalación del paquete. Este script actuaba como dropper del RAT, descargando y desplegando la carga maliciosa ya compilada para los tres sistemas operativos principales.
Impacto, versiones seguras y medidas urgentes de mitigación
Tras descubrir el incidente, las versiones maliciosas de Axios y el paquete plain-crypto-js fueron retirados del registro de npm. Se recomienda a desarrolladores y organizaciones retroceder inmediatamente a versiones consideradas seguras: Axios 1.14.0 o Axios 0.30.3, y rotar todos los secretos y credenciales potencialmente expuestos (tokens, claves de API, contraseñas, credenciales de CI/CD).
Axios registra más de 83 millones de descargas semanales, lo que convierte este incidente en un riesgo significativo para aplicaciones web, pipelines de integración continua y entornos de producción. Cualquier sistema donde se haya instalado Axios 1.14.1 o 0.30.4 debe considerarse posiblemente comprometido y someterse a un análisis exhaustivo.
Compromiso de la cuenta de npm y evasión del pipeline de CI/CD
Según StepSecurity, los atacantes obtuvieron acceso a la cuenta de npm del mantenedor principal de Axios, «jasonsaayman», y modificaron el correo registrado por una dirección bajo su control («[email protected]»). El paquete plain-crypto-js fue publicado desde otra cuenta de npm, «nrwise», asociada al correo «[email protected]».
Los expertos señalan que probablemente se utilizó un classic access token de npm de larga duración. Estos tokens permiten publicar paquetes directamente en el registro, lo que habría permitido eludir el pipeline de CI/CD basado en GitHub Actions y subir versiones modificadas de Axios sin pasar por las comprobaciones automatizadas de seguridad, pruebas y firma de artefactos.
Funcionamiento del script postinstall malicioso y cadena de ataque
Dropper en Node.js y comunicación con el servidor de mando y control
Dentro de plain-crypto-js, el componente clave es un script Node.js ofuscado, «setup.js». Este se ejecuta automáticamente durante la fase de postinstall y realiza primero la detección del sistema operativo para seleccionar el flujo de ataque adecuado.
Cada plataforma envía una petición HTTP POST a un único servidor de mando y control (C2), supuestamente alojado bajo el dominio packages.npm.org, pero utilizando rutas diferentes: /product0 para macOS, /product1 para Windows y /product2 para Linux. Con este diseño, el C2 puede responder con el binario específico para cada sistema operativo desde un único punto de control.
Capacidades del RAT y técnicas de ocultación en el paquete npm
En el caso de macOS, el servidor entrega un RAT escrito en C++ capaz de realizar fingerprinting del dispositivo (recopilación de información básica del sistema) y de comunicarse con el C2 aproximadamente cada 60 segundos para recibir instrucciones. Entre sus capacidades se incluyen la ejecución de comandos arbitrarios en la shell, el despliegue de cargas adicionales, el listado del sistema de archivos y la autodestrucción bajo orden.
Para dificultar el análisis forense, el script Node.js ejecuta varios pasos de borrado y camuflaje tras iniciar el malware: elimina el script postinstall, borra el package.json que contenía el gancho de instalación y renombra el fichero package.md a package.json. Este último es un manifiesto “limpio”, sin ganchos de instalación, lo que pretende ocultar cualquier rastro evidente de la actividad maliciosa durante revisiones posteriores del paquete instalado.
Otros paquetes afectados y señales de compromiso en proyectos Node.js
La empresa Socket, especializada en seguridad de la cadena de suministro de software, ha informado de otros dos paquetes implicados en la distribución de la misma carga maliciosa:
— @shadanai/openclaw, donde plain-crypto-js se incluye en una ruta anidada como dependencia “vendida” internamente;
— @qqbrowser/[email protected], que incorpora una versión manipulada de [email protected] en su directorio node_modules.
El Axios legítimo solo declara tres dependencias: follow-redirects, form-data y proxy-from-env. La aparición de plain-crypto-js entre las dependencias es un indicador claro de compromiso de la cadena de suministro. Se recomienda revisar los archivos de bloqueo (package-lock.json, yarn.lock) y los directorios node_modules en busca de estas versiones y paquetes sospechosos.
Este incidente con Axios ilustra la creciente peligrosidad de los ataques a la cadena de suministro en npm y en el ecosistema open source. Para reducir riesgos, las organizaciones deberían reforzar la seguridad de las cuentas de mantenedores (autenticación multifactor, rotación frecuente de tokens, uso de tokens de corta duración), aplicar controles estrictos en los pipelines de CI/CD, automatizar el análisis de dependencias (detección de scripts postinstall inusuales y de nuevas dependencias inesperadas) y mantener inventarios precisos de software. Adoptar estas prácticas eleva de forma significativa el nivel de ciberseguridad y limita el potencial de daño de futuras campañas similares.