Un paquet npm populaire, node-ipc, a été compromis par des pirates et des versions malveillantes intégrant un malware pour voler des identifiants ont été publiées. À l’origine de cette compromission de type supply chain, un nom de domaine expiré que les attaquants ont réussi à enregistrer pour détourner le compte d'un mainteneur. Ce n’est pas la première fois que des attaquants parviennent à ajouter un logiciel malveillant dans le paquet node-ipc. En mars 2022, à la suite de l'invasion de l'Ukraine par la Russie, le créateur du projet a intentionnellement ajouté du code malveillant au programme afin d'effacer les fichiers sur les systèmes ayant des adresses IP russes ou biélorusses. Node-ipc est un module Node.js qui implémente la prise en charge multi-plateformes de la communication entre processus exécutés en local. Le module sert notamment à implémenter des réseaux neuronaux multiprocessus complexes en JavaScript, mais il est également utilisé comme dépendance pour 424 autres projets. Il est téléchargé environ 700 000 fois par semaine.
Jeudi dernier, des pirates ont ainsi réussi à publier trois versions infectées par un trojan sur trois branches différentes du projet, à savoir 9.1.6, 9.2.3 et 12.0.1. Toutes ces versions contenaient une charge utile de 80 Ko, dissimulée dans le fichier node-ipc.cjs, en vue de voler des identifiants. Le code malveillant recherche et vole divers identifiants pour les outils CI/CD, les services et infrastructures cloud, Kubernetes, SSH et les agents de codage IA. Les données sont exfiltrées via des requêtes DNS TXT plutôt que par le biais de connexions HTTP. Étant donné que node-ipc est une dépendance pour des centaines d'autres paquets, qui peuvent eux-mêmes être des dépendances pour encore plus de paquets, cette attaque pourrait avoir un rayon d'action très large. Les utilisateurs doivent immédiatement analyser leurs systèmes pour déterminer s'ils ont installé l'une des versions compromises et, si c'est le cas, considérer le système ainsi que tout jeton d'accès, variable d'environnement et clé API stockés sur celle-ci, comme compromis.
Collecte exhaustive d’identifiants et exfiltration furtive
La charge utile malveillante est déchiffrée et exécutée chaque fois que d’autres applications chargent le paquet via require(‘node-ipc’). Les versions trojanisées ont été conçues pour rester pleinement fonctionnelles pour éviter une détection immédiate, ce qui, combiné à d’autres choix opérés par les attaquants, tels que l’exfiltration de données via DNS TXT, suggère que la furtivité était une priorité absolue. Une fois exécuté, le code compromis collecte des informations sur le système hôte, notamment la version du système d’exploitation, le nom d’hôte et les variables d’environnement. Il commence ensuite à rechercher des identifiants à divers emplacements en fonction du système d’exploitation détecté. « La charge utile fait le choix entre des listes de cibles décodées distinctes pour macOS et pour les plateformes Linux/par défaut », ont indiqué les chercheurs de Socket dans leur analyse. « Ces listes ne sont pas identiques. Dans la charge utile analysée, la liste macOS contient 113 modèles et la liste Linux/par défaut en contient 127. »
Les listes de cibles sont les suivantes :
- Fichiers de configuration pour AWS, Azure, GCP, OCI, DigitalOcean, Scaleway, Hetzner, Fly, Vercel, Railway, Alibaba Cloud, IBM Cloud, Linode, MinIO, Snowflake, Doppler et Salesforce ;
- Clés SSH et des configurations SSH ;
- Eléments relatifs à Kubernetes, Docker, Helm, Rancher et aux comptes de service ;
- Identifiants npm : Yarn, Netrc, Git, GitHub CLI, GitLab CLI et Hub ;
- Identifiants Terraform et des fichiers tfvars ;
- Fichiers .env, .env.local, .env.production, des fichiers de configuration de bases de données, des historiques de shell et des historiques CLI de bases de données ;
- Fichiers de base de données du trousseau macOS Keychain ;
- Clés de profil Firefox sur macOS ;
- Trousseaux Linux et des fichiers KWallet ;
- Profils de connexion FileZilla, Remmina, OpenVPN et associés ;
- Stockage local Microsoft Teams et les chemins d’accès IndexedDB.
Même si les magasins d'identifiants des navigateurs ne sont pas directement ciblés, les bases de données du trousseau de macOS peuvent contenir des identifiants système et de navigateur. Il faut donc également considérer ces identifiants comme compromis et les remplacer. Toutes les données collectées sont archivées dans un fichier GZIP, qui est ensuite fragmenté en blocs et exfiltré via des requêtes DNS TXT adressées à un domaine contrôlé par les attaquants, dont le nom est similaire à celui du domaine légitime Azure Static Web Apps de Microsoft. Comme les attaquants contrôlent le serveur DNS de leur nom de domaine, ils peuvent voir les requêtes d'enregistrements TXT effectuées par les systèmes infectés et reconstituer les archives de leur côté à partir des octets divulgués. Les chercheurs de Socket estiment qu'un fichier de 500 Ko nécessiterait environ 29 400 requêtes TXT pour être exfiltré de cette manière. « La charge utile n'établit pas de persistance dans l'échantillon décodé », ont déclaré les chercheurs. « Aucune installation de cron, launchd, rc.d ou de service, ni aucun téléchargement de deuxième phase n'a été observé. L'impact opérationnel se concentre sur la fenêtre d'exécution : collecte, création d'archives, exfiltration DNS TXT et tentative de nettoyage. »
Des pirates à l’affût
Les versions malveillantes de node-ipc ont été publiées à partir d’un compte npm appelé atiertant, détenu pour l’un des nombreux développeurs disposant d’un accès de mainteneur au paquet. Atiertant n’avait jamais utilisé son accès pour publier de nouvelles versions de node-ipc auparavant, et n’a eu aucune activité sur node-ipc ou tout autre paquet npm auquel il a accès depuis 2022. Des chercheurs en sécurité ont remarqué que l'adresse de courriel du compte d'atiertant était hébergée sur un domaine appelé atlantis-software.net, dont l'enregistrement avait expiré en janvier 2025 et qui avait été réenregistré au début du mois, très probablement par les pirates. Il ne restait alors plus qu'à configurer un serveur de messagerie, à recréer l'adresse de courriel d'atiertant et à réinitialiser le mot de passe du compte. Cet évènement met en évidence certains des défis de sécurité auxquels sont confrontés les projets de logiciels open source.
Même si la révision périodique des listes d'accès pour les comptes inactifs et inutilisés fait partie des recommandations de sécurité générale pour les entreprises, les projets open source sont gérés par des groupes de bénévoles. Et il n'est pas rare que les contributeurs s'absentent pendant de longues périodes, en particulier si ces projets ont atteint un haut niveau de maturité et d'exhaustivité des fonctionnalités, de sorte qu'ils ne font plus l'objet de mises à jour fréquentes. Il est également probable que les attaquants n’ont pas ciblé node-ipc dès le départ, mais qu’ils ont simplement recherché sur npm des comptes dont les adresses de courriel utilisaient des noms de domaine personnalisés, puis vérifié si certains de ces noms de domaine avaient expiré. Il pourrait y avoir d’autres comptes inactifs susceptibles de faire l’objet d’une prise de contrôle par courriel à l’aide de la même méthode. Le rapport de Socket.dev contient des recommandations supplémentaires pour les utilisateurs et les développeurs, ainsi que des hachages de fichiers et d'autres indicateurs de compromission que les équipes de sécurité peuvent utiliser pour mettre en place des détections.
Cela fait des années que les paquets npm sont la cible de pirates. En juillet dernier, une autre attaque supply chain avait été menée sur des comptes de gestionnaires de paquets npm Javascript pour déployer des malwares et installer des backdoors. Dernièrement - moins grave mais tout de même problématique -, après le vol d''un token d'authentification, un paquet npm poussé dans l'interface en ligne de commande Cline contenait un installeur de l'agent OpenClaw.

Commentaire