Skip to main content

In this article

Gestionnaire de paquets Python Poetry et intégration de la sécurité avec un outil d’analyse de la composition logicielle

Écrit par
Headshot of Abhay Bhargav

Abhay Bhargav

Python Poetry

13 novembre 2020

0 minutes de lecture

J’ai toujours pensé que les gestionnaires de paquets pouvaient être une arme redoutable dans la lutte contre les dépendances vulnérables. S’ils permettaient de détecter ces dépendances, les développeurs pourraient identifier et corriger leurs vulnérabilités plus facilement et plus rapidement, plutôt que de les laisser s’immiscer dans le processus de build.

Pour que cela fonctionne, la solution doit toutefois être :

  1. simple — très facile à utiliser

  2. intégrée — elle doit s’inscrire dans le workflow des développeurs et fonctionner avec le gestionnaire de paquets concerné

J’ai récemment commencé à utiliser le système de gestion de paquets Python Poetry. J’aime beaucoup son organisation et la manière dont il atteint certains de ses objectifs déclarés. J’espérais donc trouver une fonctionnalité d’analyse de sécurité pouvant s’y intégrer.

C’est pourquoi j’ai été ravi d’apprendre que Snyk avait récemment lancé une nouvelle fonctionnalité prenant en charge le gestionnaire de paquets Poetry et la poetry lock syntax. Pour voir de plus près comment cela fonctionne, je me suis connecté à mon compte de test Snyk que je venais de créer, puis j’ai créé un projet contenant des dépendances volontairement vulnérables.

DevSecOps with Poetry and Source Composition Analysis

J’ai saisi la commande pour créer un projet appelé Poetry snyk. Elle a créé un répertoire nommé « poetry snyk » et un paquet nommé poetry_snyk — essentiellement du code standard, ainsi qu’un paquet TOML.

Si je me rends dans poetry_snyk et que j’exécute tree,, je vois un fichier readme qui contient le nom du paquet racine poetry_snyk. Le fichier TOML est le descripteur de Poetry et contient également des tests standard — plus ou moins un test pytest qu’il a généré.

Terminal affichant un projet Python Poetry nommé poetry-snyk et son arborescence, avec les fichiers source, les tests et le fichier README.

Dans le projet TOML, vous pouvez voir que nous utilisons Python 3.7(une version légèrement ancienne de Python, je l’admets, mais c’est néanmoins la version locale de Python que j’utilise pour des raisons de dépendances). Nous utilisons également une dépendance de développement de test appelée pi test — en l’occurrence, la pi test 5.2 version (3.7 correspond au cœur Python de pi, qui propose également un build que je n’utilise pas).

Il faut savoir que Poetry remplace les fichiers requirements.txt et setup.py auparavant nécessaires par un fichier TOML. Ainsi, avec Poetry, vous pouvez non seulement configurer et suivre les dépendances, mais aussi créer des éléments et les publier sur le Python cheese shop. Il est assez intéressant de constater qu’un seul fichier TOML peut remplacer les fichiers setup.py et requirements.txt dans leur intégralité.

Visual Studio Code affichant le fichier pyproject.toml d’un package Python nommé poetry-snyk, avec ses dépendances Poetry et ses paramètres de compilation.

Ce que j’apprécie avec Poetry, par rapport aux gestionnaires de paquets précédents, c’est qu’il s’agit d’une solution intégrée plutôt que d’un assemblage de solutions disparates.

Beaucoup des gestionnaires de paquets que j’ai utilisés auparavant — même Pipenv — me semblaient incomplets, car ils reposaient sur la base de code du gestionnaire de paquets pip et faisaient davantage office de wrapper. Je trouve que Poetry va plus loin, car il reformule le problème en combinant, d’une part, le meilleur de npm, avec son descripteur et son fichier de verrouillage, et, d’autre part, le système de gestion de paquets Cargo de Rust. Le gestionnaire de paquets Cargo pour Rust fournit d’emblée de la documentation et des tests. Je pense que Poetry a essayé de combiner ces deux aspects et de proposer cette approche.

Nous avons maintenant créé un nouveau projet Poetry appelé poetry_snyk et configuré le projet, mais nous devons également installer des bibliothèques pour le faire fonctionner. Comme je l’utilise avec Snyk, je veux le tester avec des bibliothèques non sécurisées — généralement des bibliothèques déjà connues — afin de voir si Snyk peut les détecter lors de l’analyse. Snyk a besoin que deux fichiers soient disponibles. Ajoutons donc des dépendances à notre projet à l’aide du code suivant : 

Visual Studio Code affiche le fichier pyproject.toml d’un projet Poetry et la commande de terminal `poetry add python-docx==0.8.3`.

Il s’agit d’un projet docx project python.xproject qui permet d’analyser et de créer des fichiers docx. Il est vulnérable à une faille liée aux entités externes XML. C’est une faille assez grave que j’ai présentée plusieurs fois lors de mes formations.

En gros, si vous chargez un document Word malveillant contenant une entité XML définie sur une valeur telle que /etc/passwd, la bibliothèque docx résout cette entité, ce qui entraîne une inclusion de fichier local et peut même être combiné à d’autres techniques pour créer un exploit d’exécution de code à distance. Je vais toutefois l’installer : les dépendances et les dépendances imbriquées seront résolues. Le fichier TOML sera également mis à jour et un fichier poetry.lock sera ajouté. Le fichier poetry.lock répertorie toutes les dépendances imbriquées de cette dépendance de premier niveau.

Éditeur de code sombre affichant un fichier poetry.lock avec les définitions des packages atomicwrites et attrs, ainsi que les dépendances de développement.

Vous pouvez constater qu’il répertorie toutes les dépendances imbriquées nécessaires, car tous les outils d’analyse — en particulier Snyk et de nombreux autres outils d’analyse du code source ou des paquets — en ont besoin pour analyser ces dépendances.

En plus des dépendances imbriquées, le fichier indique également la version utilisée pour chacune d’elles, ainsi que sa valeur de hachage, afin de garantir une correspondance correcte. C’était une lacune importante de l’écosystème Python, car le gestionnaire de dépendances pip, le gestionnaire de dépendances Python par défaut, ne fournissait pas tous ces détails : il se contentait de les répertorier sans verrouiller précisément les versions. Il ne gérait donc pas très bien les sous-dépendances.

Imaginons que j’installe un autre paquet avec Poetry. J’installe un autre paquet Python vulnérable, en l’occurrence pyyaml. Je vais utiliser la version 3.13, qui est vulnérable à une faille de désérialisation non sécurisée. Si cette faille est exploitée, l’attaquant peut exécuter du code à distance dans l’environnement de l’application cible. Je vais l’installer, et vous verrez que cela devrait également mettre à jour mon fichier TOML et mon fichier de verrouillage.

Terminal de Visual Studio Code exécutant `poetry add pyyaml==3.13` lors de l’installation du package PyYAML.
Terminal affichant la commande « poetry add pyyaml==3.13 » et le résultat de l’installation du package, avec les sommes de contrôle des fichiers PyYAML ci-dessus

Surveillons maintenant le projet avec Snyk en saisissant le code suivant :

Terminal affichant « poetry-snyk snyk monitor » et analysant les dépendances Poetry de pyproject.toml.
Terminal affichant la sortie de l’installation des dépendances Poetry et un lien vers un instantané Snyk encadré en rouge.

On dirait que toutes mes dépendances ont été analysées. Voici mon projet Snyk — ou mon organisation Snyk — généré avec la liste de tous mes projets. Vous voyez que j’ai créé ce projet.

Tableau de bord affichant le projet poetry-snkyproject.com, le nombre de problèmes de sécurité détectés et un bouton « Ajouter un projet »
Tableau de bord du projet poetry-snyk:project.toml affichant les détails du projet, sa source, son hôte, son environnement d’exécution et les informations de surveillance

Comme vous pouvez le voir, des problèmes ont été signalés et ils sont tous de gravité élevée : la désérialisation non sécurisée dans pyyaml, la même exécution de code à distance dans pyyaml, un exploit bien connu et sérieux, ainsi que les injections d’entités externes XML dans python-docx. Grâce à sa base de données complète et à la simplicité de son intégration, Snyk a détecté toutes les vulnérabilités présentes dans les dépendances utilisées par ce projet !

Rapport de vulnérabilité Snyk présentant un problème d’exécution de code arbitraire de gravité élevée dans PyYAML, avec des détails sur sa correction
Rapport de vulnérabilité Snyk présentant une injection XML External Entity (XXE) de gravité élevée dans le package python-docx, avec des détails sur la correction.

Pour commencer

Pour commencer à utiliser cette intégration, il vous suffit d’installer votre projet Poetry. Snyk peut alors le suivre et vous envoyer des notifications par e-mail au sujet de ces dépendances. C’est vraiment pratique !

 J’ai pu configurer rapidement un projet Poetry, l’analyser avec Snyk pour détecter les problèmes de sécurité et obtenir un rapport détaillé sur leurs conséquences.

N’oubliez pas que Snyk a besoin de ces deux fichiers — le fichier de verrouillage et le fichier TOML — pour que l’intégration fonctionne.

Visual Studio Code affiche un projet Poetry avec les fichiers poetry.lock et pyproject.toml, tandis que le terminal met à jour les dépendances et installe des packages

Lire la suite

blog feature snyk container custom base recommendations
Blog

Découvrez Evo Agentic AppSec : une sécurité au rythme du développement de l’IA

Le développement piloté par l’IA dépasse les capacités des processus de sécurité traditionnels. Agentic AppSec de Snyk s’appuie sur des agents de sécurité pour détecter, corriger et vérifier les vulnérabilités en continu, tandis que les équipes définissent les exigences.

feature insights context
Blog

Les attaques autonomes sont déjà là. La défense doit suivre leur rythme.

Les attaquants autonomes réduisent la fenêtre de défense. Découvrez comment la découverte, la correction, la validation et la prévention continues peuvent aider les équipes de sécurité à suivre le rythme.

feature insights context
Blog

La prévention est-elle essentiellement un problème résolu ?

La prévention dans le code généré par les agents est résolue sur le plan architectural, mais le défi reste de choisir des contrôles qui protègent la sécurité sans ralentir le développement.