Fuzzing : il se dissimule derrière la méthode de test automatisée

Le fuzzing, également appelé Fuzz Testing, est une méthode automatisée permettant de mettre à jour les vulnérabilités d'un logiciel. Cet article vous explique ce qu’est cette méthode de test, quels sont ses avantages et inconvénients et quels sont les différents outils de fuzzing disponibles.

Qu’est-ce que le fuzzing (Fuzz Testing) ?

Le fuzzing, ou Fuzz Testing, est une méthode développée par le scientifique Barton Miller, pour tester de manière systématique les vulnérabilités des logiciels. Il ne s’agit pas d’interpréter le code source du programme mais plutôt de considérer le logiciel comme une boîte noire et son contenu comme avéré. Toutes les interfaces possibles de saisie de données sont ouvertes de manière automatisée et alimentées de données aléatoires. Ce processus peut prendre plusieurs heures, voire des jours, selon la taille du projet logiciel examiné.

L’objectif du Fuzz Testing est de déterminer si les réactions nécessaires aux différentes variantes de saisie possibles existent bien dans le programme. Les saisies erronées ou défectueuses doivent, dans la mesure du possible, être compensées le plus possible par des routines de traitement d’erreurs. Si ces dernières n’existent pas ou ne fonctionnent pas pour certaines saisies, le programme peut planter. Le procédé technique de contrôle de toutes les éventualités d’un logiciel fait partie, depuis longtemps, des conditions de développement Web. La fonctionnalité de nombreuses applications Web sous différents clients Web ou versions de navigateurs, par exemple, est testée, depuis des années par test en navigateur croisé ou cross-browser testing.

Quels sont les différents types de fuzzing ?

Il existe trois variantes de fuzzing :

Fuzzing d'application

Cette méthode de Fuzz Testing teste les fonctions, telles que les boutons et champs de saisie de programmes graphiques, ou les options de programmes de ligne de commande. Les fonctions sont alors ouvertes de manière ciblée, beaucoup plus fréquemment ou rapidement que d’ordinaire, ou des champs de saisie sont remplis de contenus trop volumineux.

Fuzzing de protocoles

On utilise des protocoles, tels que l'Hypertext Transfer Protocol (HTTP), pour l’échange de données sur le Web. Les données transférées doivent présenter un format défini. Le fuzzing de protocole sert à vérifier le comportement du protocole en cas d'envoi de contenus mal formatés. Il est particulièrement important que les contenus transférés ne soient pas interprétés comme des commandes et exécutées sur un serveur.

Fuzzing de format de fichiers

Les outils de fuzzing en charge du fuzzing de format de fichiers génèrent des fichiers erronés et laissent le logiciel testé les traiter. Ces fichiers présentent toujours un format normalisé, tel que .jpg pour les fichiers d’images, afin de permettre leur échange entre différentes applications. Des problèmes peuvent survenir lorsque le fichier ouvert ne se trouve pas dans le format attendu. Il est possible de tester, dans une version avancée, l'implémentation de fonctions, telles que la compression de fichiers vidéo, par ex.

Comment fonctionne le fuzzing ?

Il est très fastidieux de suivre le comportement de fonctionnement d’un logiciel. Il se compose souvent de plusieurs milliers de lignes de code source en langage de programmation. Des ramifications et fonctions intégrées contribuent à sa complexité. Le code source doit, en outre, être restauré (décompilé) après la compilation, ce qui n’est pas toujours possible.

Cependant, le fuzzing suit une autre approche : il génère toutes les données aléatoires imaginables d’un type donné, dans le but de couvrir un maximum de variantes de saisie. Le fuzzing prend la place d'une interface de saisie automatisée. Il agit à différents niveaux. Dans le cadre du fuzzing d'application, différents types de données sont imités et transmis à un logiciel. Il est possible de tester les longueurs et formats de données possibles des saisies. Le fuzzing de protocole se sert de packs de données qu’il crée lui-même. Il peut également intercepter, manipuler et renvoyer des contenus. Le fuzzing de format de fichier fonctionne avec des fichiers tests générés de manière aléatoire. Les caractéristiques à tester sont, par exemple, la taille, la structure ou les marqueurs (Flags).

Domaines d’application du Fuzz Testing

Le principal domaine d’application du fuzzing est l’assurance qualité dans le développement logiciel. Il est possible, grâce à un niveau d’automatisation élevé, de tester régulièrement un logiciel dans un environnement de test préparé. Dans le cas de projets de développement agile, il peut être intégré aux procédures existantes. Les logiciels déjà publiés peuvent toutefois aussi être testés, dans le cadre d’audits de sécurité, pour déterminer leur aptitude à des fins de sécurité.

Le fuzzing est bien sûr également utile pour la détection d'exploits. Ce faisant, il met à disposition des indices d’erreurs des fonctions des programmes. En effet, les outils de fuzzing n’ont pas accès aux structures internes des logiciels testés.

Tableau récapitulatif des avantages et inconvénients du fuzzing

Avantages du fuzzing Inconvénients du fuzzing
Niveau de qualité homogène garanti à l’aide des tests préparés Manipulation parfois compliquée du logiciel
Renforcement de la stabilité du logiciel Charge de travail supplémentaire
Amélioration de la sécurité Impossibilité de définir précisément les causes d’erreurs
Outils gratuits éprouvés Possibilité de détournement par des développeurs de logiciels malveillants

Vue d’ensemble des meilleurs outils de fuzzing

De nombreux outils de fuzzing gratuits ou payants aux volumes de fonctionnalités différents sont actuellement offerts sur le marché. En voici une vue d’ensemble :

  • American Fuzz Lop : compile, puis teste le code source de manière autonome ; appartient à la catégorie de programmes « Grey Box Fuzzer ». Si le texte source n’est pas disponible, une émulation est ensuite réalisée avec QEMU (abréviation de Quick Emulator).
  • Fuzzino : met à disposition une bibliothèque pour la génération des données de saisie permettant de tester des applications (orienté protocole).
  • LibFuzzer : bibliothèque appartenant à l’infrastructure de compilation LLVM.
  • ClusterFuzz : environnement de test développé, à l’origine, par Google pour tester le navigateur Chrome.
  • Sulley : propose une série d'outils en langage de script Python ; particulièrement adapté pour la réalisation de tests simples, pour la génération de données aléatoires par exemple.
  • Peach : solution fortement automatisée de Fuzz Testing de matériels et logiciels.
  • Powerfuzzer : propose différents scénarios d’attaque, tels que des injections SQL ; la commande est réalisée via une interface utilisateur graphique basée Web.
Outil de Fuzz Testing Développeurs Licence Catégorie Particularités
American Fuzz Lop (AFL) Michael Zalewski Open Source Application Approche Grey-Box
Fuzzino Fraunhofer Institut Open Source Protocole Pour des cas de tests spécifiques
LibFuzzer LLVM Team Open Source Application Intégré dans Compiler
ClusterFuzz Google Open Source Application Outils intégrés, tels qu'AFL
Sulley OpenRCE Open Source Protocole Fichier, facile à intégrer
Peach Peachtech Commercial Application Automatisation forte
Powerfuzzer Marcin Kozlowski Open Source Application Intégré dans KALI-Linux

Alternatives possibles au Fuzz Testing

Selon les applications, il existe des alternatives au Fuzz Testing. Ces dernières utilisent différentes approches et offrent d’autres types de résultats. Vous trouverez ci-après les plus importants.

Rétro-ingénierie

La rétro-ingénierie est un outil standard pour les chercheurs du domaine de la sécurité. Il s'agit d'une analyse après décompilation (rétrotraduction du langage de programmation) ou désassemblage (traduction dans le langage assembleur). Il s'agit d'un processus très complexe et susceptible d'erreurs. Cependant, en cas de réussite, il permet de définir tous les détails relatifs à la fonctionnalité du programme.

Débogage

Le débogage est un processus de recherche d’erreurs exécuté dans le cadre du développement logiciel. Les programmes sont exécutés temporairement dans l’environnement de développement avant leur finalisation. Le développeur peut définir des points d’arrêt (Breakpoints) au niveau desquels le programme s’arrête. Il peut alors y éditer les contenus des variables utilisées et en tester la cohérence. Le débogage est également utilisé dans le cadre de la rétro-ingénierie.

Tests de module

Les logiciels complexes sont souvent conçus sous une forme modulaire. Il est alors courant de contrôler les différents composants par le biais de tests de modules dans différents environnements de test.

En résumé

Les erreurs et failles de sécurité des logiciels entraînent, dans la plupart des cas, une perte de réputation et de confiance envers les développeurs. Une absence totale d’erreurs serait utopique, le savent également la plupart des utilisateurs de programmes. Le fuzzing est cependant une solution permettant de trouver des erreurs avant qu’elles ne soient détectées par des tiers. Dans tous les cas, cette méthode permet d'atteindre un niveau accru de stabilité et de sécurité des logiciels. Autant de bonnes raisons d’intégrer le Fuzz Testing à votre procédure d'assurance qualité.