Se sospecha que los actores de amenazas detrás del ataque a la cadena de suministro dirigido al popular escáner Trivy están llevando a cabo ataques posteriores que han llevado al compromiso de una gran cantidad de paquetes npm con un gusano autopropagante previamente indocumentado denominado gusano de bote.
El nombre es una referencia al hecho de que el malware utiliza un contenedor ICP, que se refiere a contratos inteligentes a prueba de manipulaciones en la cadena de bloques de Internet Computer, como un solucionador de caídas muertas. El desarrollo marca el primer abuso documentado públicamente de un recipiente ICP con el propósito explícito de recuperar el servidor de comando y control (C2), dijo el investigador de Aikido Security, Charlie Eriksen.
La lista de paquetes afectados se encuentra a continuación:
- 28 paquetes en el ámbito @EmilGroup
- 16 paquetes en el ámbito @opengov
- @teale.io/eslint-config
- @airtm/uuid-base32
- @pypestream/flotante-ui-dom
El desarrollo se produce un día después de que los actores de amenazas aprovecharan una credencial comprometida para publicar versiones maliciosas de trivy, trivy-action y setup-trivy que contenían un ladrón de credenciales. Se sospecha que una operación cibercriminal centrada en la nube conocida como TeamPCP está detrás de los ataques.
La cadena de infección que involucra los paquetes npm implica aprovechar un gancho posterior a la instalación para ejecutar un cargador, que luego coloca una puerta trasera de Python que es responsable de contactar con el contenedor ICP para recuperar una URL que apunta a la carga útil de la siguiente etapa. El hecho de que la infraestructura de dead drop esté descentralizada la hace resiliente y resistente a los esfuerzos de eliminación.
«El controlador del recipiente puede cambiar la URL en cualquier momento, enviando nuevos archivos binarios a todos los hosts infectados sin tocar el implante», dijo Eriksen.
La persistencia se establece mediante un servicio de usuario systemd, que está configurado para iniciar automáticamente la puerta trasera de Python después de un retraso de 5 segundos si se finaliza por algún motivo mediante el uso de la directiva «Restart=always». El servicio systemd se hace pasar por herramientas PostgreSQL («pgmon») en un intento de pasar desapercibido.
La puerta trasera, como se mencionó anteriormente, llama al recipiente ICP con un agente de usuario de navegador falso cada 50 minutos para recuperar la URL en texto sin formato. Posteriormente, la URL se analiza para buscar y ejecutar el ejecutable.
«Si la URL contiene youtube(.)com, el script la omite», explicó Eriksen. «Este es el estado inactivo del contenedor. El atacante arma el implante apuntando el contenedor a un binario real y lo desarma volviendo a un enlace de YouTube. Si el atacante actualiza el contenedor para que apunte a una nueva URL, cada máquina infectada recoge el nuevo binario en su siguiente sondeo. El antiguo binario sigue ejecutándose en segundo plano ya que el script nunca mata los procesos anteriores».
Vale la pena señalar que Wiz también ha detectado un interruptor de apagado similar basado en youtube(.)com en relación con el binario troyanizado Trivy (versión 0.69.4), que llega al mismo recipiente ICP a través de otro cuentagotas de Python («sysmon.py»). Al momento de escribir este artículo, la URL devuelta por el C2 es un video de YouTube de rickroll.
The Hacker News descubrió que el recipiente ICP admite tres métodos: get_latest_link, http_request, update_link; el último de los cuales permite al actor de la amenaza modificar el comportamiento en cualquier momento para servir una carga útil real.
En conjunto, los paquetes vienen con un archivo «deploy.js» que el atacante ejecuta manualmente para distribuir la carga maliciosa a cada paquete al que un token npm robado proporciona acceso de forma programática. El gusano, que se considera codificado por vibración mediante una herramienta de inteligencia artificial (IA), no intenta ocultar su funcionalidad.
«Esto no se activa con la instalación de npm», dijo Aikido. «Es una herramienta independiente que el atacante utiliza con tokens robados para maximizar el radio de explosión».
Para empeorar las cosas, se descubrió que una iteración posterior de CanisterWorm detectada en «@teale.io/eslint-config» versiones 1.8.11 y 1.8.12 se autopropaga sin necesidad de intervención manual.
A diferencia de «deploy.js», que era un script autónomo que el atacante tenía que ejecutar con los tokens npm robados para enviar una versión maliciosa de los paquetes npm al registro, la nueva variante incorpora esta funcionalidad en «index.js» dentro de una función findNpmTokens() que se ejecuta durante la fase posterior a la instalación para recopilar tokens de autenticación npm de la máquina de la víctima.
La principal diferencia aquí es que el script postinstalación, después de instalar la puerta trasera persistente, intenta localizar cada token npm del entorno del desarrollador y genera el gusano inmediatamente con esos tokens iniciando «deploy.js» como un proceso en segundo plano completamente independiente.
Curiosamente, se dice que el actor de amenazas cambió la carga útil de la puerta trasera ICP por una cadena de prueba ficticia («hello123»), probablemente para garantizar que toda la cadena de ataque funcione según lo previsto antes de agregar el malware.
«Este es el punto donde el ataque pasa de ‘la cuenta comprometida publica malware’ a ‘el malware compromete más cuentas y se publica a sí mismo'», dijo Eriksen. «Cada desarrollador o canal de CI que instala este paquete y tiene un token npm accesible se convierte en un vector de propagación involuntario. Sus paquetes se infectan, sus usuarios intermedios los instalan y, si alguno de ellos tiene tokens, el ciclo se repite».
(Esta es una historia en desarrollo. Vuelva a consultarla para obtener más detalles).