Paquetes maliciosos de npm atacan Strapi CMS con backdoors y robo de credenciales
Investigadores de ciberseguridad han descubierto 36 paquetes maliciosos en el registro de npm que se hacen pasar por plugins de **Strapi CMS**. Estos paquetes contienen payloads maliciosos diseñados para explotar bases de datos **Redis** y **PostgreSQL**, desplegar reverse shells, robar credenciales y establecer implantes persistentes.

**SafeDep** informó que, "Cada paquete contiene tres archivos (package.json, index.js, postinstall.js), no tiene descripción, repositorio ni página de inicio, y utiliza la versión 3.6.8 para parecer un plugin maduro de la comunidad de Strapi v3".
### Disfrazados de Plugins Legítimos
Los paquetes maliciosos siguen una convención de nombres que comienza con "strapi-plugin-" seguido de términos como "cron", "database" o "server". Esto tiene la intención de engañar a los desarrolladores para que los descarguen. Es importante notar que los plugins oficiales de Strapi están bajo el scope de "@strapi/".
Estos paquetes fueron subidos por cuatro cuentas títere: "umarbek1233", "kekylf12", "tikeqemif26" y "umar_bektembiev1" durante un período de 13 horas. Los paquetes identificados incluyen:
* strapi-plugin-cron
* strapi-plugin-config
* strapi-plugin-server
* strapi-plugin-database
* strapi-plugin-core
* strapi-plugin-hooks
* strapi-plugin-monitor
* strapi-plugin-events
* strapi-plugin-logger
* strapi-plugin-health
* strapi-plugin-sync
* strapi-plugin-seed
* strapi-plugin-locale
* strapi-plugin-form
* strapi-plugin-notify
* strapi-plugin-api
* strapi-plugin-sitemap-gen
* strapi-plugin-nordica-tools
* strapi-plugin-nordica-sync
* strapi-plugin-nordica-cms
* strapi-plugin-nordica-api
* strapi-plugin-nordica-recon
* strapi-plugin-nordica-stage
* strapi-plugin-nordica-vhost
* strapi-plugin-nordica-deep
* strapi-plugin-nordica-lite
* strapi-plugin-nordica
* strapi-plugin-finseven
* strapi-plugin-hextest
* strapi-plugin-cms-tools
* strapi-plugin-content-sync
* strapi-plugin-debug-tools
* strapi-plugin-health-check
* strapi-plugin-guardarian-ext
* strapi-plugin-advanced-uuid
* strapi-plugin-blurhash
### Ejecución de Código Malicioso
El código malicioso está incrustado dentro del hook de script `postinstall`. Este script se ejecuta automáticamente durante el proceso de "npm install", sin requerir interacción del usuario. Se ejecuta con los privilegios del usuario que lo instala, pudiendo abusar de accesos root en entornos CI/CD y contenedores **Docker**.
### Evolución del Payload
Los payloads evolucionaron a lo largo de la campaña:
1. **Explotación de Redis:** Armamento de instancias Redis accesibles localmente para ejecución remota de código inyectando una entrada de crontab. Esto descarga y ejecuta un script shell desde un servidor remoto, escribiendo un web shell PHP y un reverse shell Node.js vía SSH en el directorio de uploads público de Strapi. También intenta escanear el disco en busca de secretos como **Elasticsearch** y frases de recuperación de billeteras de criptomonedas, y exfiltrar un módulo de API de **Guardarian**.
2. **Escape de Docker y Reverse Shells:** Combinación de la explotación de Redis con el escape de contenedores Docker para escribir payloads de shell en el host. Lanza un reverse shell directo de Python y escribe un disparador de reverse shell en el directorio node_modules de la aplicación a través de Redis.
3. **Despliegue de Reverse Shell:** Despliegue de un reverse shell y escritura de un descargador de shell vía Redis.
4. **Recolección de Credenciales:** Escaneo del sistema en busca de variables de entorno y cadenas de conexión a bases de datos PostgreSQL.
5. **Reconocimiento Ampliado:** Recopilación de volcados de entorno, configuraciones de Strapi, extracción de bases de datos Redis, mapeo de topología de red y secretos de Docker/Kubernetes, claves criptográficas y archivos de billeteras de criptomonedas.
6. **Explotación de PostgreSQL:** Conexión a la base de datos PostgreSQL del objetivo utilizando credenciales hardcodeadas y consulta de tablas específicas de Strapi en busca de secretos. También vuelca patrones relacionados con criptomonedas e intenta conectarse a seis bases de datos de Guardarian.
7. **Implante Persistente:** Despliegue de un implante persistente para mantener acceso remoto a un nombre de host específico ("prod-strapi").
8. **Robo de Credenciales:** Facilitación del robo de credenciales escaneando rutas hardcodeadas y generando un reverse shell persistente.
SafeDep declaró: "Los ocho payloads muestran una narrativa clara: el atacante comenzó agresivamente (RCE de Redis, escape de Docker), encontró que esos enfoques no funcionaban, cambió a reconocimiento y recolección de datos, usó credenciales hardcodeadas para acceso directo a la base de datos, y finalmente se conformó con acceso persistente con robo de credenciales dirigido".
### ¿Ataque Dirigido?
La naturaleza de los payloads, el enfoque en activos digitales y el uso de credenciales de base de datos hardcodeadas y nombres de host sugieren un ataque dirigido contra una plataforma de criptomonedas. Los usuarios que hayan instalado alguno de los paquetes listados deben asumir un compromiso y rotar todas las credenciales.
### Ataques Recientes a la Cadena de Suministro
Este descubrimiento coincide con un aumento en los ataques a la cadena de suministro dirigidos al ecosistema de código abierto:
* Una cuenta de **GitHub** llamada "ezmtebo" envió más de 256 pull requests que contenían un payload de exfiltración de credenciales, robando secretos a través de logs de CI y comentarios de PR.
* La organización de GitHub "dev-protocol" fue secuestrada para distribuir bots de trading de **Polymarket** maliciosos con dependencias de npm typosquatted que roban claves privadas de billeteras y abren un backdoor SSH.
* El paquete de **Emacs** "kubernetes-el/kubernetes-el" fue comprometido, explotando la vulnerabilidad Pwn Request en su flujo de trabajo de GitHub Actions para robar el GITHUB_TOKEN del repositorio e inyectar código destructivo.
* El flujo de trabajo de GitHub Actions "xygeni/xygeni-action" fue comprometido utilizando credenciales de mantenedor robadas para plantar un backdoor de reverse shell. **Xygeni** ha implementado desde entonces nuevos controles de seguridad.
* El paquete npm "mgc" fue comprometido a través de la toma de control de cuenta para enviar versiones maliciosas que contenían un script dropper que descarga payloads específicos de plataforma: un troyano de Python para Linux y una variante de PowerShell para Windows. Este ataque comparte solapamiento con el reciente ataque a la cadena de suministro dirigido a **Axios**, atribuido a **UNC1069**.
* Un paquete npm malicioso llamado "express-session-js" hace typosquatting de "express-session" y contiene un dropper que recupera un troyano de acceso remoto (RAT).
* El paquete de **PyPI** "bittensor-wallet" (versión 4.0.2) fue comprometido para desplegar un backdoor que exfiltra claves de billetera.
* Un paquete npm malicioso llamado "@azure/service-bus-node" contiene un dropper que recupera un RAT de JSON Keeper para realizar robo de datos y acceso persistente conectándose a "216.126.237[.]71" utilizando la biblioteca Socket.IO.