Ataque a NPM: El mayor incidente de la historia del ecosistema JavaScript

El 8 de septiembre de 2025 se registró uno de los ataques más serios en la historia de npm, el mayor repositorio de paquetes de JavaScript. El incidente expuso la fragilidad de la cadena de suministro de software y encendió todas las alarmas en la comunidad de desarrollo.

¿Cómo ocurrió el ataque?

El ataque comenzó con un correo de phishing dirigido a Josh Junon, conocido desarrollador y dueño del perfil Qix, responsable de mantener librerías populares en npm. El atacante logró acceder a sus credenciales y publicó versiones maliciosas de al menos 18 paquetes muy populares.

Las versiones comprometidas estuvieron disponibles por alrededor de dos horas (de 9 AM a 11 AM EST) antes de ser detectadas y eliminadas.

El propio Josh Junon confirmó en Bluesky que había sido víctima de un ataque de phishing.

Información detallada en
https://bsky.app/profile/bad-at-computer.bsky.social/post/3lydioq5swk2y

El correo Malicioso

El correo malicioso lo redirigía a un dominio falso, que solo tenía de diferente el .help por el .com, que fue adquirida en porkbun:

https://npmjs.help

Este dominio, según registros WHOIS, fue creado hace muy pocos días, lo que refuerza que fue creado específicamente para este ataque.
El portal copiaba la apariencia del login oficial de npm, engañando al mantenedor para robar sus credenciales.

Con esas credenciales, el atacante logró publicar versiones maliciosas de 18 paquetes muy usados (entre ellos chalk, debug, ansi-styles, entre otros).

¿Qué hacía el código malicioso?

El código malicioso tenía como objetivo interceptar transacciones de criptomonedas, alterando las direcciones de destino en los navegadores para redirigir fondos a cuentas controladas por los atacantes.

Afortunadamente, debido a errores de implementación, el impacto real fue limitado: se estima que el atacante solo logró robar alrededor de 505 dólares, a pesar de que los paquetes comprometidos tienen más de 2 mil millones de descargas semanales.

Respuesta rápida de la comunidad

La empresa Aikido Security fue clave en la detección y mitigación del ataque. Su sistema automatizado identificó las versiones maliciosas y alertó en menos de dos horas, permitiendo que fueran eliminadas rápidamente del registro npm.

Este tiempo de respuesta evitó lo que pudo haber sido un daño masivo a la cadena de suministro de software.

Librerías comprometidas y sus funcionalidades

EnSegún Aikido, estas fueron las 18 librerías afectadas, cada una muy utilizada en el ecosistema JavaScript:

  • ansi-styles — genera estilos como negrita, cursiva, subrayado usando códigos ANSI.
  • backslash — maneja caracteres de escape tipo backslash.
  • chalktemplate — permite el uso de templates de texto con colores en la terminal.
  • supportshyperlinks — detecta si la terminal soporta enlaces dinámicos.
  • has-ansi — identifica si una cadena contiene códigos ANSI.
  • simple-swizzle — unifica argumentos múltiples en un array plano.
  • color-string — convierte colores entre formatos como RGB, HEX, HSL.
  • errorex — mejora el manejo de errores enriqueciendo mensajes.
  • colorname — proporciona nombres de colores con sus correspondientes valores RGB.
  • isarrayish — detecta si algo se comporta como un array.
  • sliceansi — recorta strings que contienen códigos ANSI sin romper los estilos.
  • colorconvert — convierte entre diferentes modelos de color.
  • wrapansi — ajusta texto con códigos ANSI respetando su formato.
  • ansiregex — expresiones regulares para detectar códigos ANSI en strings.
  • supportscolor — detecta si la terminal puede mostrar colores.
  • stripansi — elimina los códigos ANSI de una cadena.
  • chalk — añade colores y estilos al texto en la terminal, muy usado en CLI.
  • debug — facilita logs de depuración mediante namespaces configurables.

Consecuencias del ataque

Aunque el daño económico directo fue mínimo, el ataque expuso la vulnerabilidad del ecosistema npm frente a un simple phishing. Si el código hubiera funcionado sin errores, las pérdidas hubieran sido millonarias.

El incidente también mostró cómo un solo mantenedor, como Josh Junon, puede convertirse en un punto crítico de fallo para todo el ecosistema.

Este ataque dejó varias lecciones claras:

  1. Phishing sigue siendo la técnica más efectiva incluso contra desarrolladores expertos.
  2. La creación de subdominios falsos recientes debe ser un indicador de alerta.
  3. Automatizar la seguridad (como lo hizo Aikido) puede marcar la diferencia entre un incidente menor y un desastre global.
  4. La cadena de suministro de software sigue siendo un eslabón débil que necesita vigilancia constante.

Recomendaciones para desarrolladores

  1. Revisa y actualiza dependencias: asegúrate de no estar utilizando versiones comprometidas de los paquetes afectados.
  2. Habilita 2FA en npm para proteger cuentas de mantenedores.
  3. Monitorea tus pipelines de CI/CD para detectar comportamientos anómalos.
  4. Usa herramientas de seguridad como Semgrep o Aikido, que ya ofrecen reglas para identificar estas versiones maliciosas.
  5. Sé cauteloso con correos sospechosos, incluso si parecen provenir de npm o GitHub.

Conclusión

El ataque del 8 de septiembre de 2025 será recordado como un punto de inflexión en la seguridad de la cadena de suministro de JavaScript. La rapidez de la comunidad evitó un desastre mayor, pero la lección es clara: la seguridad de millones de aplicaciones depende de unos pocos mantenedores y de nuestra vigilancia constante.

Herramienta de validación

Para apoyar a la comunidad, hemos desarrollado una herramienta en línea que te permite validar si tu proyecto tiene alguno de los paquetes comprometidos en este ataque.

👉 Visítala aquí: scanner.automatico.pe

Solo tienes que subir tu package.json o package-lock.json y el sistema revisará automáticamente si utilizas versiones vulnerables.

Comparte la publicación

Deja un comentario

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