Plus de 170 000 utilisateurs touchés par une attaque malveillante utilisant une fausse infrastructure Python

Par :
Tal Folkman, Yehuda Gelb, Jossef Harush Kadouri, Tzachi Zornshtain

mar, 09/04/2024 - 11:02

L'équipe de recherche de Checkmarx a récemment découvert une campagne d'attaques ciblant la chaîne d'approvisionnement logicielle et notamment l'organisation GitHub Top.gg (une communauté de plus de 170 000 utilisateurs) ainsi que plusieurs développeurs individuels. Les pirates ont utilisé plusieurs TTP (Tactiques, Techniques et Procédures), notamment la prise de contrôle de comptes via des cookies de navigateur volés, du code malveillant avec des commits vérifiés, un miroir Python personnalisé et des packages malveillants publiés dans le registre PyPi.

Points clés

  1. Plusieurs TTP ont été combinées pour lancer une attaque silencieuse ciblant la chaîne d'approvisionnement logicielle, dans le but de dérober aux victimes des informations sensibles.
  2. De nombreux outils open source malveillants piégés ont été créés pour tromper les victimes, issus très probablement de moteurs de recherche.
  3. Un attaquant a distribué une dépendance malveillante hébergée sur une fausse infrastructure Python, la liant à des projets populaires sur GitHub et à des packages Python légitimes. Les pirates ont pris des comptes GitHub, publié des packages Python malveillants et utilisé des stratagèmes d'ingénierie sociale.
  4. La charge utile malveillante s’est déroulée en plusieurs étapes, collectant des mots de passe, des informations d'identification et autres données critiques à partir de systèmes infectés pour les exfiltrer vers l'infrastructure de l'attaquant.
  5. Dans cette attaque, les pirates ont déployé un faux miroir de paquets Python, utilisé pour déployer une copie empoisonnée du paquet populaire « colorama ».
  6. Parmi les victimes se trouve également un contributeur top.gg, dont le code repository de la communauté top.gg (170K+ membres) a été affecté par l'attaque.

J’ai été piraté

 « J'utilisais mon ordinateur portable, juste le temps de manipuler python sur ma ligne de commande, jusqu'à ce que je voie un message bizarre disant que quelque chose n’allait pas avec colorama sur python. Je ne m'en suis pas soucié, habitué à ce genre de choses mais quelques minutes plus tard, je recevais le même message d'erreur mais dans un script différent. J’ai alors su que je me faisais pirater. »

Ce récit provient du récent article de blog de Mohammed Dief, un développeur Python victime d'une attaque de logiciel malveillant sophistiqué lors du clonage du référentiel « maleduque/Valorant-Checker ».

L'histoire de Mohammed n'est qu'un exemple de l'impact considérable de cette campagne malveillante. Son instigateur a utilisé une sournoise stratégie pour propager le malware via des référentiels GitHub malveillants.

Faux miroir Python

L'infrastructure de l'attaque comprenait un site Web qui semblait être un miroir de package Python et enregistré sous le domaine « files[.] pypihosted[.] org ».

Cette sélection de domaine est un typosquat astucieux du miroir officiel de Python « files.pythonhosted.org », l'endroit où les fichiers d'artefacts officiels des paquets PyPi sont généralement stockés.

L’attaquant a utilisé une fonctionnalité dans pip (gestionnaire de paquets pour Python) où il est possible de spécifier une URL pour récupérer la dépendance d’un package et a utilisé son faux miroir Python pour télécharger des packages. 

Héberger un « colorama » empoisonné

Ils ont ensuite pris Colorama (un outil très populaire avec 150+ millions de téléchargements mensuels), l'ont copié et y ont inséré du code malveillant puis dissimulé la charge utile nuisible à l'aide d'un space-padding et hébergé cette version modifiée sur leur faux miroir de domaine typosquatté. Cette stratégie rend beaucoup plus difficile l'identification de la nature nuisible du paquet, car il semble s'agir d'une dépendance légitime.

Prise de contrôle de compte GitHub

La portée des pirates s'est étendue au-delà de la création de référentiels malveillants via leurs propres comptes. Ils ont réussi à détourner des comptes GitHub de bonne réputation et à utiliser les ressources de ces comptes pour contribuer à des commits malveillants.

L'une des victimes est le compte editor-syntax sur GitHub, également mainteneur de Top.gg GitHub et disposant d'autorisations d'écriture sur les dépôts git de Top.gg.

En contrôlant ce compte de confiance, l'attaquant a effectué un commit malveillant dans le  référentiel top-gg/python-sdk à l'aide de l'identité GitHub volée de editor-syntax. Il a ajouté des instructions pour télécharger la version empoisonnée de colorama à partir du faux miroir Python. Il a également utilisé ce compte pour mettre en vedette plusieurs dépôts GitHub malveillants afin d'augmenter leur visibilité et leur crédibilité.

Prise de contrôle de compte via des cookies volés

Le compte GitHub de « editor-syntax » a probablement été piraté par le biais de cookies volés. L'attaquant a eu accès aux cookies de session du compte, ce qui lui a permis de contourner l'authentification et d'effectuer des activités malveillantes à l'aide de l'interface utilisateur GitHub. Cette méthode de prise de contrôle de compte est particulièrement préoccupante, car elle ne nécessite pas que l'attaquant connaisse le mot de passe du compte.

Le 3 mars 2024, des utilisateurs ont alerté « editor-syntax » sur le chat Discord de la communauté au sujet d’activités malveillantes provenant de son compte. « editor-syntax » a été assez secoué lorsqu'il s'est rendu compte de ce qui s'était passé via son compte GitHub et de l'ampleur et l'impact de l'attaque.

Il est intéressant de noter que la technique de Typosquatting de l'attaquant était si convaincante que même un utilisateur de GitHub en a été victime sans se rendre compte qu'il était attaqué. Lorsque le domaine malveillant, piphosted[.] org », est tombé en panne, l'utilisateur s’est plaint du problème sans se rendre compte qu'il s'agissait d'un hôte pour des charges utiles malveillantes.

Une aiguille dans une botte de foin

Pour dissimuler encore plus ses intentions, l'attaquant a utilisé une approche stratégique lors de la validation des commits apportés aux nombreux référentiels malveillants. Plusieurs fichiers ont été comités simultanément, y compris le fichier requirements contenant le lien malveillant, ainsi que d'autres fichiers légitimes. Cette décision visait à minimiser les risques de détection, le lien malveillant se fondrait ainsi dans les dépendances légitimes, réduisant la probabilité que les utilisateurs repèrent l'anomalie lors d'un examen superficiel des modifications validées.

Plongez dans le paquet malveillant

En plus de propager le malware par le biais de référentiels GitHub malveillants, l'attaquant a également utilisé un package Python appelé « yocolor » pour distribuer davantage le package « colorama », utilisant la même technique de typosquatting, c’est à dire en hébergeant le paquet malveillant sur le domaine « files[.] pypihosted[.] org » et en utilisant un nom identique à celui du paquet légitime « colorama ».

En manipulant le processus d'installation du package et en exploitant la confiance des utilisateurs dans l'écosystème du package Python, l'attaquant s'est assuré que le package malveillant « colorama » serait installé chaque fois que la dépendance malveillante était spécifiée dans les exigences du projet. Cette tactique a permis à l'attaquant de contourner les soupçons et d'infiltrer les systèmes de développeurs peu méfiants qui s'appuyaient sur l'intégrité du système de packaging Python.

Stage 1

La première étape est celle où l'utilisateur télécharge le dépôt ou le package malveillant qui contient la dépendance malveillante - « colorama » à partir du domaine typosquatté, « files[.] pypihosted.org ».

Stage 2

Le package malveillant « colorama » contient un code identique à celui du package légitime, à l'exception d'un court extrait supplémentaire de code malveillant. Initialement, ce code se trouvait dans le fichier « colorama/tests/__init__.py », mais l'attaquant l'a ensuite déplacé vers « colorama/init.py », probablement pour s'assurer qu’il soit exécuté de manière plus fiable. Ce code prépare le terrain aux phases suivantes de l'attaque.

L'attaquant a utilisé une technique astucieuse pour cacher la charge utile malveillante dans le code. Il a utilisé une quantité importante d'espaces blancs pour pousser le code malveillant hors de l'écran, obligeant la personne examinant rapidement les fichiers sources du paquet à les faire défiler horizontalement et pendant une période prolongée avant de découvrir le contenu malveillant caché.

Ce code récupère et exécute un autre morceau de code Python à partir de « hxxps[ :]//pypihosted[.] org/version », qui installe les bibliothèques nécessaires et déchiffre les données codées en dur à l'aide de la bibliothèque « fernet ». Le code déchiffré recherche ensuite un interpréteur Python valide et exécute un autre extrait de code obfusqué enregistré dans un fichier temporaire.

Stage 3

Le logiciel malveillant progresse davantage, récupérant du code Python obfusqué supplémentaire à partir d'un autre lien externe : hxxp[ :]//162[.] 248[.] 100[.] 217/inj, et l'exécute à l'aide de « exec ».

Stage 4

Après analyse, il est clair que l'attaquant a réfléchi à l'obscurcissement de son code. Des techniques telles que l'utilisation de chaînes de caractères chinois et japonais, la compression zlib et les noms trompeurs de variables ne sont que quelques-unes des techniques utilisées pour compliquer l'analyse et la compréhension du code.

Le code simplifié vérifie le système d'exploitation de l'hôte compromis et sélectionne un dossier et un nom de fichier aléatoires pour héberger le code Python malveillant final, qui est récupéré à partir de « hxxp[ :]//162[.] 248[.] 100.217[ :]80/gr[b](http ://162.248.100.217/grb). »

Un mécanisme de persistance est également utilisé modifiant le registre Windows pour créer une nouvelle clé d'exécution, ce qui garantit que le code Python malveillant est exécuté chaque fois que le système est redémarré. Cela permet au malware de maintenir sa présence sur le système compromis même après un redémarrage.

Stage 5

La dernière étape du malware, récupérée sur le serveur distant, révèle l'étendue réelle de ses capacités de vol de données. Ciblant un large éventail d'applications logicielles populaires, il est destiné à voler des informations sensibles :

Données du navigateur : le malware cible un large éventail de navigateurs Web, notamment Opera, Chrome, Brave, Vivaldi, Yandex et Edge. Il recherche des répertoires spécifiques associés à chaque navigateur et tente de voler des données sensibles telles que les cookies, les informations de remplissage automatique, l'historique de navigation, les signets, les cartes de crédit et les identifiants de connexion.

Données Discord : Le code cible spécifiquement Discord en recherchant des répertoires et des fichiers liés. Il tente de localiser et de décrypter les tokens Discord, qui peuvent être utilisés pour obtenir un accès non autorisé au compte Discord de la victime.

Portefeuilles de crypto-monnaies : Le malware comprend une liste de portefeuilles de crypto-monnaies qu'il vise à voler dans le système de la victime. Il recherche des répertoires spécifiques associés à chaque portefeuille et tente de voler les fichiers liés au portefeuille. Les données du portefeuille volé sont ensuite compressées dans des fichiers ZIP et téléchargées sur le serveur de l'attaquant.

Sessions Telegram : Le malware tente également de voler les données des sessions Telegram. Il y recherche des répertoires et des fichiers dans le but de capturer les informations de session de la victime. En accédant aux sessions Telegram, l'attaquant pourrait potentiellement obtenir un accès non autorisé au compte Telegram et aux communications de la victime.

Fichiers informatiques : le logiciel malveillant comprend un composant voleur de fichiers qui recherche des fichiers avec des mots-clés spécifiques dans leurs noms ou extensions. Il cible les répertoires tels que Bureau, Téléchargements, Documents et Fichiers récents.

Données Instagram : le logiciel malveillant tente de voler des informations sensibles sur le profil Instagram de la victime en exploitant le token de session Instagram. Il envoie des requêtes à l'API Instagram à l'aide du token de session volé pour récupérer divers détails de compte.

Une analyse plus approfondie de la charge utile finale révèle que le malware comprend également un composant d'enregistrement de frappe. Il capture les frappes de la victime et les enregistre dans un fichier, qui est ensuite téléchargé sur le serveur de l'attaquant. Cette capacité permet à l'attaquant de surveiller et d'enregistrer les saisies de la victime, exposant potentiellement des informations sensibles telles que des mots de passe, des messages personnels et des détails financiers.

Les données volées sont exfiltrées vers le serveur de l'attaquant à l'aide de diverses techniques. Le code comprend des fonctions permettant de télécharger des fichiers vers des services de partage de fichiers anonymes tels que GoFile et Anonfiles. Il envoie également les informations volées au serveur de l'attaquant à l'aide de requêtes HTTP, ainsi que des identifiants uniques tels que l'ID matériel ou l'adresse IP pour suivre la victime.

Conclusion

Cette campagne est un excellent exemple des tactiques sophistiquées employées par les pirates pour distribuer des malwares via des plateformes de confiance comme PyPI et GitHub.

Cet incident souligne l'importance de la vigilance lors de l'installation de paquets et de dépôts, même à partir de sources fiables. Il est essentiel d'examiner minutieusement les dépendances, de surveiller les activités réseau suspectes et de maintenir des pratiques de sécurité robustes pour atténuer le risque.

Alors que la communauté de la cybersécurité continue de découvrir et d'analyser ces menaces, la collaboration et le partage d'informations restent essentiels dans la lutte contre les acteurs malveillants ciblant la chaîne d'approvisionnement logicielle.

A propos de l'auteur

Tal Folkman, Yehuda Gelb, Jossef Harush Kadouri, Tzachi Zornshtain
Checkmar