Logiciel malveillant GlassWorm
Une nouvelle vague de la campagne de logiciels malveillants GlassWorm cible activement les chaînes d'approvisionnement logicielles en exploitant des jetons GitHub volés pour injecter du code malveillant dans des centaines de dépôts. Cette opération vise principalement les projets basés sur Python, notamment les applications Django, le code de recherche en apprentissage automatique, les tableaux de bord Streamlit et les packages PyPI.
Le vecteur d'attaque est d'une simplicité trompeuse, mais d'une redoutable efficacité : un logiciel malveillant dissimulé est ajouté à des fichiers fréquemment exécutés tels que setup.py, main.py et app.py. Tout développeur qui installe des dépendances via pip install ou exécute du code cloné depuis un dépôt compromis active, à son insu, la charge utile malveillante.
Table des matières
Prise de contrôle silencieuse de dépôts : la technique ForceMemo
Cette évolution de la campagne, désormais appelée ForceMemo, introduit une méthode furtive de compromission des dépôts. Les acteurs malveillants accèdent aux comptes développeurs et manipulent les dépôts sans laisser de traces conventionnelles.
En remplaçant des commits légitimes par du code malveillant et en les forçant à être intégrés à la branche par défaut, les attaquants préservent les métadonnées originales des commits, notamment le message, l'auteur et l'horodatage, masquant ainsi efficacement l'intrusion. Cette approche élimine les indicateurs visibles tels que les demandes de fusion ou les historiques de commits suspects, rendant la détection beaucoup plus difficile.
Chaîne d’exécution d’une attaque : du vol d’identifiants à la livraison de la charge utile
La campagne ForceMemo suit un processus d'intrusion structuré et en plusieurs étapes :
- Les environnements de développement sont initialement compromis par des extensions malveillantes de Visual Studio Code et de curseur transportant des composants GlassWorm conçus pour collecter des informations d'identification sensibles, notamment les jetons GitHub.
- Les identifiants volés sont ensuite utilisés pour injecter des charges utiles obfusquées encodées en Base64 dans des fichiers Python sur tous les dépôts associés au compte compromis.
- Le logiciel malveillant intégré effectue des vérifications de l'environnement, notamment en évitant son exécution sur les systèmes configurés en russe. Il interroge ensuite un portefeuille blockchain Solana pour récupérer dynamiquement l'URL de livraison de la charge utile.
- Des charges utiles supplémentaires sont téléchargées, notamment du code JavaScript chiffré conçu pour le vol de cryptomonnaies et l'exfiltration de données.
Commandement et contrôle basés sur la blockchain : une infrastructure résiliente
Cette campagne se caractérise notamment par son utilisation de la blockchain Solana comme mécanisme de commande et de contrôle (C2). Au lieu de serveurs traditionnels, les attaquants stockent les URL des charges utiles dans les champs de mémo des transactions, liés à des adresses de portefeuilles spécifiques.
L'analyse révèle que l'activité liée au portefeuille principal a débuté dès le 27 novembre 2025, soit plusieurs mois avant la détection des compromissions du dépôt. Ce portefeuille a traité des dizaines de transactions, et l'emplacement des données a été fréquemment mis à jour, parfois plusieurs fois par jour. Cette approche décentralisée renforce la résilience et complique les efforts de démantèlement.
Élargissement de la surface d’attaque : npm et les infections inter-écosystèmes
La campagne s'est étendue au-delà des écosystèmes Python pour toucher les chaînes d'approvisionnement JavaScript. Deux packages npm React Native, react-native-international-phone-number (version 0.11.8) et react-native-country-select (version 0.3.91), ont été temporairement compromis et distribués avec des logiciels malveillants intégrés.
Ces versions malveillantes introduisent des points d'entrée avant installation exécutant du JavaScript obscurci, initiant ainsi une chaîne d'infection similaire. Le logiciel malveillant évite toujours les systèmes russes, récupère les instructions de la charge utile via un portefeuille Solana et déploie des menaces spécifiques à chaque plateforme.
L'exécution se déroule entièrement en mémoire grâce à des techniques d'exécution telles que `eval()` ou le sandboxing de Node.js, minimisant ainsi les traces numériques. De plus, un mécanisme de persistance empêche toute réinfection pendant 48 heures en stockant un horodatage local.
Tactiques avancées d’évasion et de distribution
Les versions récentes de GlassWorm témoignent d'une sophistication accrue en matière de diffusion et de dissimulation. En exploitant les mécanismes extensionPack et extensionDependencies, les attaquants distribuent des charges utiles malveillantes de manière transitive à travers des écosystèmes d'extensions de confiance.
Des campagnes précédentes, attribuées au même acteur malveillant, ont compromis plus de 151 dépôts GitHub en utilisant des caractères Unicode invisibles pour dissimuler du code malveillant. Malgré des stratégies d'obfuscation et de diffusion variées, toutes ces campagnes reposent systématiquement sur la même infrastructure basée sur Solana, confirmant ainsi un cadre opérationnel unifié.
Extensions IDE malveillantes : ciblage des environnements de développement
La campagne a également infiltré des outils de développement via une extension malveillante identifiée comme reditorsupporter.r-vscode-2.8.8-universal, ciblant l'IDE Windsurf. Déguisée en plugin de support du langage R, elle déploie un voleur d'informations basé sur Node.js.
Une fois installée, l'extension récupère les données chiffrées des transactions blockchain, les exécute en mémoire et déploie des composants compilés pour extraire les données sensibles des navigateurs basés sur Chromium. Sa persistance est assurée par des tâches planifiées et des modifications du Registre Windows, garantissant ainsi son exécution au démarrage du système.
Ce logiciel malveillant cible spécifiquement les environnements de développement tout en excluant les systèmes russes, reproduisant ainsi un comportement observé dans d'autres variantes de GlassWorm.
Indicateurs d’échelle et d’impact
L'analyse de sécurité indique que la campagne a compromis une part importante de l'écosystème open source, affectant plus de 433 projets sur plusieurs plateformes. Parmi ceux-ci figurent des dépôts GitHub (Python et JavaScript), des extensions VS Code et des bibliothèques npm.
Tous les vecteurs d'infection convergent finalement vers le déploiement d'un voleur d'informations basé sur JavaScript, ce qui met en évidence un objectif final constant : la collecte d'identifiants et l'exfiltration de données.
- Plus de 433 projets et paquets compromis confirmés
- Plusieurs vecteurs de distribution, notamment GitHub, npm et les extensions IDE
- Utilisation systématique de l'infrastructure blockchain Solana pour la livraison de la charge utile
- Exclusion systématique des systèmes russes dans toutes les variantes
Évaluation stratégique : Une nouvelle ère d’attaques sur la chaîne d’approvisionnement
La campagne ForceMemo représente une escalade significative des menaces pesant sur la chaîne d'approvisionnement logicielle. Son association de manipulation furtive de l'historique Git, d'une infrastructure C2 basée sur la blockchain et de vecteurs d'infection multiplateformes témoigne d'un haut niveau de maturité opérationnelle.
La réutilisation des infrastructures, conjuguée à l'évolution des mécanismes de diffusion, révèle un adversaire adaptatif capable d'intensifier ses attaques tout en assurant sa persistance et son évasion. Ce passage de compromissions isolées à des intrusions coordonnées et multi-écosystèmes souligne le risque croissant auquel sont confrontés les environnements de développement modernes et les communautés open source.