DEV#POPPER RAT Distribué via des Versions Compromises de Joyfill npm
Detection stack
- AIDR
- Alert
- ETL
- Query
Résumé
Deux versions bêta compromises du @joyfill package npm ont été trouvées contenant un implant JavaScript lors de l’importation. L’implant utilise des transactions blockchain sur Tron, Aptos et BNB Smart Chain pour résoudre et télécharger le cheval de Troie d’accès à distance (RAT) DEV#POPPER. La campagne cible les postes de travail des développeurs et les pipelines CI/CD en exécutant du code malveillant dès que le module affecté est importé.
Enquête
L’équipe de recherche de Socket a découvert la compromission lors de l’analyse des versions bêta de @joyfill/layouts and @joyfill/components. Les chercheurs ont identifié une chaîne de livraison de charge utile en plusieurs étapes combinant du JavaScript obfusqué avec des mécanismes de distribution basés sur la blockchain. L’enquête a lié le chargeur initial à la famille PolinRider et a confirmé que la charge utile finale appartenait à la famille de logiciels malveillants DEV#POPPER.
Atténuation
Les développeurs devraient immédiatement supprimer les @joyfill versions bêta affectées des lockfiles, des caches de packages, des environnements de construction et des artefacts de déploiement. Il est recommandé de verrouiller les dépendances à des versions vérifiées telles que @joyfill/layouts@0.1.1 or @joyfill/components@4.0.0-rc24 . Les équipes de sécurité devraient également bloquer les versions compromises via des proxys de registre et des outils de gouvernance des dépendances.
Réponse
Tout système ayant importé les packages affectés doit être isolé, et toutes les informations d’identification accessibles au processus Node.js compromis doivent être remplacées. Les enquêteurs devraient inspecter les applications de développeurs, y compris VS Code, GitHub Desktop et Discord, pour des modifications inattendues des modules de base. La télémétrie des points de terminaison et CI/CD devrait également être examinée pour des processus Node.js détachés, des adresses C2 connues et un trafic RPC blockchain suspect.
Flux d’Attaque
Détections
Tentative possible d’abus Ethereum Publicnode comme canal C2 (via dns_query)
Voir
Tentatives de communication de domaine de recherche IP possibles (via dns)
Voir
Une capture d’écran Linux possible a été prise (via cmdline)
Voir
Un fichier caché a été créé sur l’hôte Linux (via file_event)
Voir
IOC (HashSha256) à détecter : Deux versions bêta de Joyfill npm compromises pour livrer le cheval de Troie d’accès à distance DEV#POPPER
Voir
IOC (SourceIP) à détecter : Deux versions bêta de Joyfill npm compromises pour livrer le cheval de Troie d’accès à distance DEV#POPPER
Voir
IOCs (DestinationIP) à détecter : Deux versions bêta de Joyfill npm compromises pour livrer le cheval de Troie d’accès à distance DEV#POPPER
Voir
Détection des indicateurs de logiciels malveillants DEV#POPPER [Connexion réseau Windows]
Voir
Détection des packages npm Joyfill compromis délivrant un cheval de Troie d’accès à distance [Événement de fichier Linux]
Voir
Détection d’injection de module Node.js et exécution de processus détaché [Création de processus Linux]
Voir
Exécution de la simulation
Prérequis : Le contrôle pré-vol Télémétrie et Baseline doit avoir réussi.
Rationale : Cette section détaille l’exécution précise de la technique de l’adversaire (TTP) conçue pour déclencher la règle de détection. Les commandes et le récit DOIVENT refléter directement les TTPs identifiés et viser à générer exactement la télémétrie attendue par la logique de détection. Des exemples abstraits ou non pertinents conduiront à un mauvais diagnostic.
-
Narratif & Commandes d’Attaque : L’adversaire a réussi à injecter du code malveillant dans une dépendance npm largement utilisée (Compromission de la chaîne d’approvisionnement). Lorsqu’un développeur exécute
npm installou démarre un projet, le script malveillant s’exécute. Le script tente d’abord de masquer son intention en attribuant la fonctionrequireà une variable globale (global.r = require), lui permettant de charger des modules partout dans l’application sans appelerrequiredirectement (obfuscation). Enfin, il utilisechild_process.spawnpour lancer un processus shell détaché qui se connecte à un serveur de Commande & Contrôle (C2), tentant d’échapper à la détection en découplant le processus malveillant du processus parent Node.js. -
Script de test de régression :
#!/bin/bash # Script de simulation pour déclencher la règle de détection d'injection de Node.js. # Ce script crée un fichier JS malveillant temporaire et l'exécute via Node.js. MALICIOUS_FILE="malicious_pkg.js" echo "[+] Création du script Node.js malveillant..." cat << 'EOF' > $MALICIOUS_FILE // Simuler l'injection de module global (T1027) global.r = require; // Simuler l'exécution de processus détaché via child_process.spawn (T1059.006) const cp = require('child_process'); cp.spawn('bash', ['-c', 'sleep 30 &'], { detached: true, stdio: 'ignore' }); console.log("[!] Charge utile malveillante exécutée."); EOF echo "[+] Exécution du script malveillant via Node.js..." node $MALICIOUS_FILE echo "[+] Simulation terminée. Vérifiez SIEM pour l'alerte : Détection d'injection de module Node.js et exécution de processus détaché." -
Commandes de nettoyage :
# Supprimer le fichier malveillant simulé rm -f malicious_pkg.js # Tuer les processus sleep orphelins lancés par la simulation pkill -f "sleep 30"