Skip to main content

Automatiser la correction des vulnérabilités dans les dépendances Python avec Snyk

Écrit par

26 février 2020

0 minutes de lecture

Nous sommes ravis d’annoncer une prise en charge améliorée de Python dans Snyk Open Source, qui permet aux développeurs de corriger les vulnérabilités des dépendances grâce à des pull requests de correction automatisées !

Le Python Packaging Index (PyPI) a enregistré plus de 14 milliards de téléchargements en 2018, un chiffre impressionnant à tous points de vue (en raison d’une erreur survenue en milieu d’année dans le service de statistiques de PyPI, le nombre réel est probablement bien supérieur). Ce chiffre reflète non seulement la large adoption de Python comme langage de programmation (aujourd’hui le deuxième langage selon GitHub), mais aussi les difficultés liées à l’utilisation des logiciels open source : un grand nombre de ces packages intègrent des dépendances vulnérables, directes et indirectes, dans les projets. Snyk a présenté plusieurs exemples au cours de l’année passée, notamment un article sur les packages malveillants.

Grâce à cette amélioration, Snyk Open Source aide les développeurs Python à concevoir des applications plus sécurisées : en plus de détecter les dépendances vulnérables, la solution propose des étapes de correction automatisées, directement dans leurs workflows de développement existants. Pour cela, Snyk crée un arbre de dépendances à partir du fichier requirements.txt inclus dans un projet pip. Ces dépendances sont ensuite comparées à la base de données des vulnérabilités de Snyk, et tout nouveau problème pouvant être corrigé déclenche automatiquement une pull request de correction.

Importer vos projets Python

Snyk propose plusieurs intégrations pour les dépôts de code basés sur Git, notamment GitHub, GitHub Enterprise, GitLab, Bitbucket Server et Bitbucket Cloud. Elles vous permettent de tester, surveiller et corriger facilement les vulnérabilités de sécurité et les problèmes de licence dans vos projets Python, directement dans vos workflows de gestion du code et de développement.

Voyons comment cela fonctionne avec un exemple d’application Python hébergée sur GitHub.

Dans cet exemple, nous nous sommes déjà connectés à Snyk avec nos identifiants GitHub. Snyk a donc configuré automatiquement l’intégration et affiche maintenant la liste de tous les dépôts disponibles.

Écran de sélection des dépôts Snyk affichant les dépôts GitHub, avec the-example-app.py sélectionné pour les tests

Dans l’écran Import, sélectionnez le projet Python que vous souhaitez faire analyser par Snyk, puis cliquez sur Add selected repositories. Snyk analyse tous les dépôts sélectionnés pour y rechercher leurs fichiers manifestes et importe un instantané de chacun d’eux dans un fichier distinct.

La page Projects s’affiche. Une fois l’importation du projet Python terminée, un message de réussite vous invite à actualiser la page. Après l’actualisation, vous verrez votre projet Python, reconnaissable à son logo, dans la liste des projets intégrés.

Tableau de bord des projets Snyk affichant des dépôts GitHub avec des nombres de vulnérabilités élevés, moyens et faibles.

Comme le montrent les chiffres de cet exemple, Snyk a détecté plusieurs vulnérabilités dans le projet importé. Pour les examiner de plus près, sélectionnez l’application Python dans la liste Projects pour la développer, puis cliquez sur le lien requirements.txt affiché.

Vous accédez alors au rapport d’analyse complet de votre projet.

Tableau de bord de projet Snyk affichant un fichier requirements Python avec deux vulnérabilités et recommandant de mettre à niveau Flask de la version 0.12.2 à la version 0.12.3.

En haut de la page, vous trouverez diverses métadonnées sur le projet, notamment le nombre de vulnérabilités détectées et le nombre de chemins par lesquels elles sont introduites.

Des conseils de correction vous sont également proposés, avec des étapes recommandées pour résoudre certains des problèmes détectés (une toute nouvelle fonctionnalité, dont nous reparlerons bientôt !). Dans cet exemple, la mise à niveau de la dépendance flask de la version 0.12.3 vers la version 0.12.3 corrige deux problèmes de gravité élevée.

Panneau de conseils de correction montrant la mise à niveau de Flask 0.12.2 vers Flask 0.12.3 pour corriger des problèmes de validation incorrecte des entrées et de déni de service

Pull requests de correction

Toutes les vulnérabilités détectées dans vos dépendances sont affichées plus bas, avec des informations contextuelles pour vous aider à hiérarchiser les problèmes et à commencer les corrections si nécessaire.

Tableau de bord des vulnérabilités affichant un problème Flask de déni de service à gravité élevée, avec des détails de correction et des options pour ouvrir une demande de fusion corrective.

Les différents filtres à gauche de la page vous aident à parcourir les problèmes détectés. Vous pouvez, par exemple, filtrer par niveau de gravité pour corriger d’abord les vulnérabilités de gravité élevée, ou par maturité de l’exploit, qui indique le degré de dangerosité réel d’une vulnérabilité (en savoir plus sur la maturité de l’exploit).

Pour les vulnérabilités pour lesquelles Snyk a trouvé une correction, vous pouvez créer une pull request depuis Snyk en cliquant simplement sur Fix this vulnerability.

Rapport de vulnérabilité de sécurité pour gunicorn indiquant un problème de gravité moyenne de type HTTP Request Smuggling et les mises à niveau recommandées.

La prise en charge améliorée de Python permet également de déclencher automatiquement des pull requests pour les nouvelles vulnérabilités, selon votre configuration (plus de détails ci-dessous). Les pull requests ouvertes par Snyk fournissent des informations contextuelles pour vous aider à comprendre pourquoi elles ont été déclenchées, quelles modifications la correction apportera à vos dépendances, ainsi que des détails sur la vulnérabilité qu’elle vise à corriger.

Demande de tirage GitHub de Snyk bot montrant des correctifs pour deux dépendances Python vulnérables dans requirements.txt.

Pull requests de test

Toute nouvelle pull request modifiant le fichier requirements.txt est automatiquement testée afin de vérifier qu’elle n’introduit pas de nouvelles vulnérabilités de sécurité dans votre projet. Si des vulnérabilités sont détectées, la pull request échoue au test de sécurité, et vous pouvez décider de poursuivre ou non sa fusion.

Demande de tirage GitHub affichant un contrôle de sécurité échoué avec sept vulnérabilités, un contrôle de licence réussi et aucun conflit de fusion.

Vous pouvez configurer toutes ces automatisations. Les pull requests de test et de correction peuvent être désactivées. Pour les pull requests de test, vous pouvez également définir les conditions d’échec.

Page des paramètres de Snyk affichant les vérifications activées des pull requests, les conditions d’échec et les pull requests de correction automatique avec des correctifs pour les dépendances vulnérables.

La sécurité pensée pour les développeurs avec Snyk

Surveiller les dépendances vulnérables figure parmi les principales bonnes pratiques de sécurité Python. Plus facile à dire qu’à faire, n’est-ce pas ? La facilité avec laquelle du code tiers peut être intégré aux projets et l’essor général de l’open source compliquent toujours plus la visibilité et le contrôle de ce code.

Snyk a été conçu pour aider les développeurs à relever ce défi en leur proposant un outil facile à utiliser qui s’intègre naturellement à leurs workflows existants et automatise la détection et la correction des vulnérabilités dans les dépendances open source.

La correction automatisée pour Python est disponible dans toutes les offres Snyk Open Source, y compris notre offre gratuite, qui comprend un nombre illimité d’analyses de projets open source. Pour l’essayer, créez un compte (via le lien ci-dessous) et lancez une analyse. En attendant, ces ressources vous aideront à sécuriser vos projets Python :

Bon codage !

Lancez-vous dans les compétitions Capture The Flag

Apprenez à résoudre des défis de capture du drapeau en regardant à la demande notre atelier virtuel d’initiation.