Objectifs du module :

  • Comprendre les risques de sécurité associés à l’utilisation de dépendances et de bibliothèques externes dans le développement de logiciels.
  • Mettre en place des outils d’automatisation pour détecter et corriger les vulnérabilités dans les dépendances.
  • Adopter des bonnes pratiques pour maintenir les dépendances à jour et sécurisées.

1. Problèmes de sécurité liés à l'utilisation des dépendances et bibliothèques externes

a. Introduction à la gestion des dépendances

Qu’est-ce qu’une dépendance ?
Une dépendance est une bibliothèque ou un composant externe qu’un développeur intègre dans un projet pour accélérer le développement en réutilisant des fonctionnalités existantes.

Pourquoi utiliser des dépendances ?
Elles permettent de gagner du temps et d’ajouter des fonctionnalités complexes sans les développer soi-même, comme des frameworks, des bibliothèques de chiffrement ou des API tierces.

b. Risques de sécurité liés aux dépendances

Vulnérabilités dans les bibliothèques :
Les bibliothèques externes peuvent contenir des failles de sécurité qui sont exploitées par des attaquants pour compromettre une application. Cela peut être dû à un code mal sécurisé, obsolète ou mal maintenu.

Exemple de failles connues dans des bibliothèques populaires :

  • Log4Shell (CVE-2021-44228) : Vulnérabilité critique dans Log4j, une bibliothèque de journalisation Java, qui a permis l’exécution de code à distance.
  • Heartbleed (CVE-2014-0160) : Vulnérabilité dans OpenSSL, utilisée pour sécuriser les communications chiffrées, permettant la fuite d’informations sensibles.

Problème de la confiance excessive dans des composants tiers :

  • Les développeurs ne vérifient pas toujours la qualité et la sécurité du code des bibliothèques qu’ils intègrent.
  • Une dépendance compromise peut introduire une porte dérobée ou des logiciels malveillants dans l’application.

c. Attaques liées aux dépendances

Typosquatting et attaques sur les paquets :
Les attaquants publient des bibliothèques malveillantes avec des noms proches de bibliothèques populaires, espérant que des développeurs les installeront par erreur (par exemple expresss au lieu de express en Node.js).

Substitution de dépendances :
Si une dépendance légitime est abandonnée, un attaquant peut revendiquer le nom et publier une version compromise. Cela peut aussi se produire si les mainteneurs originaux sont négligents avec les permissions sur le registre de paquets.

2. Automatisation de la détection des vulnérabilités dans les dépendances (Snyk, Dependabot)

a. Pourquoi automatiser la détection des vulnérabilités ?

Évolution constante des vulnérabilités :
Les failles de sécurité dans les dépendances sont régulièrement découvertes, et il est difficile de les surveiller manuellement. L'automatisation permet de détecter rapidement les problèmes et de réagir avant qu’ils ne soient exploités.

Gestion du grand nombre de dépendances :
Les projets modernes utilisent souvent des dizaines, voire des centaines de dépendances, rendant la gestion manuelle impossible.

b. Outils populaires pour la gestion automatique des vulnérabilités

Snyk :
Un outil SaaS qui scanne les dépendances pour identifier les vulnérabilités connues dans les bibliothèques utilisées par un projet. Il fournit également des suggestions pour corriger les failles, comme la mise à jour vers une version plus sécurisée.

Fonctionnalités clés :

  • Scanne les projets pour identifier les dépendances vulnérables.
  • Intègre des alertes sur les vulnérabilités connues via les bases de données CVE.
  • Fournit des correctifs automatiques et des suggestions de mises à jour.

Vidéo de Snyk:

Dependabot (GitHub) :
Un outil natif de GitHub qui vérifie régulièrement les dépendances et propose des mises à jour lorsque des versions corrigées sont disponibles.

Fonctionnalités clés :

  • Automatisation des mises à jour des dépendances dans les dépôts GitHub.
  • Génère des pull requests lorsque des nouvelles versions sécurisées sont disponibles.
  • Analyse des bases de données de vulnérabilités publiques pour alerter sur les failles.

Vidéo de Devoxx FR:

c. Intégration dans les pipelines CI/CD

Automatiser la détection dans la chaîne DevOps :
Intégrer des outils comme Snyk ou Dependabot dans le pipeline CI/CD permet de scanner les dépendances lors de chaque build et de déclencher des alertes si des vulnérabilités sont découvertes.

Exécution des tests de sécurité automatisés :

  • Lors de chaque commit ou nouvelle build, le pipeline CI peut exécuter des outils de scan de dépendances.
  • Si une faille est détectée, le déploiement peut être bloqué jusqu’à correction.

3. Bonnes pratiques pour mettre à jour et gérer les dépendances

a. Maintenir les dépendances à jour

Pourquoi il est essentiel de mettre à jour régulièrement ?
Les versions obsolètes des bibliothèques contiennent souvent des failles de sécurité qui sont corrigées dans les versions plus récentes. Ignorer ces mises à jour expose l’application aux attaques.

Stratégie de mise à jour régulière :

  • Mettre en place un processus de mise à jour planifié des dépendances.
  • Tester les nouvelles versions dans un environnement isolé avant de les déployer en production.
  • Utiliser des outils comme Dependabot ou Renovate pour automatiser la gestion des mises à jour.

b. Évaluer les dépendances avant utilisation

Vérifier la sécurité des bibliothèques avant de les intégrer :
Avant d'ajouter une nouvelle dépendance à un projet, il est important d’évaluer sa sécurité et sa qualité. Cela peut se faire en vérifiant :

  • La réputation de la bibliothèque.
  • La fréquence des mises à jour.
  • Le nombre de contributeurs actifs et les retours de la communauté.
  • Les éventuelles vulnérabilités répertoriées dans les bases CVE (Common Vulnerabilities and Exposures).

Limiter les dépendances inutiles :

  • Éviter de surcharger un projet avec des dépendances non essentielles.
  • Favoriser des bibliothèques maintenues activement et largement adoptées dans la communauté.

c. Isoler les dépendances

Utiliser des environnements isolés pour gérer les dépendances :
En utilisant des environnements de développement isolés (comme des environnements virtuels ou des conteneurs), les dépendances sont encapsulées et ne risquent pas d’entrer en conflit avec d’autres projets ou de polluer l'environnement global.

Exemple :

  • Pipenv ou Poetry pour Python.
  • npm avec des versions fixes pour Node.js.

d. Gérer les versions avec soin

Privilégier les versions fixes des dépendances :
Utiliser des versions fixes (par exemple express@4.17.1 au lieu de express@^4.17.0) garantit que la même version de la bibliothèque sera utilisée à chaque build, évitant les régressions dues à des mises à jour imprévues.

Exemple :

  • En Node.js, l’utilisation de package-lock.json permet de verrouiller les versions des dépendances, garantissant une stabilité du projet.
  • En Python, requirements.txt peut être utilisé pour spécifier les versions exactes des dépendances.

Conclusion du Module :

La gestion des dépendances et des bibliothèques externes est une composante essentielle de la sécurité dans le développement logiciel. En automatisant la détection des vulnérabilités et en suivant les bonnes pratiques pour maintenir les dépendances à jour, les développeurs peuvent réduire considérablement les risques associés à l’utilisation de composants tiers.

Formateur

Bertrand LECLERCQ

Consultant DevSecOps & Data Engineer


Avec 25 ans d'expérience dans le développement logiciel et une certification en Data Engineering de l'École des Mines Paris - PSL, je suis passionné par la cybersécurité, le big data et le DevOps. J'aime partager mes connaissances et aider la communauté à renforcer sa posture de sécurité.

J'ai créé une base de vulnérabilités librement accessible et je me forme en continu sur des plateformes comme TryHackMe. Mon objectif ? Démocratiser la cybersécurité et permettre à chacun de mieux comprendre les enjeux.

J'ai une solide expertise dans la conception et le déploiement de solutions sécurisées, ainsi qu'une expérience éprouvée dans la gestion de projets complexes. Maîtrisant un large éventail de technologies (Python, Go, Java, Docker, Kubernetes, etc.), je suis convaincu que la sécurité doit être intégrée dès le début du cycle de développement.

Le projet NoHackMe vous permet d'effectuer une veille Cyber, vous permet de découvrir le monde de la Cybersécurité ainsi qu'une section formation Cyber

Soutenez No Hack Me sur Tipeee