Skip to main content

Pourquoi les outils de fuzzing devraient faire partie de votre arsenal de sécurité

Écrit par

Kuria Macharia

28 octobre 2022

0 minutes de lecture

Le fuzzing est une technique de test de sécurité logicielle qui fournit automatiquement à une application des entrées aléatoires et invalides afin de révéler des bugs. Son objectif est de mettre l’application à rude épreuve pour provoquer des comportements inattendus, des plantages ou des fuites de ressources. Il nous permet, en tant que développeurs, de mieux comprendre le comportement et les vulnérabilités des applications. Nous utilisons des outils de fuzzing, appelés fuzzers, pour effectuer ce type de test. Un fuzzer est une application qui génère des entrées aléatoires destinées au logiciel ciblé.

Le terme « fuzzing » a été créé dans les années 1980 par le professeur Barton Miller, alors qu’il cherchait à comprendre les causes des défaillances de son système UNIX. Il a demandé à ses étudiants d’inonder son système Unix de données générées automatiquement afin de mieux cerner l’origine des défaillances.

Renforcer la sécurité grâce aux outils de fuzzing

Pour comprendre comment les outils de fuzzing renforcent la sécurité, découvrons ses avantages et quelques cas d’usage, puis examinons un exemple concret de test par fuzzing.

Avantages du fuzzing

Le fuzzing présente de nombreux avantages, notamment les suivants :

  • Tester la sécurité de notre application par fuzzing dès les premières étapes aide à prévenir les exploits zero-day, qui reposent sur des vulnérabilités non identifiées. L’approche multidimensionnelle du fuzzing permet de repérer des bugs que des pirates pourraient exploiter et que nous aurions autrement du mal à détecter. Il peut s’agir, entre autres, d’un chiffrement des données manquant, d’algorithmes défaillants ou d’une validation insuffisante des entrées.

  • Son coût en temps et en argent est faible, car une fois lancé, il ne nécessite aucune intervention humaine.

  • Un fuzzer peut aider à repérer des cas limites que les tests manuels ne permettraient pas de découvrir.

  • En plus de repérer le problème, il fournit également un rapport détaillé expliquant comment un pirate pourrait exploiter une vulnérabilité.

Cas d’usage du fuzzing

Vous pouvez tester par fuzzing des composants individuels d’une application. Voici quelques cas d’usage du fuzzing.

Fuzzing des applications Web

Le fuzzing des applications Web révèle les bugs susceptibles de les rendre vulnérables à des attaques courantes, comme l’injection SQL (https://learn.snyk.io/lessons/sql-injection/javascript/) et la falsification de requête intersite (CSRF) (https://learn.snyk.io/lessons/csrf-attack/javascript/). Lors du fuzzing de nos applications Web, le test envoie des données aléatoires aux points de terminaison, ce qui révèle les bugs de l’application. Corriger les bugs détectés renforce la posture de sécurité de l’application. Par exemple, le fuzzing peut vous aider à repérer les pages où ajouter une validation des entrées côté client pour mieux sécuriser le serveur.

Fuzzing des API

Le fuzzing des API révèle les vulnérabilités liées à l’accès aux bases de données. Il peut notamment mettre au jour l’exposition de mots de passe et l’absence de validation des paramètres. Le fuzzing des API nous permet de mieux contrôler leurs interactions avec les serveurs principaux. Nous pouvons, par exemple, vérifier qu’une API de paiement valide correctement les numéros de carte bancaire et les signatures d’autorisation.

Fuzzing des URL

Le fuzzing des URL permet de découvrir les fichiers et répertoires cachés sur un serveur Web. Il révèle les fichiers et répertoires qui auraient dû rester cachés, mais qui sont accessibles publiquement. Cela contribue à protéger les fichiers et les répertoires du serveur Web contre les accès non autorisés. Le fuzzing des URL peut empêcher l’exposition d’informations sensibles, comme des identifiants de base de données et des formats de requête, qu’un pirate pourrait utiliser pour créer de fausses requêtes lors d’une attaque CSRF.

Fuzzing des protocoles

Le fuzzing des protocoles consiste à envoyer des paquets falsifiés à une application afin de détecter les bugs de son implémentation. Par exemple, si un fuzzer connaît la longueur d’un message, il peut l’augmenter pour voir comment l’application traite une telle requête.

Fuzzing des formats de fichiers

Le fuzzing des formats de fichiers est un processus simple et direct. Il consiste à modifier un échantillon de fichier valide, puis à ouvrir les versions modifiées dans l’application ciblée pour provoquer un plantage. Il révèle les bugs susceptibles de faire planter un système et met en évidence les points où renforcer le contrôle des types de fichiers qu’une application peut ouvrir, améliorant ainsi sa sécurité et sa stabilité. Cette méthode peut éviter les plantages des applications qui nécessitent de téléverser et d’ouvrir des documents numérisés dans des formats précis, comme JPEG, PNG et PDF.

Limites des outils de test par fuzzing

Bien que les outils de test par fuzzing soient relativement efficaces, ils présentent quelques inconvénients :

  • À eux seuls, les outils de test par fuzzing ne peuvent pas garantir la sécurité complète d’une application.

  • Ils sont peu efficaces pour détecter les menaces qui ne provoquent pas de plantage de l’application.

  • Un test peut prendre beaucoup de temps.

  • Ils ne peuvent pas détecter les défauts et les menaces complexes.

Fuzzing et analyseurs de vulnérabilités Snyk

Le fuzzing est essentiel pour renforcer la posture de sécurité d’une application, mais il n’est pas pleinement efficace à lui seul, car il ne peut trouver que les bugs associés aux points de terminaison des applications.

Pour tester une application par fuzzing, nous devons configurer le fuzzer et lui laisser suffisamment de temps pour effectuer le processus. Cela ralentit le développement et allonge le délai de mise sur le marché des nouvelles applications.

Or, cela ne suffit pas dans le contexte actuel de développement et de livraison continus (CI/CD). Vous devez surveiller les vulnérabilités de votre application dès l’écriture du code. Snyk analyse en continu votre code, vos pull requests Git et vos conteneurs à la recherche de vulnérabilités. Vous pouvez également l’intégrer à un pipeline CI/CD afin d’assurer une analyse continue des vulnérabilités tout au long du cycle de vie de l’application.

Les conseils de correction concrets constituent une autre fonctionnalité des analyseurs de vulnérabilités de Snyk. Ils vous permettent de corriger certaines implémentations signalées en quelques clics.

Exemple de fuzzing

Pour comprendre comment, quand et pourquoi utiliser le fuzzing, prenons l’exemple suivant.

Imaginons que nous venions de lancer un service de livraison de repas en ligne accessible à l’adresse HealthyTastyMeals.com. Pendant le développement, nous avons testé chaque fonctionnalité à plusieurs reprises et demandé à des amis et collègues d’essayer l’application afin d’en évaluer la facilité d’utilisation.

Cependant, tous les tests effectués portent sur des requêtes et des valeurs d’entrée conformes au format attendu. Alors, comment nous préparer à l’imprévu ?

Pour comprendre le comportement de notre site Web face à une avalanche d’entrées inattendues, nous devons le tester par fuzzing. Comme notre site utilise des API REST, nous pouvons utiliser l’outil de fuzzing RESTler, un outil open source conçu pour les API REST.

Nous lancerons RESTler en mode « Fuzz », car nous n’avons que quelques points de terminaison et que son exécution est simple. Le test s’exécutera sur chacun des points de terminaison de notre application Web pour y trouver des bugs. Il leur enverra différentes combinaisons de paramètres et séquences de requêtes.

Chaque fois qu’un bug est détecté, RESTler affiche dans la console un aperçu du type de bug trouvé.

Notre test pourrait révéler certaines des vulnérabilités suivantes.

Combinaisons de paramètres non sécurisées

Les API REST utilisent différents paramètres, tels que les URI de requête, les méthodes de requête et les paramètres de requête. Ces paramètres peuvent être combinés de différentes façons, qu’il faut tester pour éviter les états erronés du programme. Le fuzzing peut nous aider à repérer les combinaisons de paramètres non sécurisées. Nous pouvons y remédier en validant tous les paramètres de requête et en limitant les paramètres obligatoires au strict nécessaire.

Paramètres de requête dépourvus de mécanisme de validation

Une validation rigoureuse des entrées côté client et côté serveur renforce la posture de sécurité d’une application. Un outil de fuzzing comme RESTler nous permettrait de repérer ce problème dans notre application. Nous pouvons y remédier en ajoutant une validation rigoureuse des entrées des deux côtés. La validation côté client empêche le serveur d’être surchargé de données invalides. La validation côté serveur garantit qu’il ne traite que des requêtes valides. Corriger ce problème contribue à atténuer le risque d’attaque par déni de service (DoS).

Mots de passe non protégés

RESTler signale également les paramètres de mot de passe qui ne sont pas hachés. Nous pouvons corriger ce problème à l’aide d’un algorithme de hachage. Parmi les algorithmes disponibles, citons bcrypt et PBKDF2. Corriger cette vulnérabilité complique la prise de contrôle du système par des pirates. En effet, même s’ils parviennent à accéder au système, ils ne pourront toujours pas accéder aux mots de passe.

Nos 5 meilleurs outils de fuzzing

Il existe de nombreux outils de fuzzing open source. Voici cinq outils gratuits et efficaces que nous pouvons facilement utiliser pour renforcer la sécurité de nos applications.

1. OSS-Fuzz

OSS-Fuzz est un outil de fuzzing open source développé par Google. Il associe des techniques modernes de fuzzing à une exécution distribuée et évolutive. Google l’a créé pour rendre les logiciels open source plus sûrs et plus stables. OSS-Fuzz fonctionne en testant en continu le programme ciblé par fuzzing.

2. ClusterFuzz

ClusterFuzz est une infrastructure open source évolutive qui révèle les vulnérabilités de sécurité et les problèmes de stabilité. Google l’utilise pour rechercher des bugs dans son navigateur Chrome. Contrairement à OSS-Fuzz, ClusterFuzz fonctionne avec n’importe quelle application, et pas uniquement avec les applications open source. Hautement évolutif, il peut s’exécuter sur un cluster de n’importe quelle taille.

3. go-fuzz

go-fuzz est un fuzzer open source pour tester les packages Golang. Il cible les packages qui acceptent des entrées complexes et constituent donc des cibles attrayantes pour les attaquants malveillants. C’est un outil essentiel pour renforcer la sécurité de l’analyse des entrées dans les programmes Go. Contrairement aux deux fuzzers précédents, go-fuzz fonctionne uniquement avec les packages Go.

4. Peach Fuzzer

Peach Fuzzer est un outil développé par PeachTech, puis racheté par GitLab. Très configurable, il est efficace pour créer des tests personnalisés. Contrairement à go-fuzz, cette solution peut être configurée pour fonctionner avec n’importe quel langage. Toutefois, PeachTech ne prend plus en charge cet outil et ne le met plus à jour.

5. ffuf

ffuf est un fuzzer Web gratuit et rapide, écrit en Go. Cette solution puissante permet de tester rigoureusement une application à l’aide de requêtes POST et GET inconnues. En tant que développeurs, nous interagissons avec cet outil depuis la ligne de commande, car il ne dispose pas d’interface.

Votre arsenal de sécurité

Le fuzzing est une technique de test logiciel qui consiste à envoyer à une application des entrées aléatoires et invalides afin d’y révéler des bugs. Face à des entrées inattendues, il nous aide à comprendre le comportement d’une application ou d’une API. De nombreux outils de fuzzing open source, conçus pour des scénarios de test spécifiques, sont à notre disposition. Les fuzzers ont un faible coût en temps et en argent ; ils ne se contentent pas de repérer les problèmes, ils fournissent aussi un rapport détaillé expliquant comment un pirate peut exploiter une vulnérabilité.

Un test par fuzzing correctement exécuté peut renforcer la posture de sécurité d’une application en révélant des vulnérabilités difficiles à détecter. Le fuzzing peut mettre au jour des bugs tels que l’absence de chiffrement des données, des algorithmes défaillants ou une validation insuffisante des entrées. Il peut aussi repérer des problèmes que les tests manuels ne permettraient pas de découvrir.

Les capacités d’un fuzzer nous aident à prévenir les exploits zero-day, qui reposent sur des vulnérabilités non identifiées. Les résultats du fuzzing contribuent à atténuer les risques d’attaques telles que les attaques CSRF, les injections et les dénis de service (DoS), entre autres.

Lancez-vous dans les compétitions Capture The Flag

Apprenez à résoudre des défis Capture The Flag en regardant à la demande notre atelier virtuel d’initiation.