1. Risques liés à l’utilisation de dépendances non sécurisées (vulnérabilités dans les packages)

Dans le développement moderne, les développeurs s'appuient couramment sur des dépendances ou des bibliothèques tierces pour accélérer le développement, éviter de réinventer la roue, et profiter de fonctionnalités robustes déjà créées et testées par d'autres. Cependant, ces dépendances peuvent aussi être une source de vulnérabilités et de failles de sécurité si elles ne sont pas gérées correctement. Voici quelques-uns des principaux risques auxquels les développeurs sont confrontés lorsqu'ils utilisent des dépendances non sécurisées.

Vulnérabilités connues

Les dépendances peuvent contenir des failles de sécurité qui sont répertoriées dans des bases de données publiques de vulnérabilités, telles que la CVE (Common Vulnerabilities and Exposures). Lorsqu'une faille de sécurité est découverte dans une bibliothèque tierce, elle est signalée dans ces bases de données, ce qui permet aux développeurs d'en être informés et de mettre à jour leurs bibliothèques pour corriger les problèmes. Cependant, si ces dépendances ne sont pas mises à jour régulièrement, les applications qui les utilisent restent exposées aux attaques.

Exemple :

Prenons l'exemple d'une application qui utilise une bibliothèque JavaScript populaire pour gérer les formulaires. Si une vulnérabilité est découverte dans cette bibliothèque et que l'équipe de développement n'applique pas les mises à jour de sécurité, un attaquant pourrait exploiter cette faille pour injecter du code malveillant dans l'application. Cela pourrait permettre à l'attaquant de manipuler des données sensibles ou même de prendre le contrôle du site.

Les vulnérabilités connues dans les bibliothèques populaires sont une cible de choix pour les attaquants, car une seule faille non corrigée peut affecter des milliers, voire des millions d'applications.

Dépendances transitoires

Les dépendances ne sont pas toujours directes. Une dépendance transitoire est une bibliothèque tierce qui est elle-même utilisée par une autre bibliothèque. Cela signifie que lorsque vous ajoutez une dépendance à votre projet, celle-ci peut à son tour avoir plusieurs autres dépendances, créant une chaîne complexe. Dans cette configuration, une vulnérabilité dans une dépendance indirecte peut être difficile à repérer et peut passer inaperçue si elle n'est pas surveillée activement.

Exemple :

Imaginons que vous utilisez une bibliothèque de gestion de fichiers dans votre application. Cette bibliothèque dépend elle-même d’une autre bibliothèque pour gérer les protocoles réseau. Si une vulnérabilité est découverte dans la bibliothèque réseau, cette faille pourrait affecter votre application sans que vous soyez au courant, car elle provient d’une dépendance transitoire que vous n'avez pas explicitement ajoutée.

C'est là qu'intervient l'importance des outils d'analyse de dépendances (comme Snyk, Dependabot ou Renovate), qui permettent de surveiller non seulement les dépendances directes, mais aussi les dépendances transitoires afin de détecter les failles et les mettre à jour automatiquement.

Packages compromis

Dans certains cas, des bibliothèques open-source peuvent être compromises par des acteurs malveillants. Une technique connue sous le nom de typosquatting consiste à publier un package malveillant sous un nom très similaire à celui d'une bibliothèque légitime et populaire, dans l'espoir que les développeurs fassent une erreur de frappe lors de l'ajout de la dépendance à leur projet. D'autres fois, un acteur malveillant peut obtenir l'accès à un projet open-source légitime et injecter du code malveillant dans les versions suivantes du package.

Exemple :

En 2021, une attaque a été menée via un package malveillant nommé ua-parser-js. Ce package, qui est utilisé par de nombreuses applications JavaScript, avait été compromis par des attaquants. Ces derniers ont injecté du malware dans une version du package, qui, une fois téléchargée et installée par les développeurs, pouvait être utilisée pour voler des informations sensibles sur les systèmes infectés.

Conséquences des vulnérabilités dans les dépendances

Les conséquences de l'utilisation de dépendances non sécurisées peuvent être désastreuses. Voici quelques-unes des principales répercussions :

  • Fuite de données : Une faille dans une bibliothèque utilisée pour traiter des données sensibles, comme des informations d'identification ou des transactions financières, peut entraîner des fuites massives de données.
  • Exécution de code à distance : Certaines vulnérabilités permettent à des attaquants d'exécuter du code malveillant à distance sur le serveur qui héberge l'application. Cela peut entraîner une compromission complète de l'infrastructure.
  • Perte de confiance : Si une faille de sécurité dans une dépendance entraîne une violation de la sécurité de l'application, la réputation de l'entreprise peut en souffrir considérablement, entraînant une perte de confiance des clients et des utilisateurs.

Bonnes pratiques pour éviter les risques liés aux dépendances non sécurisées

Pour minimiser les risques liés aux dépendances non sécurisées, les développeurs peuvent suivre quelques bonnes pratiques :

  • Surveiller régulièrement les vulnérabilités : Utilisez des outils de surveillance des dépendances comme Snyk, Dependabot, ou WhiteSource pour être alerté en cas de vulnérabilité dans vos bibliothèques et pour appliquer rapidement les correctifs nécessaires.
  • Maintenir à jour les dépendances : Assurez-vous que toutes vos dépendances, ainsi que leurs dépendances transitoires, sont à jour. De nombreux gestionnaires de packages, comme npm (pour JavaScript), pip (pour Python), ou Composer (pour PHP), fournissent des moyens de mettre à jour les bibliothèques à intervalles réguliers.
  • Limiter le nombre de dépendances : N'ajoutez que les dépendances strictement nécessaires à votre projet. Moins vous avez de bibliothèques, moins vous serez exposé à des failles potentielles.
  • Vérifier l'authenticité des packages : Avant d'ajouter une nouvelle dépendance, vérifiez son historique et sa réputation. Consultez les avis de sécurité et assurez-vous qu’il s'agit d'un projet activement maintenu avec une communauté de développeurs fiable.
  • Auditer régulièrement les dépendances : Effectuez des audits de sécurité réguliers sur les dépendances utilisées dans vos projets. De nombreux gestionnaires de packages offrent des fonctionnalités d’audit automatique pour vérifier la sécurité des bibliothèques (par exemple, la commande npm audit pour les projets JavaScript).

2. Outils pour la gestion des dépendances (Snyk, Dependabot)

L'utilisation de bibliothèques tierces ou de dépendances dans les projets logiciels est devenue essentielle pour accélérer le développement et intégrer des fonctionnalités éprouvées. Cependant, ces dépendances peuvent introduire des vulnérabilités si elles ne sont pas régulièrement mises à jour ou si elles contiennent des failles de sécurité. Pour atténuer ces risques, des outils de gestion des dépendances comme Snyk et Dependabot permettent d’automatiser la surveillance des dépendances et de proposer des correctifs pour maintenir un haut niveau de sécurité dans les projets logiciels.

Snyk

Snyk est un outil de sécurité très populaire qui aide les développeurs à identifier, gérer, et corriger les vulnérabilités dans les dépendances open-source, les conteneurs Docker, et même dans le code infrastructure-as-code. Il est conçu pour s’intégrer dans le cycle de développement et les pipelines CI/CD afin de fournir une sécurité continue et proactive.

Principales fonctionnalités de Snyk :

  • Identification des failles dans les dépendances et les conteneurs : Snyk analyse automatiquement les dépendances d’un projet pour rechercher des failles de sécurité connues (répertoriées dans les bases de données de vulnérabilités comme la CVE). Il permet également d'analyser les images Docker pour s'assurer qu'elles ne contiennent pas de bibliothèques obsolètes ou vulnérables.

Exemple : Si une bibliothèque JavaScript que vous utilisez contient une vulnérabilité XSS, Snyk l’identifiera et vous fournira des informations détaillées sur la faille ainsi que des recommandations de correctif.

  • Suggestions automatiques de mises à jour de version : Lorsqu'une vulnérabilité est détectée, Snyk ne se contente pas de signaler le problème. Il propose également une mise à jour de version pour corriger la faille, ce qui permet de résoudre rapidement les problèmes de sécurité sans avoir à chercher manuellement les correctifs.

Exemple : Si une faille critique est détectée dans une version 1.2 d'une bibliothèque que vous utilisez, Snyk vous suggérera automatiquement de passer à la version 1.3, où la vulnérabilité a été corrigée.

  • Intégration avec les pipelines CI/CD : Snyk s'intègre directement dans les outils d’intégration continue (CI) et de livraison continue (CD) tels que Jenkins, GitLab CI, ou Travis CI. Cela permet d’effectuer des scans automatiques à chaque nouvelle construction ou mise à jour de l'application, garantissant que les nouvelles versions ne contiennent pas de dépendances vulnérables.

Exemple : Lorsqu’un développeur soumet un nouveau code ou une mise à jour, Snyk effectuera automatiquement un scan de sécurité et, s'il trouve des vulnérabilités, arrêtera le déploiement ou alertera l’équipe pour qu'elle prenne les mesures nécessaires.

Dependabot

Dependabot est un outil développé par GitHub qui simplifie la gestion des dépendances en surveillant automatiquement les bibliothèques utilisées dans un projet et en proposant des mises à jour via des pull requests (PR) lorsque des failles de sécurité sont découvertes. Dependabot est intégré nativement dans GitHub, ce qui en fait un choix idéal pour les projets hébergés sur cette plateforme.

Principales fonctionnalités de Dependabot :

  • Surveillance des bibliothèques utilisées dans le projet : Dependabot analyse les fichiers de gestion des dépendances (comme package.json pour JavaScript, requirements.txt pour Python, ou composer.json pour PHP) et surveille les vulnérabilités associées à ces bibliothèques. Lorsqu'une nouvelle version d'une dépendance contenant un correctif est publiée, Dependabot le signale automatiquement.

Exemple : Si vous avez une application Node.js hébergée sur GitHub qui utilise un package vulnérable, Dependabot vous alertera dès qu’une version corrigée sera disponible pour cette dépendance.

  • Mise à jour automatique des dépendances via PR : Lorsqu'une vulnérabilité est découverte ou qu'une nouvelle version d'une bibliothèque est disponible, Dependabot crée automatiquement une pull request avec la version mise à jour de la dépendance. Il compare les versions, teste la compatibilité et propose la mise à jour pour correction.

Exemple : Si vous avez une application Python qui utilise une version vulnérable d’une bibliothèque, Dependabot soumettra automatiquement une pull request avec les modifications nécessaires pour passer à une version corrigée, en facilitant ainsi le processus de mise à jour.

  • Intégration native avec GitHub : Dependabot est intégré directement dans GitHub, ce qui permet de visualiser les mises à jour de sécurité et les pull requests dans l'interface de gestion des dépôts. Il est également possible de personnaliser la fréquence des mises à jour ou de gérer des dépendances spécifiques dans plusieurs projets.

Exemple : Si vous gérez plusieurs projets sur GitHub avec différentes dépendances, Dependabot peut surveiller chaque projet séparément et créer des pull requests dès qu'une mise à jour de sécurité est disponible pour chacun d'eux.

Comparaison entre Snyk et Dependabot

Bien que Snyk et Dependabot visent à résoudre le même problème, à savoir la gestion des dépendances et la correction des vulnérabilités, ils se différencient par leur approche et leurs fonctionnalités complémentaires.

  • Snyk offre une analyse de sécurité approfondie, couvrant non seulement les dépendances open-source, mais aussi les conteneurs Docker et l’infrastructure. Il propose des recommandations de mise à jour et peut même bloquer le déploiement de versions vulnérables grâce à ses intégrations CI/CD.
  • Dependabot, en revanche, est plus spécifique à GitHub et se concentre principalement sur l’automatisation des mises à jour des dépendances par des pull requests. Il est idéal pour les projets hébergés sur GitHub qui veulent une solution rapide et automatique pour la gestion des versions.

Importance de ces outils dans la sécurité des projets

Les vulnérabilités dans les dépendances représentent une part importante des failles de sécurité dans les applications modernes. Selon certaines études, jusqu'à 85% du code d'une application peut provenir de bibliothèques tierces. Il est donc crucial de surveiller et de mettre à jour régulièrement ces dépendances pour garantir la sécurité de l’application.

L'intégration de Snyk ou Dependabot dans les pipelines de développement permet de protéger automatiquement l’application contre les vulnérabilités connues et de réduire la charge de travail des équipes de développement. Ces outils permettent non seulement de gagner du temps, mais aussi d'améliorer la sécurité globale des projets logiciels.

3. Sécurisation des conteneurs Docker (scans d’images avec Clair, Falco, Trivy)

L’adoption des conteneurs dans les environnements DevOps a permis d'améliorer la portabilité des applications et leur isolation. Cependant, les images de conteneurs peuvent contenir des vulnérabilités provenant des bibliothèques utilisées ou des paquets du système d'exploitation. Il est donc essentiel d'adopter une approche proactive pour sécuriser ces images. Des outils comme Clair, Falco, et Trivy permettent d’analyser les images Docker, de surveiller les conteneurs en production, et de détecter les vulnérabilités avant qu’elles ne deviennent des menaces exploitables.

Clair

Clair est un outil de scan open-source développé par CoreOS (maintenant Red Hat) qui analyse les images Docker pour détecter des vulnérabilités. Il s'appuie sur des bases de données de vulnérabilités comme les CVE (Common Vulnerabilities and Exposures) pour identifier les failles de sécurité dans les paquets du système d'exploitation à l’intérieur des images.

Principales fonctionnalités de Clair :

  • Scan des images Docker pour détecter des failles connues : Clair analyse les couches des images Docker et compare les bibliothèques utilisées avec les bases de données de vulnérabilités pour identifier les failles potentielles.

Exemple : Si une image Docker contient une ancienne version de OpenSSL connue pour avoir des vulnérabilités, Clair le signalera avec une référence à la CVE correspondante.

  • Intégration avec les registres de conteneurs pour une analyse continue : Clair peut s’intégrer aux registres d'images Docker comme Docker Hub ou Quay.io pour effectuer des scans réguliers. Cela permet de garantir que les images nouvellement créées ou mises à jour ne contiennent pas de vulnérabilités connues.

Exemple : Lorsqu'une nouvelle image est poussée dans un registre, Clair la scanne automatiquement et signale immédiatement toute vulnérabilité identifiée.

  • Détection des vulnérabilités dans les dépendances du système d'exploitation : Clair se concentre sur les paquets installés dans les images Docker, notamment ceux des systèmes d’exploitation (comme les packages Debian, Ubuntu, Alpine). Il identifie les failles liées à ces composants critiques.

Exemple : Une image Docker basée sur Ubuntu pourrait contenir un package curl obsolète avec une faille de sécurité critique, ce que Clair signalera dans son rapport.

Falco

Falco est un outil de sécurité open-source développé par Sysdig, principalement utilisé pour la surveillance en temps réel des conteneurs et des environnements Kubernetes. Contrairement à Clair, qui se concentre sur les vulnérabilités statiques dans les images Docker, Falco analyse le comportement des conteneurs en production pour détecter les anomalies ou les violations de sécurité.

Principales fonctionnalités de Falco :

  • Analyse comportementale pour détecter les anomalies : Falco surveille les événements du noyau du système (comme les appels système) et détecte les comportements suspects dans les conteneurs. Cela inclut les tentatives d'accès non autorisées ou des actions anormales comme l'exécution de processus inattendus.

Exemple : Si un conteneur essaye de modifier des fichiers sensibles comme /etc/passwd ou tente de s’exécuter avec des privilèges root, Falco déclenchera une alerte.

  • Surveillance des conteneurs en production : En surveillant les activités des conteneurs en temps réel, Falco peut détecter et alerter immédiatement sur des comportements malveillants, offrant une protection active contre les menaces.

Exemple : Si une application contenue dans un conteneur est exploitée pour lancer une attaque DDoS ou télécharger des scripts malveillants, Falco interviendra et enverra une notification à l'équipe de sécurité.

  • Alarme en cas d’accès non autorisé ou de violation de politique de sécurité : Falco peut être configuré pour déclencher des alertes lorsqu'une violation de sécurité ou de politique se produit dans un environnement Docker ou Kubernetes. Il peut être utilisé en combinaison avec des systèmes d’alertes comme Prometheus ou ELK pour une gestion centralisée des incidents.

Exemple : Si un utilisateur non autorisé tente d'accéder à un conteneur en production via SSH, Falco enverra une alerte aux équipes de sécurité.

Trivy

Trivy est un outil open-source tout-en-un conçu pour scanner les images Docker, les dépendances des applications, ainsi que les configurations des infrastructures. Il analyse à la fois les packages du système d'exploitation et les bibliothèques applicatives pour identifier les vulnérabilités et les configurations non sécurisées.

Principales fonctionnalités de Trivy :

  • Scans de vulnérabilités dans les images Docker : Trivy analyse les images Docker à la recherche de vulnérabilités dans les paquets systèmes et les dépendances applicatives comme les bibliothèques utilisées dans le code source (Node.js, Python, etc.).

Exemple : Si une image Docker inclut une version vulnérable de node-fetch dans un projet JavaScript, Trivy identifiera cette vulnérabilité et fournira un rapport détaillé.

  • Détection des configurations non sécurisées : Trivy peut également analyser les fichiers de configuration Docker, Kubernetes, ou d'autres composants d’infrastructure pour identifier des paramètres non sécurisés (par exemple, des ports exposés ou des services mal configurés).

Exemple : Trivy peut détecter qu'un fichier de configuration expose un service critique sur un port public ou que certains conteneurs s'exécutent avec des privilèges root, ce qui représente un risque de sécurité.

  • Analyse des dépendances à l'intérieur des conteneurs : Trivy va plus loin en analysant les bibliothèques utilisées à l’intérieur du code source de l’application contenue dans le conteneur. Il fournit une vision complète des failles, des dépendances applicatives jusqu'aux packages système.

Exemple : Si un conteneur basé sur Python utilise une version vulnérable de Flask, Trivy signalera la faille dans cette dépendance.

Comparaison entre Clair, Falco, et Trivy

  • Clair est un excellent choix pour effectuer des scans statiques d’images Docker à la recherche de vulnérabilités dans les paquets systèmes. Il s’intègre bien avec les registres de conteneurs pour une analyse continue.
  • Falco, quant à lui, se concentre sur la sécurité en temps réel. Il est parfait pour surveiller les comportements anormaux en production, offrant une surveillance active pour les conteneurs et les environnements Kubernetes.
  • Trivy est un outil polyvalent qui combine la détection des vulnérabilités dans les images Docker, les bibliothèques applicatives et les fichiers de configuration, en offrant une solution tout-en-un pour la sécurité des conteneurs.

Importance de sécuriser les conteneurs Docker

Les conteneurs Docker sont largement utilisés pour déployer des applications dans des environnements flexibles et portables. Cependant, ils peuvent également introduire des vulnérabilités si les images ne sont pas régulièrement analysées ou si les configurations ne sont pas sécurisées. Des outils comme Clair, Falco, et Trivy permettent de détecter les failles de sécurité avant qu'elles ne soient exploitées et assurent une surveillance continue des conteneurs en production.

L’utilisation de ces outils dans un pipeline CI/CD ou en production est essentielle pour garantir que les applications déployées via Docker restent sécurisées et conformes aux politiques de sécurité.

Conclusion :

La gestion des dépendances et la sécurisation des conteneurs sont des éléments critiques dans un environnement DevSecOps. Des outils comme Snyk et Dependabot aident à maintenir les bibliothèques à jour et à éviter les vulnérabilités, tandis que des scanners comme Clair, Falco, et Trivy garantissent que les images de conteneurs utilisées sont sécurisées avant et après le déploiement.

QCM - Testez vos connaissances

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