Tous les articles

Apprivoiser les mauvais paquets Python : Évaluation des détecteurs de logiciels malveillants Python à l'aide d'un ensemble de données de référence

John Speed Meyers et Zachary Newman, chercheurs principaux

Ly D. Vu, chercheur invité chez Chainguard et enseignant-chercheur à l'université FPT au Viêt Nam, a contribué à cet article.

Le nombre de logiciels libres malveillants trouvés dans des registres populaires est en augmentation. Selon une analyse de l'Atlantic Council, les logiciels libres malveillants sont passés d'un phénomène quasi inexistant il y a dix ans à un phénomène quasi mensuel. L'un des moyens de contrer ces attaques consiste à les détecter et à les corriger à la source. Par exemple, le Python Package Index (PyPI), l'équivalent du magasin d'applications pour les programmeurs Python, a expérimenté une capacité de détection des logiciels malveillants qui analyse les nouveaux paquets et les nouvelles versions de paquets, en surveillant les paquets potentiellement malveillants pour aider à protéger les utilisateurs de PyPI.

Malheureusement, la détection de logiciels libres malveillants dans le contexte d'un registre communautaire est une tâche difficile. Les responsables du registre et les contributeurs disposent d'un temps limité (souvent à titre bénévole) pour examiner les verdicts de sécurité, un problème aggravé par les taux élevés de faux positifs et le nombre considérable de paquets dans de nombreux registres. En outre, la recherche universitaire sur la détection des logiciels malveillants néglige la plupart du temps les exigences particulières de l'analyse de registres entiers de logiciels libres (à quelques exceptions près), ce qui n'apporte qu'une aide relativement limitée. Enfin, les entreprises de sécurité logicielle ont réalisé des progrès dans ce domaine, en aidant les administrateurs de dépôts, mais même leurs efforts pourraient être plus efficaces s'il existait des ensembles de données et des méthodologies partagées pour la détection des logiciels malveillants OSS.

Pour aider les parties intéressées à créer de meilleures approches pour analyser les registres de paquets à la recherche de logiciels libres malveillants, nous avons conçu un projet visant à construire un ensemble de données de référence sur les logiciels malveillants Python afin d'évaluer les performances actuelles des contrôles de logiciels malveillants de PyPI et d'évaluer les approches alternatives. Cet ensemble de données, qui contient à la fois des logiciels malveillants et des paquets Python bénins, permet aux parties intéressées de mesurer empiriquement le taux de faux positifs et le taux de vrais positifs d'une approche particulière.

En utilisant cet ensemble de données de référence open source pour évaluer les contrôles PyPI actuels, notre analyse a révélé ce qui suit :

  1. Des taux de faux positifs élevés : Plus d'un tiers des 1 430 paquets populaires ont déclenché une alerte. Près de 15 % des 986 paquets aléatoires ont déclenché une alerte. En se basant sur des hypothèses prudentes concernant la prévalence des logiciels malveillants, ce taux génère des milliers de faux positifs par semaine.

  2. Taux de vrais positifs modérément élevés : Près de 60 % des paquets malveillants ont déclenché une alerte.

Ces résultats confirment ce que les experts en logiciels malveillants Python ont découvert intuitivement : l'approche actuelle, bien qu'elle permette de repérer la majorité des logiciels malveillants, présente des taux de faux positifs inacceptables, ce qui inonde l'utilisateur potentiel de fausses pistes. Nous espérons que cet ensemble de données de référence accélérera la découverte de logiciels malveillants dans PyPI, en aidant les chercheurs en sécurité à créer des techniques de détection de logiciels malveillants Python plus efficaces. En fin de compte, nous espérons que ces meilleures approches réduiront le nombre de paquets malveillants dans PyPI et le temps moyen de détection des logiciels malveillants trouvés dans PyPI.

Cet article de blog explique la création et l'utilisation de l'ensemble de données de référence pour mesurer les performances des contrôles actuels des logiciels malveillants dans PyPI.

Un nouvel ensemble de données de référence sur les logiciels malveillants en Python

Pour créer un ensemble de données permettant aux parties intéressées de mesurer les performances des approches de détection des logiciels malveillants en Python, nous avons créé un ensemble de données contenant à la fois des paquets malveillants et des paquets inoffensifs.

L'assemblage des paquets Python malveillants a été simple. L'ensemble de données Backstabber's Knife Collection (extrait au commit 22bd76) contient 107 paquets malveillants de logiciels malveillants Python précédemment identifiés, tandis que l'ensemble de données MalOSS (extrait au commit 2349402e) contient 140 exemples valides. L'ensemble de données de référence ne comprend qu'une copie des 75 paquets trouvés dans les deux ensembles de données. En outre, trois paquets ne contenaient pas de fichiers Python, deux paquets portant le même nom ont été considérés comme identiques et l'ensemble de données ne comprenait que la dernière version de chaque paquet. Au total, l'ensemble de données contient donc 168 paquets Python malveillants. Pour empêcher la prolifération des logiciels malveillants OSS, les deux ensembles de données sont restreints ; les chercheurs doivent demander spécifiquement l'accès, et nous ne publions donc que les métadonnées associées aux fichiers malveillants. Bien entendu, il existe également de nombreux exemples de logiciels malveillants Python qui ne figurent pas dans cet ensemble de données - des paquets qui ont été supprimés avant qu'un échantillon ne soit stocké - et les futurs chercheurs devraient s'efforcer, dans la mesure du possible, de les intégrer.

La création d'une liste de paquets bénins a été plus difficile. Il n'existe pas d'ensemble de données préexistant de paquets Python universellement considérés comme bénins. Nous avons donc créé deux ensembles de données sur les paquets bénins.

Dans un premier temps, nous avons créé un ensemble de données combinant les 1 000 paquets Python les plus téléchargés et les 1 000 paquets Python les plus utilisés. On peut supposer qu'aucun de ces paquets n'est malveillant. Nous avons exclu trois paquets populaires qui ne contiennent aucun fichier Python. En n'utilisant qu'une seule copie de chaque paquet trouvé dans les deux ensembles de données, nous avons généré un ensemble de données inoffensif de 1 430 paquets. Il convient de reconnaître que les paquets populaires sont probablement différents d'un paquet Python typique : potentiellement mieux conçus et plus conformes aux pratiques de programmation Python standard. Par conséquent, le fait de n'utiliser que des paquets populaires comme ensemble de données bénignes pourrait conduire à des résultats de référence irréalistes, car ces paquets pourraient être relativement faciles à classer comme bénins par les outils de détection.

La deuxième étape a consisté à sélectionner la version la plus récente de 1 000 paquets Python choisis au hasard. Nous avons exclu les paquets qui ne contenaient aucun fichier Python et les paquets que nous avions choisis, mais qui n'étaient plus disponibles au moment de l'analyse, ce qui nous a permis d'obtenir un ensemble de données inoffensif de 986 paquets. S'il est possible que certains de ces paquets soient malveillants, la probabilité que plus d'une poignée d'entre eux le soient est infime. Il est important de noter que ces paquets ont plus de chances de représenter un paquet sélectionné au hasard dans PyPI.

Le code permettant de télécharger les paquets de PyPI et de les analyser est disponible sur GitHub.

Le tableau 1 présente les statistiques descriptives de l'ensemble de données de référence. Les valeurs des colonnes de l'ensemble de données contiennent des liens vers les métadonnées de chaque liste de paquets.

Ensemble de données

Nombre de paquets

Nombre de fichiers Python

Nombre de lignes de code

Malveillant

168

1 339

228 192

Bénin - Populaire

1 430

164 223

45 254 876

Bénin - Aléatoire

986

16 832

2 770 978

Tableau 1. Statistiques descriptives de l'ensemble de données de référence

Remarque : l'outil scc a été utilisé pour calculer les statistiques des fichiers et des lignes.

Analyse comparative de l'approche actuelle de détection des logiciels malveillants de PyPI

PyPI met actuellement en œuvre deux contrôles de sécurité. Le premier est un "setup pattern check" pour effectuer des vérifications basées sur des expressions régulières (en particulier, les règles YARA) des fichiers setup.py. Le second est un "contrôle de rotation des paquets" qui permet d'analyser les comportements suspects liés à la propriété des paquets. L'analyse ci-dessous ne porte que sur le contrôle de configuration. Ces contrôles génèrent des alertes lorsqu'un artefact téléchargé présente un comportement suspect, ce qui permet aux administrateurs d'examiner les alertes et, le cas échéant, de prendre des mesures.

Nous avons exécuté la vérification du modèle d'installation de PyPI sur les paquets malveillants et les deux ensembles de paquets bénins. Les contrôles n'ont été effectués que sur le fichier setup.py, un fichier souvent utilisé de manière abusive par les créateurs de logiciels malveillants Python. L'analyse du tableau 2 présente des statistiques sur le nombre d'alertes générées. Plus important encore, l'analyse a révélé qu'environ 33 % (474 paquets) des paquets populaires et près de 15 % (147 paquets) des paquets aléatoires ont déclenché des alertes. En revanche, l'analyse a révélé que près de 60 % (99 paquets) des paquets malveillants ont généré au moins une alerte.

Ensemble de données

Nombre total de paquets

Nombre total de paquets avec au moins 1 alerte

Pourcentage de paquets avec au moins 1 alerte

Malveillants

168

99

58,9 %

Populaires

1 430

474

33,1 %

Aléatoires

986

147

14,9 %

Tableau 2. Résultats du benchmark pour les vérifications actuelles des logiciels malveillants de PyPI

Note : Cette analyse n'a analysé que les fichiers setup.py pour tous les paquets.

Ces vérifications de logiciels malveillants ont permis d'attraper une majorité de paquets malveillants. Cependant, ces contrôles ont un taux de faux positifs lamentable, ce qui fait perdre du temps même à l'analyste de sécurité le plus efficace. Par exemple, si l'on suppose que 20 000 paquets sont publiés chaque semaine (chiffre que nous avons corroboré à l'aide d'un ensemble de données PyPI public) et que 20 paquets malveillants sont inclus dans ces paquets, un analyste utilisant ces vérifications pour rechercher des paquets malveillants doit traiter plus de 4 000 alertes faussement positives par semaine.

Aider la communauté de sécurité Python à réduire les dommages causés par les logiciels malveillants de PyPI

Notre création d'un ensemble de données sur les logiciels malveillants de Python a pour but d'aider toute personne engagée dans la recherche de logiciels malveillants dans le dépôt PyPI à évaluer l'efficacité des approches proposées. Parce que cet ensemble de données contient à la fois des malwares et des paquets bénins, les chercheurs en sécurité peuvent calculer le taux de vrais positifs et, peut-être plus important encore, le taux de faux positifs d'une approche de détection. Cet ensemble de données de référence peut aider les chercheurs en sécurité et la communauté PyPI à détecter plus efficacement les logiciels malveillants Python, ce qui permet de réduire le nombre de logiciels malveillants dans PyPI et d'accélérer le temps de détection de tout logiciel malveillant dans PyPI.

Nos résultats sont en accord avec les attitudes actuelles de la communauté PyPI ; les contrôles de logiciels malveillants du statu quo, même s'ils capturent la majorité des logiciels malveillants Python, produisent trop de faux positifs pour être utilisés efficacement par un analyste de sécurité.

Dans un prochain article de blog, nous prévoyons d'étendre cette analyse comparative de la détection des logiciels malveillants Python à des analyseurs de logiciels malveillants open source plus sophistiqués tels que OSSGadget Detect Backdoor, bandit4mal et OSSF Package Analysis. Nous prévoyons également de porter les règles PyPI Malware Checks à l'outil SemGrep et d'évaluer cette approche.

Ly D. Vu est chercheur invité chez Chainguard et enseignant-chercheur à l'université FPT au Viêt Nam. Zack Newman est ingénieur logiciel senior chez Chainguard. John Speed Meyers est chercheur en sécurité chez Chainguard.

Share this article

Articles connexes

Vous souhaitez en savoir plus sur Chainguard?

Contactez-nous