Un package malveillant dans PyPI utilise des techniques de phishing pour dissimuler ses intentions malveillantes

0
195

PyPI (Python Package Index) est le référentiel officiel des packages logiciels pour le langage de programmation Python. Il s’agit d’une plateforme centralisée où les développeurs Python peuvent trouver, installer et partager des packages Python open-source avec d’autres.

Faits marquants :

  • CloudGuard Spectralops a détecté un compte de phishing malveillant dans PyPI, le principal index de packages Python. 
  • Les utilisateurs qui ont installé les packages de compte ont été exposés à un acteur malveillant, probablement un voleur d’informations personnelles.
  • Une fois détectés, l’équipe PyPI a été alertée par l’équipe CPR, qui, peu de temps après, a supprimé les packages.

Tribune par Ori Abramovsky, équipe Check Point ResearchPyPI est géré par la Python Software Foundation (PSF), et est accessible via l’installateur de packages pip, inclus dans la plupart des installations de Python. Les utilisateurs peuvent rechercher des packages par leur nom ou par mot-clé, et peuvent télécharger et installer des packages en une seule commande. PyPI héberge des milliers de packages Python open-source, allant des bibliothèques dédiées au calcul scientifique et à l’analyse de données, aux frameworks pour le développement web et l’apprentissage automatique. Tout le monde peut télécharger un package sur PyPI, à condition qu’il réponde à certaines exigences et lignes directrices définies par la PSF. PyPI se révèle être un outil essentiel pour la communauté Python, car il permet aux développeurs de découvrir et d’utiliser facilement des packages tiers. Par ailleurs, il encourage les développeurs Python du monde entier à travailler en collaboration et à partager leurs connaissances. De nombreux frameworks et outils Python populaires, tels que Django, Flask et

Pandas, sont disponibles sur PyPI, ainsi qu’une vaste gamme d’autres packages répondant à divers objectifs, ce qui en fait une ressource essentielle pour les développeurs de l’écosystème Python.

L’attaque

Les acteurs malveillants ne se font pas attendre. Nous voyons sans cesse de nouvelles techniques et stratégies qui leur permettent de cacher leurs intentions malveillantes (de l’utilisation de la stéganographie aux crypto-jackers qui détournent le système d’installation afin de miner de la crypto-monnaie à leur profit). Les packages malveillants que nous avons détectés révèlent que les attaquants recourent également au phishing pour dissimuler leurs intentions. Grâce à nos modèles d’apprentissage automatique, nous avons pu détecter ces packages malveillants sur PyPI. Ces packages, qui prétendent contenir des aides au fonctionnement d’async-io, se sont révélés être des acteurs malveillants, qui téléchargeaient et exécutaient de manière cachée du code brouillé dans le cadre de leur processus d’installation. De plus, l’attaquant a publié plusieurs versions du même package avec de légères modifications, évoluant probablement vers une version qui sera moins perceptible pour ceux qui recherchent des packages malveillants sur PyPI. Vous trouverez plus de détails sur les packages détectés dans les lignes qui suivent.

Les détails de de l’attaque

Le premier package qui a attiré notre attention est aiotoolsbox : bien qu’il ait l’air inoffensif à première vue, il s’est avéré être une réplique exacte du véritable package aiotools. Il est important de noter que si le typosquattage (utilisation de noms de packages qui ressemblent à des packages courants inoffensifs pour inciter les utilisateurs à installer les packages malveillants) est une attaque assez courante dans le monde de la chaîne d’approvisionnement, la reproduction du package inoffensif est une pratique moins courante (dans la plupart des cas, il suffit d’imiter le nom du package). C’est en général une pratique que l’on rencontre plus souvent dans l’univers du phishing. Ce genre d’effort pourrait indiquer une campagne plus sophistiquée, car les personnes chargées de l’installation risquent de regarder à deux fois les packages qu’elles s’apprêtent à installer (il est intéressant de noter qu’une campagne malveillante similaire a déjà été identifiée par nos modèles d’apprentissage automatique

Le package inoffensif aiotools à côté du package malveillant aiotoolsbox

Si l’on examine les métadonnées des packages, on s’aperçoit que les deux partagent le même auteur mais pas le même mainteneur. Le protocole de publication des packages PyPI prévoit que les champs de l’auteur contiennent du texte libre alors que le mainteneur est un utilisateur authentifié. L’attaquant peut donc facilement imiter le champ de l’auteur alors que pour les champs du mainteneur, il doit avoir recours à autre chose.

Les coordonnées des contributeurs du package inoffensif aiotools à côté de celles du package malveillant aiotoolsbox.

Selon les détails du mainteneur de aiotoolsbox, ils sont contributeurs PyPI depuis 2019. Dans la mesure où les deux seuls packages dont ils disposent ont été publiés récemment, on peut supposer que ce compte a été récemment victime d’une intrusion.

Page du mainteneur PyPI de aiotoolsbox

En examinant le code d’installation d’aiotoolsbox, vous constaterez qu’il comprend un extrait étrange qui, pendant le processus d’installation, télécharge un fichier zip depuis le Web, l’extrait, l’exécute et termine par supprimer son contenu.

Code aiotoolsbox setup.py

Première chose intéressante, le zip est téléchargé à partir d’un serveur censé être « files.pythonhosted.org ». Il s’agit en fait de la deuxième phase de phishing de l’attaque, où le serveur tente de se faire passer pour le site officiel d’hébergement des packages PyPI.

Le serveur inoffensif files.pythonhosted.org à côté du serveur malveillant aiotoolsbox en cours d’utilisation.

Autre point intéressant à noter, le nom du fichier téléchargé qui correspond à la version de python utilisée : par exemple si vous utilisez python 3.9, vous obtiendrez un fichier zip nommé 39.zip. Cette méthode semble être un autre niveau de brouillage du phishing, qui fait croire à l’utilisateur commun qu’il s’agit de quelque chose de légitime, comme une sorte de flux interne du Pip.

Quand on regarde le fichier zip téléchargé, on constate qu’il contient un code pyArmor brouillé qui empêche de comprendre clairement quelles sont les intentions malveillantes de l’auteur. Quoi qu’il en soit, si l’on examine les noms des fichiers téléchargés, on peut supposer que le package est un voleur d’informations personnelles, destiné à collecter et à dérober les données secrètes de l’installateur. Le téléchargement caché de ce zip au cours du processus d’installation nous permet de conclure qu’il ne s’agit pas d’un cas anodin.

Le contenu du zip téléchargé

Si l’on examine la structure du package aiotoolsbox, hormis le fichier setup.py, le reste des fichiers semble provenir du package aiotools, ce qui permet à l’utilisateur ordinaire d’obtenir les fonctionnalités de base qu’il recherchait, sans savoir qu’il vient d’installer un package malveillant. 

La structure des fichiers inoffensifs du package aiotools à côté de celle du package malveillant aiotoolsbox.

Si l’on recherche les versions antérieures d’aiotoolsbox, il est intéressant de noter qu’elle a été téléchargée plusieurs fois avec des versions différentes (d’abord 1.4.7, puis 1.4.5 et 1.4.6).

Recherche de versions antérieures de aiotoolsbox

En analysant la différence entre ces versions, il s’est avéré qu’elles avaient la même structure et que la seule différence se trouvait dans le fichier setup.py et plus spécifiquement dans l’IP du serveur qu’elles utilisent. Après vérification des détails de l’adresse IP, la version initiale avait une adresse IP russe, tandis que la version ultérieure provenait d’Allemagne. Il s’agit probablement d’un autre niveau de brouillage, en supposant qu’une adresse IP russe se révélera plus alarmante qu’une adresse allemande.

aiotoolsbox version récente (1.4.6) vs la précédente (1.4.7)
L’IP la plus récente (1.4.6) est utilisée par rapport à l’IP précédente (1.4.7).

Le package async-proxy, dans son setup.py, mentionne aiotoolsbox comme seul pré-requis, ce qui oblige toute personne qui l’installe à installer également le package malveillant aiotoolsbox.

async-proxy setup.py code

Informations à fournir

Nous avons informé PyPI de l’existence de ce compte et, peu de temps après, l’équipe PyPI a supprimé les packages en question.

Comment CloudGuard Spectral élimine-t-il de tels risques ?  

Les attaques contre la chaîne d’approvisionnement sont de plus en plus fréquentes. Il est donc essentiel de vous protéger et de vérifier tous les éléments logiciels que vous utilisez, en particulier ceux que vous n’avez pas développés. Chez Check Point, notre mission est de construire un processus de développement sécurisé, en équipant les développeurs des bons outils pour y parvenir. Pour lutter contre les packages malveillants susceptibles d’entraîner des risques pour la chaîne d’approvisionnement, nous surveillons attentivement PyPI et NPM à la recherche d’entités malveillantes. Après les avoir identifiés, nous en informons NPM, ce qui entraîne leur retrait immédiat.