Des paquets npm malveillants ciblant Strapi CMS déploient des backdoors et récoltent des identifiants
Des chercheurs en cybersécurité ont découvert 36 paquets malveillants dans le registre npm se faisant passer pour des plugins **Strapi CMS**. Ces paquets contiennent des charges utiles malveillantes conçues pour exploiter les bases de données **Redis** et **PostgreSQL**, déployer des shells inversés, récolter des identifiants et établir des implants persistants.

**SafeDep** a rapporté que "chaque paquet contient trois fichiers (package.json, index.js, postinstall.js), n'a pas de description, de dépôt ou de page d'accueil, et utilise la version 3.6.8 pour apparaître comme un plugin communautaire Strapi v3 mature."
### Déguisés en Plugins Légitimes
Les paquets malveillants suivent une convention de nommage commençant par "strapi-plugin-" suivi de termes tels que "cron", "database" ou "server". Ceci est destiné à tromper les développeurs pour qu'ils les téléchargent. Il est important de noter que les plugins Strapi officiels sont sous le scope "@strapi/".
Ces paquets ont été téléchargés par quatre comptes "sock puppet" : "umarbek1233", "kekylf12", "tikeqemif26" et "umar_bektembiev1" sur une période de 13 heures. Les paquets identifiés comprennent :
* 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
### Exécution de Code Malveillant
Le code malveillant est intégré dans le hook de script `postinstall`. Ce script s'exécute automatiquement lors du processus "npm install", sans nécessiter d'interaction utilisateur. Il s'exécute avec les privilèges de l'utilisateur qui l'installe, abusant potentiellement de l'accès root dans les environnements CI/CD et les conteneurs **Docker**.
### Évolution des Charges Utiles
Les charges utiles ont évolué tout au long de la campagne :
1. **Exploitation Redis :** Armement d'instances Redis accessibles localement pour l'exécution de code à distance en injectant une entrée crontab. Ceci télécharge et exécute un script shell depuis un serveur distant, écrivant un shell web PHP et un shell inversé Node.js via SSH dans le répertoire de téléchargements public de Strapi. Il tente également de scanner le disque à la recherche de secrets tels qu'**Elasticsearch** et des phrases de récupération de portefeuilles de cryptomonnaies, et d'exfiltrer un module API **Guardarian**.
2. **Évasion de Docker et Shells Inversés :** Combinaison de l'exploitation Redis avec l'évasion de conteneurs Docker pour écrire des charges utiles shell sur l'hôte. Il lance un shell inversé Python direct et écrit un déclencheur de shell inversé dans le répertoire node_modules de l'application via Redis.
3. **Déploiement de Shell Inversé :** Déploiement d'un shell inversé et écriture d'un téléchargeur de shell via Redis.
4. **Récolte d'Identifiants :** Scan du système à la recherche de variables d'environnement et de chaînes de connexion à la base de données PostgreSQL.
5. **Reconnaissance Étendue :** Collecte de dumps d'environnement, de configurations Strapi, d'extraction de bases de données Redis, de cartographie de la topologie réseau, et de secrets Docker/Kubernetes, de clés cryptographiques et de fichiers de portefeuilles de cryptomonnaies.
6. **Exploitation PostgreSQL :** Connexion à la base de données PostgreSQL de la cible en utilisant des identifiants codés en dur et interrogeant des tables spécifiques à Strapi pour y trouver des secrets. Il effectue également des dumps de motifs liés aux cryptomonnaies et tente de se connecter à six bases de données Guardarian.
7. **Implant Persistant :** Déploiement d'un implant persistant pour maintenir un accès à distance à un nom d'hôte spécifique ("prod-strapi").
8. **Vol d'Identifiants :** Facilitation du vol d'identifiants en scannant des chemins codés en dur et en générant un shell inversé persistant.
SafeDep a déclaré : "Les huit charges utiles montrent un récit clair : l'attaquant a commencé agressivement (RCE Redis, évasion Docker), a constaté que ces approches ne fonctionnaient pas, s'est tourné vers la reconnaissance et la collecte de données, a utilisé des identifiants codés en dur pour un accès direct à la base de données, et a finalement opté pour un accès persistant avec un vol d'identifiants ciblé."
### Attaque Ciblée ?
La nature des charges utiles, l'accent mis sur les actifs numériques et l'utilisation d'identifiants de base de données et de noms d'hôtes codés en dur suggèrent une attaque ciblée contre une plateforme de cryptomonnaies. Les utilisateurs qui ont installé l'un des paquets listés doivent supposer une compromission et faire pivoter tous leurs identifiants.
### Attaques Récentes de la Chaîne d'Approvisionnement
Cette découverte coïncide avec une vague d'attaques de la chaîne d'approvisionnement ciblant l'écosystème open-source :
* Un compte **GitHub** nommé "ezmtebo" a soumis plus de 256 pull requests contenant une charge utile d'exfiltration d'identifiants, volant des secrets via les logs CI et les commentaires de PR.
* L'organisation GitHub "dev-protocol" a été détournée pour distribuer des bots de trading **Polymarket** malveillants avec des dépendances npm typosquattées qui volent les clés privées de portefeuille et ouvrent une backdoor SSH.
* Le paquet **Emacs** "kubernetes-el/kubernetes-el" a été compromis, exploitant la vulnérabilité Pwn Request dans son workflow GitHub Actions pour voler le GITHUB_TOKEN du dépôt et injecter du code destructeur.
* Le workflow GitHub Actions "xygeni/xygeni-action" a été compromis à l'aide d'identifiants de mainteneur volés pour implanter une backdoor de shell inversé. **Xygeni** a depuis mis en œuvre de nouveaux contrôles de sécurité.
* Le paquet npm "mgc" a été compromis via une prise de contrôle de compte pour pousser des versions malveillantes contenant un script dropper qui récupère des charges utiles spécifiques à la plateforme – un trojan Python pour Linux et une variante PowerShell pour Windows. Cette attaque partage des points communs avec la récente attaque de la chaîne d'approvisionnement ciblant **Axios**, attribuée à **UNC1069**.
* Un paquet npm malveillant nommé "express-session-js" typosquatte "express-session" et contient un dropper qui récupère un RAT (Remote Access Trojan).
* Le paquet **PyPI** "bittensor-wallet" (version 4.0.2) a été compromis pour déployer une backdoor qui exfiltre les clés de portefeuille.
* Un paquet npm malveillant nommé "@azure/service-bus-node" contient un dropper qui récupère un RAT depuis JSON Keeper pour effectuer du vol de données et un accès persistant en se connectant à "216.126.237[.]71" en utilisant la bibliothèque Socket.IO.