axios comprometido en npm: RAT en 300M descargas semanales

Share

El 31 de marzo de 2026, alguien comprometió la cuenta npm del mantenedor principal de axios — la librería HTTP más popular del ecosistema JavaScript, con más de 300 millones de descargas semanales — y publicó dos versiones maliciosas: axios@1.14.1 y axios@0.30.4. Cualquier proyecto que corrió npm install o npm update durante la ventana de exposición instaló un RAT (Remote Access Trojan) multiplataforma que contactó un servidor de comando y control externo.

El ataque fue detectado y reportado por StepSecurity con análisis técnico completo. Axios fue retirado de npm en las versiones comprometidas. Las versiones seguras son axios@1.14.0 (rama 1.x) y axios@0.30.3 (rama 0.x).

Cómo funcionó el ataque

El vector no fue inyectar código malicioso en axios directamente. Fue más sofisticado:

Aprende IA con nosotros

Únete gratis a mi comunidad en Skool, donde compartimos noticias, tutoriales y recursos para seguir aprendiendo juntos.

👥 Únete gratis 🚀
  1. Preparación: El atacante publicó un paquete falso llamado plain-crypto-js@4.2.1 (haciéndose pasar por el legítimo crypto-js) con un hook postinstall que ejecuta un dropper obfuscado en Node.js.
  2. Compromiso de cuenta: Se tomaron control de la cuenta npm de Jason Saayman (mantenedor de axios), cambiando su email a una cuenta ProtonMail anónima.
  3. Publicación maliciosa: Publicaron axios@1.14.1 y axios@0.30.4 con plain-crypto-js@4.2.1 como nueva dependencia de runtime — un paquete que nunca antes apareció en axios.

Al correr npm install axios@1.14.1, npm resolvía automáticamente la dependencia e instalaba plain-crypto-js, cuyo postinstall script contactaba el servidor C2 (http://sfrclak.com:8000/6202033) y descargaba un RAT específico para cada plataforma: AppleScript en macOS, VBScript + PowerShell en Windows, Python en Linux.

El RAT se autoeliminaba después de ejecutar, reemplazando el package.json de plain-crypto-js con un stub limpio para borrar evidencia. Un desarrollador que inspeccionara node_modules después del hecho no encontraba nada sospechoso — excepto el directorio node_modules/plain-crypto-js/, que no debería existir en ninguna instalación legítima de axios.

Señal de alerta que distingue las versiones maliciosas

Todas las versiones legítimas de axios 1.x se publican via GitHub Actions con el mecanismo OIDC Trusted Publisher de npm — la publicación está criptográficamente ligada a un workflow verificado de GitHub. axios@1.14.1 rompe ese patrón: fue publicado manualmente con un token de acceso robado, sin OIDC y sin un commit o tag correspondiente en el repositorio de GitHub.

En los metadatos del registro npm, axios@1.14.0 muestra "_npmUser": {"name": "GitHub Actions", "email": "npm-oidc-no-reply@github.com", "trustedPublisher": {...}}. axios@1.14.1 muestra "_npmUser": {"name": "jasonsaayman", "email": "ifstap@proton.me"} — sin trustedPublisher, sin gitHead, sin commit correspondiente.

Verificar si estás afectado

Revisa las versiones instaladas:

npm list axios 2>/dev/null | grep -E "1\.14\.1|0\.30\.4"

Busca el directorio del paquete malicioso:

ls node_modules/plain-crypto-js 2>/dev/null && echo "POTENCIALMENTE AFECTADO"

Aunque el package.json fue reemplazado con stub limpio, la presencia del directorio es evidencia suficiente de que el dropper se ejecutó.

Verifica artefactos del RAT en el sistema:

# macOS
ls -la /Library/Caches/com.apple.act.mond 2>/dev/null && echo "COMPROMETIDO"

# Linux
ls -la /tmp/ld.py 2>/dev/null && echo "COMPROMETIDO"

# Windows
dir "%PROGRAMDATA%\wt.exe" 2>nul && echo COMPROMETIDO

Remediación

Si usas 1.x, baja a 1.14.0. Si usas 0.x, baja a 0.30.3. Pínalo explícitamente:

npm install axios@1.14.0

Agrega overrides en package.json para prevenir resolución transitiva a versiones comprometidas:

{
  "overrides": { "axios": "1.14.0" },
  "resolutions": { "axios": "1.14.0" }
}

Elimina plain-crypto-js si existe:

rm -rf node_modules/plain-crypto-js

Si el RAT se ejecutó: trata el sistema como completamente comprometido. No intentes limpiar en lugar — reconstruye desde un estado conocido limpio y rota todas las credenciales: tokens npm, claves AWS/GCP/Azure, SSH private keys, secrets de CI/CD, y cualquier valor en archivos .env accesibles al momento de la instalación.

La lección de diseño: postinstall hooks son una puerta de entrada

Este ataque explota un mecanismo legítimo de npm — los postinstall scripts — para ejecutar código arbitrario en el sistema del desarrollador durante la instalación. No es el primero ni será el último. TeamPCP encadenó cinco ataques similares en PyPI en nueve días usando el mismo vector.

La medida preventiva más directa para CI/CD es usar npm ci --ignore-scripts como política permanente en pipelines automatizados. Eso deshabilita la ejecución de postinstall hooks durante builds automáticos, eliminando el vector de ataque completo para este tipo de supply chain attack. Los certificados de seguridad no cubren este tipo de fallo sistémico — la protección requiere controles técnicos, no selos de cumplimiento.

El ataque a axios es también un caso de estudio sobre la superficie de ataque que crea la confianza implícita en paquetes populares. 300 millones de descargas semanales no significa que el paquete esté auditado continuamente — significa que un ataque exitoso tiene radio de explosión enorme.


Fuentes

Leer más

Otras noticias