Hola, mundo... y adiós al sueldo: un solo comando en la consola puede dejar a un desarrollador sin acceso alguno.

Hola, mundo... y adiós al sueldo: un solo comando en la consola puede dejar a un desarrollador sin acceso alguno.

Los hackers pensaron que, si añadían una palabra rimbombante al nombre de dominio, nadie se daría cuenta.

image

La campaña PhantomRaven, dirigida a desarrolladores a través del catálogo npm, ha continuado. Los expertos detectaron otras tres oleadas de ataques, durante las cuales el atacante publicó decenas de paquetes maliciosos. La mayor parte de esos paquetes sigue disponible en el catálogo y puede integrarse en proyectos de desarrolladores.

La empresa Endor Labs identificó 88 nuevos paquetes maliciosos publicados entre noviembre de 2025 y febrero de 2026. La campaña sigue activa: 81 paquetes siguen disponibles en npm, y dos de los tres servidores de control siguen operativos.

PhantomRaven supone un ataque a la cadena de suministro de software. El atacante emplea la técnica Remote Dynamic Dependencies. Esta técnica permite ocultar código malicioso fuera del propio paquete. El paquete publicado en npm parece inofensivo y contiene un script simple "Hello, world!". Sin embargo, en el archivo package.json se indica una dependencia no desde el catálogo npm, sino por una URL directa. Durante una instalación normal, npm descarga automáticamente el archivo desde el servidor del atacante y ejecuta el código.

La primera oleada de PhantomRaven se hizo pública en otoño de 2025. Entonces se detectaron más de 126 paquetes maliciosos, que llegaron a descargarse más de 86.000 veces. Más tarde se supo que el número total de paquetes en esa oleada superaba los 200.

Las nuevas fases de la campaña recibieron nombres convencionales Wave-2, Wave-3 y Wave-4. En esas fases el atacante publicó paquetes mediante decenas de cuentas de un solo uso. Para las publicaciones se usaron más de 50 cuentas de npm registradas con diferentes direcciones de correo electrónico. Al mismo tiempo, la infraestructura cambiaba constantemente: se registraban nuevos dominios, cambiaban los nombres de las dependencias y las descripciones de los paquetes. A pesar de esos cambios, el código malicioso permanecía casi sin cambios.

El mecanismo de infección parece bastante sencillo. El desarrollador ejecuta el comando npm install e instala el paquete. npm lee el archivo package.json y detecta una dependencia que apunta a una dirección HTTP del servidor del atacante. El gestor de paquetes descarga el archivo directamente desde ese servidor y ejecuta el script preinstall. Tras la ejecución, el código malicioso recopila información del sistema.

El script extrae las direcciones de correo electrónico del desarrollador desde varias fuentes, incluidos el archivo .gitconfig, la configuración de npm y las variables de entorno. El código también busca tokens de servicios de integración y entrega continuas, por ejemplo GitHub, GitLab, Jenkins y CircleCI. Además se recopila información del sistema: dirección IP, nombre del equipo, versión de Node.js y del sistema operativo.

Todos los datos recopilados se envían al servidor de control del atacante. La transferencia se realiza de varias maneras: mediante solicitudes HTTP GET y POST, así como a través de una conexión WebSocket. Este enfoque aumenta la probabilidad de que los datos se transmitan con éxito incluso cuando se filtra el tráfico de red.

La infraestructura de PhantomRaven muestra un patrón bastante estable. Todos los dominios de los servidores de control se registraron a través de Amazon Registrar y se alojaron en servidores de AWS. En los nombres de dominio aparece con frecuencia la palabra "artifact" para dar la impresión de un servidor ordinario de almacenamiento de paquetes. La comunicación con los servidores se realizaba únicamente por HTTP sin cifrado.

El código de la carga maliciosa apenas cambió durante toda la campaña. Los expertos compararon las versiones de distintas oleadas y encontraron que 257 de 259 líneas coinciden por completo. La única diferencia es la dirección del servidor de control al que se envían los datos.

Otra característica de la campaña es la suplantación de nombres de paquetes populares. El atacante publicaba paquetes con nombres similares a librerías y extensiones legítimas. En algunos casos imitaba complementos de Babel o ESLint, en otros paquetes de GraphQL Codegen. Esta técnica aumenta la probabilidad de que un desarrollador instale por error un paquete malicioso.

Tras la publicación del informe, la situación respecto a algunos paquetes comenzó a cambiar. Por ejemplo, uno de los dominios usados en la segunda oleada ahora sirve un script inofensivo de pocas líneas. Sin embargo, ese reemplazo de código solo subraya el riesgo de las dependencias por URL. El autor del paquete puede cambiar el contenido en el servidor en cualquier momento sin publicar una nueva versión del paquete en npm.

Al principio se barajó la hipótesis de que los paquetes podrían haberse creado como parte de un experimento de seguridad. Sin embargo, el comportamiento del código y los métodos de recopilación de datos indican un software malicioso real. Los paquetes reunían mucha más información de la necesaria para una simple señal de instalación y no informaban a los usuarios sobre ningún experimento.

La historia de PhantomRaven muestra la vulnerabilidad del ecosistema del software de código abierto. Los paquetes pueden parecer inofensivos y pasar las verificaciones porque el código malicioso está fuera del propio paquete. Para detectar este tipo de ataques hay que analizar no solo el contenido de los paquetes, sino también las dependencias externas y la infraestructura con la que interactúa el gestor de paquetes.