Le fuzzing, également appelé Fuzz Testing, est une méthode au­to­ma­ti­sée per­met­tant de mettre à jour les vul­né­ra­bi­li­tés d'un logiciel. Cet article vous explique ce qu’est cette méthode de test, quels sont ses avantages et in­con­vé­nients et quels sont les dif­fé­rents outils de fuzzing dis­po­nibles.

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

Le fuzzing, ou Fuzz Testing, est une méthode dé­ve­lop­pée par le scien­ti­fique Barton Miller, pour tester de manière sys­té­ma­tique les vul­né­ra­bi­li­tés des logiciels. Il ne s’agit pas d’in­ter­pré­ter le code source du programme mais plutôt de con­si­dé­rer le logiciel comme une boîte noire et son contenu comme avéré. Toutes les in­ter­faces possibles de saisie de données sont ouvertes de manière au­to­ma­ti­sée et ali­men­tées de données aléa­toires. Ce processus peut prendre plusieurs heures, voire des jours, selon la taille du projet logiciel examiné.

L’objectif du Fuzz Testing est de dé­ter­mi­ner si les réactions né­ces­saires aux dif­fé­rentes variantes de saisie possibles existent bien dans le programme. Les saisies erronées ou dé­fec­tueuses doivent, dans la mesure du possible, être com­pen­sées le plus possible par des routines de trai­te­ment d’erreurs. Si ces dernières n’existent pas ou ne fonc­tion­nent pas pour certaines saisies, le programme peut planter. Le procédé technique de contrôle de toutes les éven­tua­li­tés d’un logiciel fait partie, depuis longtemps, des con­di­tions de dé­ve­lop­pe­ment Web. La fonc­tion­na­lité de nom­breuses ap­pli­ca­tions Web sous dif­fé­rents clients Web ou versions de na­vi­ga­teurs, par exemple, est testée, depuis des années par test en na­vi­ga­teur croisé ou cross-browser testing.

Quels sont les dif­fé­rents types de fuzzing ?

Il existe trois variantes de fuzzing :

Fuzzing d'ap­pli­ca­tion

Cette méthode de Fuzz Testing teste les fonctions, telles que les boutons et champs de saisie de pro­grammes gra­phiques, ou les options de pro­grammes de ligne de commande. Les fonctions sont alors ouvertes de manière ciblée, beaucoup plus fré­quem­ment ou ra­pi­de­ment que d’ordinaire, ou des champs de saisie sont remplis de contenus trop vo­lu­mi­neux.

Fuzzing de pro­to­coles

On utilise des pro­to­coles, tels que l'Hy­per­text Transfer Protocol (HTTP), pour l’échange de données sur le Web. Les données trans­fé­rées doivent présenter un format défini. Le fuzzing de protocole sert à vérifier le com­por­te­ment du protocole en cas d'envoi de contenus mal formatés. Il est par­ti­cu­liè­re­ment important que les contenus trans­fé­rés ne soient pas in­ter­pré­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é­sen­tent toujours un format normalisé, tel que .jpg pour les fichiers d’images, afin de permettre leur échange entre dif­fé­rentes ap­pli­ca­tions. 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'im­plé­men­ta­tion de fonctions, telles que la com­pres­sion de fichiers vidéo, par ex.

Comment fonc­tionne le fuzzing ?

Il est très fas­ti­dieux de suivre le com­por­te­ment de fonc­tion­ne­ment d’un logiciel. Il se compose souvent de plusieurs milliers de lignes de code source en langage de pro­gram­ma­tion. Des ra­mi­fi­ca­tions et fonctions intégrées con­tri­buent à sa com­plexité. Le code source doit, en outre, être restauré (décompilé) après la com­pi­la­tion, ce qui n’est pas toujours possible.

Cependant, le fuzzing suit une autre approche : il génère toutes les données aléa­toires ima­gi­nables 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 au­to­ma­ti­sée. Il agit à dif­fé­rents niveaux. Dans le cadre du fuzzing d'ap­pli­ca­tion, dif­fé­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 in­ter­cep­ter, manipuler et renvoyer des contenus. Le fuzzing de format de fichier fonc­tionne avec des fichiers tests générés de manière aléatoire. Les ca­rac­té­ris­tiques à tester sont, par exemple, la taille, la structure ou les marqueurs (Flags).

Domaines d’ap­pli­ca­tion du Fuzz Testing

Le principal domaine d’ap­pli­ca­tion du fuzzing est l’assurance qualité dans le dé­ve­lop­pe­ment logiciel. Il est possible, grâce à un niveau d’au­to­ma­ti­sa­tion élevé, de tester ré­gu­liè­re­ment un logiciel dans un en­vi­ron­ne­ment de test préparé. Dans le cas de projets de dé­ve­lop­pe­ment agile, il peut être intégré aux pro­cé­dures exis­tantes. Les logiciels déjà publiés peuvent toutefois aussi être testés, dans le cadre d’audits de sécurité, pour dé­ter­mi­ner leur aptitude à des fins de sécurité.

Le fuzzing est bien sûr également utile pour la détection d'ex­ploits. Ce faisant, il met à dis­po­si­tion des indices d’erreurs des fonctions des pro­grammes. En effet, les outils de fuzzing n’ont pas accès aux struc­tures internes des logiciels testés.

Tableau ré­ca­pi­tu­la­tif des avantages et in­con­vé­nients du fuzzing

Avantages du fuzzing In­con­vé­nients du fuzzing
Niveau de qualité homogène garanti à l’aide des tests préparés Ma­ni­pu­la­tion parfois com­pli­quée du logiciel
Ren­for­ce­ment de la stabilité du logiciel Charge de travail sup­plé­men­taire
Amé­lio­ra­tion de la sécurité Im­pos­si­bi­lité de définir pré­ci­sé­ment les causes d’erreurs
Outils gratuits éprouvés Pos­si­bi­lité de dé­tour­ne­ment par des dé­ve­lop­peurs de logiciels mal­veil­lants

Vue d’ensemble des meilleurs outils de fuzzing

De nombreux outils de fuzzing gratuits ou payants aux volumes de fonc­tion­na­li­tés dif­fé­rents sont ac­tuel­le­ment offerts sur le marché. En voici une vue d’ensemble :

  • American Fuzz Lop : compile, puis teste le code source de manière autonome ; ap­par­tient à la catégorie de pro­grammes « Grey Box Fuzzer ». Si le texte source n’est pas dis­po­nible, une émulation est ensuite réalisée avec QEMU (abré­via­tion de Quick Emulator).
  • Fuzzino : met à dis­po­si­tion une bi­blio­thèque pour la gé­né­ra­tion des données de saisie per­met­tant de tester des ap­pli­ca­tions (orienté protocole).
  • LibFuzzer : bi­blio­thèque ap­par­te­nant à l’in­fras­truc­ture de com­pi­la­tion LLVM.
  • Clus­ter­Fuzz : en­vi­ron­ne­ment de test développé, à l’origine, par Google pour tester le na­vi­ga­teur Chrome.
  • Sulley : propose une série d'outils en langage de script Python ; par­ti­cu­liè­re­ment adapté pour la réa­li­sa­tion de tests simples, pour la gé­né­ra­tion de données aléa­toires par exemple.
  • Peach : solution fortement au­to­ma­ti­sée de Fuzz Testing de matériels et logiciels.
  • Po­wer­fuz­zer : propose dif­fé­rents scénarios d’attaque, tels que des in­jec­tions SQL ; la commande est réalisée via une interface uti­li­sa­teur graphique basée Web.
Outil de Fuzz Testing Dé­ve­lop­peurs Licence Catégorie Par­ti­cu­la­ri­tés
American Fuzz Lop (AFL) Michael Zalewski Open Source Ap­pli­ca­tion Approche Grey-Box
Fuzzino Fraun­ho­fer Institut Open Source Protocole Pour des cas de tests spé­ci­fiques
LibFuzzer LLVM Team Open Source Ap­pli­ca­tion Intégré dans Compiler
Clus­ter­Fuzz Google Open Source Ap­pli­ca­tion Outils intégrés, tels qu'AFL
Sulley OpenRCE Open Source Protocole Fichier, facile à intégrer
Peach Peachtech Com­mer­cial Ap­pli­ca­tion Au­to­ma­ti­sa­tion forte
Po­wer­fuz­zer Marcin Kozlowski Open Source Ap­pli­ca­tion Intégré dans KALI-Linux

Al­ter­na­tives possibles au Fuzz Testing

Selon les ap­pli­ca­tions, il existe des al­ter­na­tives au Fuzz Testing. Ces dernières utilisent dif­fé­rentes approches et offrent d’autres types de résultats. Vous trouverez ci-après les plus im­por­tants.

Rétro-in­gé­nie­rie

La rétro-in­gé­nie­rie est un outil standard pour les cher­cheurs du domaine de la sécurité. Il s'agit d'une analyse après dé­com­pi­la­tion (ré­tro­tra­duc­tion du langage de pro­gram­ma­tion) ou dé­sas­sem­blage (tra­duc­tion dans le langage as­sem­bleur). Il s'agit d'un processus très complexe et sus­cep­tible d'erreurs. Cependant, en cas de réussite, il permet de définir tous les détails relatifs à la fonc­tion­na­lité du programme.

Débogage

Le débogage est un processus de recherche d’erreurs exécuté dans le cadre du dé­ve­lop­pe­ment logiciel. Les pro­grammes sont exécutés tem­po­rai­re­ment dans l’en­vi­ron­ne­ment de dé­ve­lop­pe­ment avant leur fi­na­li­sa­tion. Le dé­ve­lop­peur peut définir des points d’arrêt (Break­points) 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-in­gé­nie­rie.

Tests de module

Les logiciels complexes sont souvent conçus sous une forme modulaire. Il est alors courant de contrôler les dif­fé­rents com­po­sants par le biais de tests de modules dans dif­fé­rents en­vi­ron­ne­ments de test.

En résumé

Les erreurs et failles de sécurité des logiciels en­traî­nent, dans la plupart des cas, une perte de ré­pu­ta­tion et de confiance envers les dé­ve­lop­peurs. Une absence totale d’erreurs serait utopique, le savent également la plupart des uti­li­sa­teurs de pro­grammes. Le fuzzing est cependant une solution per­met­tant de trouver des erreurs avant qu’elles ne soient détectées par des tiers. Dans tous les cas, cette méthode permet d'at­teindre 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'as­su­rance qualité.

Aller au menu principal