Lisez notre article sur

.

Un guide pour prendre conscience des risques auxquels vous êtes exposés et quelques conseils pour vous en prémunir.
Un nouveau type de cybermenace est apparu récemment : les attaques de la chaîne d'approvisionnement en logiciels. Bien que rares, elles ont un impact considérable et la protection contre ces attaques est une préoccupation croissante. En raison de la diversité des cas d'utilisation, il n'y a pas de règle unique à appliquer à vos projets Python pour être en sécurité et, comme toujours, cela dépend de votre contexte.

Introduction

Dans les industries traditionnelles, une chaîne d'approvisionnement est tout ce qui permet à une entreprise de livrer un produit au client. Par exemple, lorsque vous achetez un croissant à la boulangerie, tous les ingrédients, l'emballage et le transport font partie de la chaîne d'approvisionnement.

Dans le domaine du logiciel, une chaîne d'approvisionnement est tout ce qui affecte votre logiciel avant son déploiement en production. Elle couvre tout, de la phase de développement au processus de mise en production, y compris le code que vous avez écrit, vos dépendances, votre environnement de construction, votre IDE, votre registre d'images - chaque composant avec lequel votre logiciel interagit à un moment ou à un autre !

Le terme “chaîne d'approvisionnement” a récemment été mis en lumière par des cyberattaques qui ont eu un impact considérable. Parmi toutes les attaques, Solarwinds est peut-être la plus célèbre. En effet, le gouvernement américain, de grandes entreprises technologiques comme Microsoft et Intel, mais aussi des hôpitaux, des compagnies d'électricité et des institutions financières ont été touchés.

Ironiquement, la cause première est l'infection de Solarwinds Orion, un moniteur de sécurité réseau. Le système de construction a été compromis et toutes les nouvelles versions entre mars et juin 2020 ont été infectées par des logiciels malveillants. Par conséquent, tous les clients qui ont mis à jour leur logiciel au cours de cette période ont été compromis.

Même si l'attaque de Solarwinds a été largement couverte par les médias, il existe des dizaines d'attaques similaires dont nous n'avons jamais entendu parler. Heureusement, la Cloud Native Computing Foundation les recense toutes dans une base de données. dépôt public. Vous serez peut-être surpris par l'accélération de ces attaques au cours des dernières années.

Il n'est pas possible de couvrir tous les aspects liés à la sécurité de la chaîne d'approvisionnement dans un seul article de blog. C'est pourquoi nous nous concentrerons dans cet article sur les projets qui utilisent Python comme langage principal.

Comment gérer vos dépendances en Python ?

Même si Python a une philosophie “batteries incluses”, vous avez souvent besoin de bibliothèques externes que vous pouvez télécharger à partir de PyPI, l'index officiel des paquets, et c'est à ce stade que vous devez être très prudent.

L'écosystème Python a déjà été ciblé, notamment par l'utilisation de deux techniques :

  • Le squattage de typos
  • Confusion de dépendance

La première technique concerne une commande que tout développeur Python a exécutée au moins une fois au cours de sa carrière :

pip install 

Les pirates publient des paquets portant presque le même nom que des paquets existants en espérant que vous ferez une erreur de frappe et que vous installerez leur paquet au lieu du paquet officiel. Par exemple, un paquet appelé python3-dateutil au lieu de l'officiel dateutil a été récemment détecté.

La communauté python est travailler dur pour atténuer le risque, mais celui-ci reste élevé.

La deuxième technique, la confusion de dépendance, est plus sophistiquée que la première. tuyau fonctionne sous le capot.

Cette fois, cette commande vous expose au risque :

pip install --extra-index-url 

Lorsque vous tapez cette commande, voici ce qui se passe :

Image

Prenons un exemple :

Image

Dans cet exemple, le paquet du hacker malveillant sera installé sur la machine. En effet, le numéro de version le plus élevé figure dans l'index public des paquets.

Vous avez peut-être compris ce qui peut mal se passer avec ce processus. Quelqu'un de mal intentionné peut publier sur un dépôt public des paquets portant les mêmes noms que ceux hébergés dans les index de paquets internes et les étiqueter avec un numéro de version ridiculement élevé. De plus, trouver des noms de paquets pertinents n'est pas si difficile que cela. démontré par ce chercheur en sécurité.

Cette commande pourrait être qualifiée d“”insecure by design". Cette attaque exploite une fonctionnalité du gestionnaire de paquets Python et seuls quelques développeurs sont au courant de ce comportement.

Image

Comment se défendre contre ces attaques de la chaîne d'approvisionnement ?

Pour vous prémunir contre les attaques de "typo-squatting", vous pouvez utiliser un filtre de type verrouiller le fichier. A bon fichier de serrure possède les attributs suivants :

  • Broches de version :ils rendent vos constructions prévisibles et déterministes.

  • Hachures : ils permettent de vérifier l'intégrité du paquet.

  • Graphique de dépendance complet : cela vous permet également de contrôler les dépendances de vos dépendances.

La bonne nouvelle, c'est qu'il existe un paquet dont le but est de créer un fichier de verrouillage pour vous : pip-tools. Quelques commandes suffisent pour générer un fichier de verrouillage doté de tous les attributs décrits précédemment.

$ python3 -m venv my-env # créer un nouvel environnement virtuel
$ source my-env/bin/activate # activez-le
$ pip install pip-tools==6.3.0 # installez le paquet qui vous permettra de gérer correctement les dépendances.
de gérer correctement vos dépendances
$ echo “sacremoses==0.0.46” >> requirements.in # ajoutez le paquet de votre choix dans requirements.in.
votre choix dans requirements.in
$ pip-compile --generate-hashes # compile le fichier requirements.txt avec des
des hachages basés sur ce que vous avez mis dans requirements.in

Votre fichier requirements.txt doit ressembler à ceci :

Image

Maintenant que vous avez ce fichier qui contient toutes vos dépendances avec leurs versions et hachages associés, vous pouvez exécuter la commande suivante lors du prochain déploiement :

pip install --require-hashes -r requirements.txt

Ainsi, vous êtes sûr que les paquets que vous utilisez en production n'ont pas été modifiés. En supposant que vous ayez été prudent lors de l'écriture de votre exigences.in 👀, vous pouvez également être sûr de télécharger le paquet que vous voulez vraiment, car tout est automatisé. Aucun risque de faute de frappe !

Cette bonne pratique permet de se prémunir contre les attaques de "typo-squatting", mais qu'en est-il de la confusion des dépendances ?

Si vous regardez le tuyau vous verrez qu'il y a deux options que vous pouvez utiliser pour télécharger des paquets à partir d'un dépôt interne :

  • --extra-index-url
  • --index-url

La documentation indique :

Image

Comme vous pouvez le constater, il existe une légère différence entre les deux et elle n'est pas évidente à première vue. La différence réside dans le fait que si vous avez spécifié l'option --index-url option, tuyau n'extraira que les paquets du dépôt dont vous avez fourni l'URL, et non des dépôts publics. Donc, si vous voulez éviter le comportement que nous avons décrit plus tôt, utilisez --index-url plutôt que --extra-index-url et vous serez en sécurité !

Enfin, pour suivre les dernières vulnérabilités découvertes dans vos dépendances, vous pouvez choisir de vérifier périodiquement le fichier Avis GitHub database ou mieux, utilisez des outils tels que robot dépendant qui soumettra automatiquement une pull request sur votre repo pour mettre à jour une dépendance dans laquelle une vulnérabilité critique a été récemment identifiée.

Résumé

Dans cet article, nous avons introduit le concept de chaîne d'approvisionnement pour le monde du logiciel. Nous avons spécifiquement étudié comment ce concept s'applique à l'écosystème Python. Le typo-squatting et la confusion des dépendances ont été expliqués et des solutions ont été proposées pour atténuer le risque d'être compromis.

Cette brève introduction à la sécurité de la chaîne d'approvisionnement n'a couvert que la partie émergée de l'iceberg, nous n'avons pas eu l'occasion de discuter de la manière dont la sécurité de la chaîne d'approvisionnement est assurée. construire des systèmes ou même votre IDE peut être compromise, mais je laisse cela pour un autre article !

Merci d'avoir lu jusqu'ici ! Je serais heureux d'entendre vos commentaires. Si vous avez apprécié cette lecture, n'hésitez pas à consulter notre rubrique postes ouverts à l'adresse Artefact 🙂 .

Moyen Blog par Artefact.

Cet article a été initialement publié sur Medium.com.
Suivez-nous sur notre Medium Blog !