Descargó una actualización — borró el servidor: breve resumen de la situación de los usuarios de np

Descargó una actualización — borró el servidor: breve resumen de la situación de los usuarios de np

Cómo el código malicioso se infiltra en los sistemas y por qué casi no puede ser detenido

image

Un ataque a una herramienta popular se convirtió silenciosamente en una reacción en cadena que ahora infecta paquetes en todo el ecosistema npm. El código malicioso no solo se oculta en bibliotecas individuales, sino que además se propaga por sí mismo, usando credenciales robadas de desarrolladores.

Se trata de la campaña CanisterWorm, atribuida al grupo TeamPCP. La historia comenzó con la comprometida utilidad Trivy. En una de las versiones los atacantes integraron un mecanismo de robo de credenciales en la cadena de compilación. Al ejecutarse en el entorno de desarrollo, el código malicioso recopilaba tokens de npm y los enviaba a los atacantes. Luego, usando los tokens robados, se publicaban nuevas versiones de paquetes ya con la puerta trasera incrustada. Así resultaron afectadas decenas de bibliotecas, incluido el espacio de nombres @opengov.

Cada versión infectada funciona igual. Al instalarse vía npm se ejecuta automáticamente un script oculto. Escribe en el sistema de la víctima un módulo malicioso en Python y añade un servicio en systemd que se inicia en cada inicio de sesión y sobrevive los reinicios. Para esto no hacen falta privilegios de administrador, por lo que el usuario no nota nada.

El módulo malicioso se comunica con un servidor de mando y control, que no está alojado en un hosting habitual, sino en la red Internet Computer. Esta elección complica el bloqueo, porque no hay un proveedor o registrador de dominios habitual a través del cual desconectar rápidamente la infraestructura.

La característica principal de CanisterWorm es la capacidad de autorreplicarse. En la máquina infectada se inicia un proceso adicional que busca tokens de npm en archivos de configuración y variables de entorno. Luego el código malicioso determina a qué paquetes tiene acceso, incrementa el número de versión, se injerta y publica las actualizaciones. Cada nuevo desarrollador que instale ese paquete se convierte en el siguiente punto de infección.

Dentro del código malicioso hay otro nivel. La puerta trasera descarga una carga útil adicional desde el servidor de mando. En algunos casos se limita a mantener el acceso al sistema. Pero bajo ciertas condiciones el script se vuelve destructivo. En entornos Kubernetes el código malicioso despliega componentes con privilegios en todos los nodos y elimina el sistema de archivos. En sistemas normales puede ejecutarse un comando de borrado completo de datos.

Incluso si el escenario destructivo no se activa, el problema persiste. La puerta trasera sigue funcionando, mantiene comunicación con el servidor y deja a los atacantes acceso completo.

Las señales de infección se pueden encontrar a nivel del sistema. El módulo malicioso se guarda en el directorio del usuario, aparece un servicio de systemd y los archivos temporales pueden indicar la descarga de cargas adicionales. En los registros de red se pueden notar consultas a un dominio en la red Internet Computer, que se utiliza como centro de mando.

Tras instalar paquetes sospechosos es más seguro asumir que todas las credenciales están comprometidas. Se recomienda cambiar inmediatamente los tokens de npm, las claves de servicios en la nube, las credenciales de registros de contenedores y otros secretos que pudieron estar en el sistema o en el entorno de compilación. También conviene fijar dependencias en las últimas versiones verificadas hasta que los desarrolladores publiquen actualizaciones limpias.

CanisterWorm demuestra cómo una vulnerabilidad en la cadena de suministro se convierte en una epidemia a gran escala. El código malicioso ya no espera a que se instale manualmente. Encuentra nuevos objetivos y se propaga más rápido de lo que los equipos de desarrollo pueden reaccionar.