12 mars 2021

Les packages, un vecteur d’attaque pour votre entreprise

Introduction

Certains écosystèmes de programmation comme Python, Node.js ou encore Ruby fonctionnent avec des répertoires publics gratuits de modules pour agrémenter vos logiciels de développement. Ils fournissent principalement un outil permettant de récupérer et d’installer facilement ces modules.

Pour Python, le gestionnaire de paquets le plus communément utilisé est Pypi — Python Package Index —. Actuellement, Pypi contient près de 300 000 paquets open source créés par la communauté. L’installation via le gestionnaire de paquets est d’une facilité déconcertante : pip install <package_name>

Vous pouvez retrouver l’intégralité des paquets Python sur ce lien.

Installation du paquet via pip

Par exemple, si l’on souhaite effectuer des requêtes au sein d’un script Python, il suffit d’exécuter la commande suivante : pip install requests

Cette dernière va installer localement le module requests (librairie permettant l’envoie et la réception de requêtes HTTP) au sein de l’environnement Python. Il ne restera plus qu’à l’importer dans le script de la manière suivante : import requests.

Figure 1 : Installation du paquet « requests »
Figure 2 : Utilisation du paquet « requests »

Mises à jour malveillantes

En général, les utilisateurs font confiance aux différents gestionnaires de paquets présents sur le marché, résultant en une série d’attaques envers ces derniers. Les attaquants ciblent le répertoire Github ou Gitlab dans le but de prendre le contrôle du dépôt. L’objectif est de directement modifier et distribuer le code sur le paquet officiel, les utilisateurs ne verront aucune différence. Ils peuvent également, proposer de l’aide à une personne n’ayant plus le temps de s’occuper du répertoire et donc facilement modifier le code du paquet.

Une fois la version mise à jour sur le dépôt avec le code malveillant, les utilisateurs seront automatiquement infectés sur leur machine dès la mise à jour du paquet faite.

Il existe également une autre technique utilisée par les attaquants voulant cibler les grosses entités. En publiant une version publique d’un paquet utilisé en interne par l’entreprise cible, la version publique obtiendra un numéro de version plus élevée que celle utilisée en interne. Cela conduira, si l’entreprise n’a pas de processus de mise à jour sécurisé, à une mise à jour automatique sur le dépôt public. L’entreprise se retrouvera alors infectée par une version malveillante d’un de leurs paquets.

Récemment, un chercheur en sécurité a réussi à infiltrer les réseaux de plusieurs grandes sociétés en fournissant des versions plus élevées de paquets utilisés en interne. De grandes entités comme Apple, Microsoft ou encore PayPal ont été victime de ce type d’attaque. Cela leur a permis de revoir complètement leur système de mise à jour de paquets. Vous pouvez retrouver l’article en question à cette adresse.

Le nom pour ce type d’attaque est « supply chain attack ». Les attaquants ne ciblent pas directement les réseaux des entreprises, mais installent du code malveillant en amont dans des paquets utilisés par celles-ci. Une fois la modification du code faite, ils n’ont plus qu’à attendre que la mise à jour soit poussée et atteignent le réseau interne de l’entreprise.

Paquet Squatting

Une autre attaque possible sur la chaîne d’approvisionnement, moins sophistiquée, sans garantie de succès, mais extrêmement simple à mettre en place, consiste à créer un faux paquet avec un nom trompeur. Les utilisateurs qui ne feront pas attention ou qui feront une faute d’orthographe pourraient télécharger et installer ce paquet malveillant par erreur.

Comme le « Typosquatting » dans le monde des sites internet, les attaquants enregistrent des noms de domaines avec des lettres changés ou comportant volontairement une faute. On appelle cela des noms de domaine « near-miss » dans l’espoir que l’utilisateur ne se rende pas compte qu’il est sur le mauvais site.

Le fonctionnement pour le « paquet squatting » est exactement le même. Les attaquants enregistrent des paquets avec des noms officiels en changeant une lettre ou en faisant une faute volontaire dans l’espoir que l’utilisateur fasse une faute involontaire et télécharge le mauvais paquet.

Nous pouvons voir ci-dessous une petite liste de paquets utilisant la technique « paquet squatting » récemment supprimés du gestionnaire Pip :

Figure 3 : Exemple de paquets faisant du « paquet squatting »

Les risques d’installer des paquets malveillants

Après des recherches sur les paquets malveillants cités ci-dessus, il ne s’avère qu’aucun de ces faux paquets ne contenait d’installation de logiciel frauduleux ou de code malveillant.

Cependant, ils contenaient une commande Python qui était exécutée à l’installation du paquet plutôt qu’au moment de son utilisation.

La commande était la suivante :

Figure 4 : Morceau de code exécuté à l’installation du paquet

Il s’agit d’un moyen assez rudimentaire de faire de la télémétrie, c’est-à-dire suivre à distance qui a téléchargé et installé le paquet.

En effet, le petit morceau de code requête un serveur distant dont l’adresse IP a été masquée avec en paramètre le nom du faux paquet.

L’utilisateur qui a créé les 5 faux paquets énumérés ci-dessus a pour nom « Remind Supply Chain Risks » et selon la Wayback Machine a téléversé sur Pypi plus de 3900 paquets totalement faux. Il s’agit donc d’un utilisateur bien connu dans le monde des attaques de chaîne d’approvisionnement.

Heureusement, l’équipe Python étant assez réactive concernant les paquets malveillant, ils sont déjà tous supprimés.

Cependant, un exemple concret actuellement en ligne (09/03/2021) et concerne une copie du paquet beautifulsoup4 sous le nom beautfulsoup4. Ce paquet ne contient pas de code et porte le titre suivant : « You may want to install beautifulsoup4 ». Le développeur souhaitait surement faire de la prévention contre les faux paquets.

Conclusion — comment se prémunir ?

La première des choses à faire est de ne pas reproduire le comportement du développeur ci-dessus en mettant à disposition sur Pypi des paquets avec un faux nom dans le seul but de prévenir l’utilisateur qu’il s’agit du mauvais paquet. À vouloir faire passer un message, l’utilisateur risque d’être distrait et multiplier les erreurs par la suite.

Pour éviter les erreurs d’orthographe, le plus simple est de se rendre directement sur la page Pipy du module comme ici (exemple pour la librairie « requests ») ou encore sur la page de documentation du projet.

De plus, il est recommandé d’éviter de connecter les projets internes sur des dépôts publics en faisant des mises à jour automatique, cela pourrait avoir des conséquences désastreuses sur un parc informatique. A contrario, il est possible de télécharger en local les paquets et de les mettre à jour via un processus sécurisé. Cela permet de réduire les risques d’erreurs et d’installation de logiciel non désirés.

Pour finir, pip propose une solution pour atténuer l’attaque de « paquet squatting ». En exécutant la commande suivante : pip install only-binary :all: <package_name>

Cela permet de refuser toute distribution source d’être installée en refusant l’exécution de code au moment de l’installation.

Il ne s’agit pas d’une solution complète puisque l’attaquant peut toujours mettre en place une distribution construite et compter sur la victime pour importer le module malveillant dans son code, ce qui exécutera le code malveillant.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *