Introduction
Le fuzz-testing est une technique de test logiciel qui existe depuis un certain temps déjà. Mais, malgré ses près de quarante années d'existence, cette technique n'a pas été largement adoptée par les équipes de développement logiciel. Bien qu'elle soit couramment utilisée dans des domaines spécialisés comme les tests de pénétration, elle est souvent perçue comme marginale par le secteur mainstream.
Cependant, à l'ère de l'émergence croissante de l'IA, le fuzz-testing s'avère plus pertinent que jamais. Sa capacité à introduire de l'imprévisibilité dans les systèmes et les applications est particulièrement bien adaptée à une époque où les logiciels non-déterministes se sont généralisés. Dans cet article, nous examinerons en détail cette technique et pourquoi elle pourrait s'avérer plus précieuse que jamais, alors que l'IA générative continue de transformer le paysage logiciel.
Qu'est-ce que le fuzz-testing ?
Le fuzz-testing, ou fuzzing comme on l'appelle parfois, est une technique de test logiciel automatisée où des entrées inattendues ou invalides sont utilisées pour découvrir des bugs ou des vulnérabilités, comme le décrit l'IEEE. Cette opération se déroule généralement à grande échelle, avec des centaines de permutations d'entrées inattendues. C'est une manière de soumettre une application à des tests de charge pour vérifier si elle pourrait se comporter de façon inattendue face à des données pour lesquelles elle n'avait pas été conçue.
Le fuzz-testing peut offrir aux équipes de développement une compréhension plus profonde du comportement et de la sécurité des applications, au-delà des approches de test plus statiques comme les tests de sécurité d'application statique (SAST) ou l'analyse des composants logiciels (SCA). Alors que le SAST et le SCA se concentrent sur les bugs et les risques dans le code source, le fuzzing teste les champs ou les paramètres d'entrée dans les applications web déployées. Même les tests SAST les plus rigoureux ne peuvent pas vous donner une vision de la façon dont les entrées pourraient faire se comporter votre application face à des entrées réelles.
Le fuzz-testing partage certaines similitudes avec les tests dynamiques de sécurité d'application (DAST), mais il existe aussi des différences subtiles. Le DAST implique généralement de simuler des attaques pour identifier les vulnérabilités connues, tandis que le fuzz-testing est beaucoup plus efficace pour trouver des problèmes inconnus qui seraient autrement difficiles à découvrir lors des tests.
Il est important de noter que le fuzz-testing n'est pas une alternative aux autres techniques de test. Vraiment, il devrait être utilisé aux côtés d'autres approches quand et où c'est pertinent. Si les cas limites sont une préoccupation particulière pour la résilience et la sécurité du logiciel, le fuzzing peut être un ajout vraiment précieux aux pratiques de sécurité d'une équipe de développement.
Différents types de fuzz-testing
Il est également important de noter que le fuzz-testing n'est pas une technique unique, mais englobe plutôt un certain nombre d'approches connexes. Elles peuvent être distinguées par :
Selon la connaissance existante du logiciel
Le fuzzing en boîte noire, où les tests sont effectués sans aucune connaissance de la façon dont le logiciel cible fonctionne (c'est probablement le type de fuzzing le plus courant dans l'industrie aujourd'hui, généralement effectué par des testeurs de pénétration ou des chasseurs de bugs).. Le fuzzing en boîte blanche, où vous aurez une connaissance beaucoup plus profonde et détaillée du logiciel. Le fuzzing en boîte grise, qui se situe quelque part entre les deux.
Selon la manière dont les données sont générées
Le fuzzing par mutation (ou « naïf »), où les données d'entrée sont modifiées (c'est-à-dire mutées) de manière indiscriminée (par exemple, en itérant sur une liste statique comme la Liste des chaînes de caractères malveillantes).. Le fuzzing par génération (ou « intelligent »), où les données d'entrée sont plus réfléchies, basées sur les spécificités du format ou du protocole. Les bibliothèques de fuzzing comme FuzzDB décomposent les listes d'entrées fuzzables en fonction des cas d'utilisation.
Finalement, la bonne approche à utiliser dépendra du contexte. Elle dépendra du type de logiciel que vous testez, de ce que vous cherchez à découvrir et des risques que vous cherchez à atténuer, sans mentionner les contraintes de livraison et les exigences commerciales.
Pourquoi le fuzz-testing reste-t-il une technique marginale ?
Le fuzz-testing est marginal dans le développement logiciel pour la simple raison qu'il est finalement chaotique et, utilisé dans les mauvais contextes, dangereux. Il est donc compréhensible que de nombreuses équipes ne le considèrent pas comme une technique à poursuivre.
Des freins opérationnels bien réels
En effet, il existe un certain nombre de défis et d'inconvénients liés au fuzzing :
La configuration des environnements de fuzzing peut être complexe et chronophage. La complexité et les exigences en ressources ne s'adaptent pas bien, ce qui rend difficile l'exécution de tests de fuzzing sur des applications et des systèmes particulièrement volumineux. Elle ne livre pas nécessairement des résultats constants, concluants ou complets. Bien qu'automatisée dans sa mise en œuvre, elle nécessite néanmoins la supervision humaine et l'expertise pour analyser et évaluer les résultats. Elle n'est pas pertinente pour tous les logiciels : le fuzz-testing est utile pour découvrir les vulnérabilités dans la validation des entrées et la gestion des erreurs ; votre logiciel peut ne pas en avoir, et même s'il en a, vous devez quand même effectuer d'autres tests pour trouver d'autres types de bugs et de vulnérabilités (dans le code, par exemple).
Ces problèmes expliquent pourquoi, comme nous l'avons déjà noté, c'est très clairement une technique spécialisée utilisée par les praticiens dans des domaines comme le test de pénétration, où pousser les systèmes et les applications à leurs limites est un objectif fondamental.
Cependant, il y a un bon argument selon lequel dans le paysage logiciel actuel, dominé par l'IA générative et les LLM, des approches innovantes et singulières aux tests doivent être explorées par plus que de simples spécialistes.
Peut-être vaut-il la peine que les développeurs logiciel redécouvrent les bénéfices et la puissance du fuzzing ?
Comment le fuzz-testing peut-il soumettre les applications et systèmes IA à des tests de charge ?
L'IA générative est, à un certain niveau du moins, une technologie d'entrées et de sorties. L'invite, après tout, est devenue une discipline à part entière en l'espace de quelques mois. Mais il y a bien sûr bien plus en jeu : les systèmes d'IA sont composés d'une gamme de différents composants en interaction les uns avec les autres, provenant de sources de données variées aux modèles algorithmiques.
Ces parties imbriquées, et l'imprévisibilité inhérente de ces systèmes, rendent les tests difficiles mais critiques. C'est là que le fuzz-testing peut aider : parce que la technique utilise l'aléatoire et l'imprévisibilité comme modus operandi, elle peut découvrir les faiblesses et les vulnérabilités dans des technologies similairement imprévisibles et non-déterministes.
En fait, ce n'est pas hypothétique ; le fuzz-testing est utilisé dans le contexte des tests d'IA aujourd'hui. Par exemple, une entreprise l'utilise pour identifier les vulnérabilités dans les modèles de reconnaissance d'images en injectant des images corrompues ou adversariales. Les chercheurs ont également écrit sur la valeur du fuzzing des systèmes d'IA ; dans cet article, les auteurs discutent de l'utilisation du fuzz-testing dans un projet Python. « En appliquant le fuzzing aux frameworks ML », écrivent-ils, « il est possible d'identifier les vulnérabilités de sécurité qui pourraient ne pas être trouvées par les méthodes de test traditionnelles. »
Cependant, l'article souligne également que le fuzz-testing doit faire partie d'un flux de travail plus large qui inclut des étapes d'évaluation et d'analyse telles que le « triage des plantages » et l'« estimation de la gravité ». C'est, bien sûr, important pour que le fuzzing soit fait efficacement dans tous les contextes, mais c'est particulièrement critique lorsqu'on traite avec des systèmes complexes et opaques d'apprentissage automatique ou d'IA.

Comment démarrer avec le fuzz-testing
Avec l'intégration croissante de l'IA, le fuzzing devrait devenir plus facile et plus rapide. Cependant, comme cela peut être évident, il est essentiel de se rappeler que le fuzzing nécessite néanmoins la supervision humaine. Se précipiter dans le fuzzing alimenté par l'IA sans une bonne connaissance de la façon dont la pratique devrait être menée est extrêmement dangereux. Pour réitérer le point soulevé plus tôt, ne faites pas de fuzz-testing sur un environnement contenant des éléments que vous ne pouvez pas vous permettre de voir complètement détruits. L'expérimentation limitée et locale est un bon endroit pour commencer.
Sur une note similaire, il est essentiel de souligner (encore une fois) que le fuzz-testing n'est qu'une partie de l'arsenal de sécurité d'une équipe. D'autres techniques et méthodes, telles que l'analyse de code statique, les tests unitaires et les tests manuels, sont tout aussi importantes. Pour être efficace, il faut les utiliser ensemble au bon moment. C'est aussi là que les bonnes pratiques de sécurité entrent en jeu, déplacer la sécurité vers la gauche et s'assurer que les préoccupations en matière de sécurité sont une priorité dans le cycle de vie du développement sont des fondations essentielles sans lesquelles le fuzz-testing devient non seulement difficile mais peut-être même inefficace.

Rapprocher le passé et l'avenir
Bien que l'incapacité du fuzz-testing à devenir une technique mainstream du test logiciel soit en partie un symptôme de sa nature chaotique et quelque peu risquée, elle reflète également les priorités et les pressions exercées sur les équipes de développement logiciel. Cependant, son utilisation dans des contextes spécialisés de test et de sécurité démontre qu'il offre quelque chose que les autres techniques établies ne peuvent pas offrir.
Et, dans une ère de systèmes hautement complexes et souvent opaques, la capacité du fuzz-testing à soumettre les applications à des tests de charge appropriés lui confère une pertinence au-delà des domaines dans lesquels il a largement été utilisé récemment.
Explorer comment le fuzz-testing peut jouer un rôle dans votre arsenal de test existant pourrait, en 2026, avoir du sens.
Clause de non-responsabilité : Les déclarations et opinions exprimées dans cet article sont celles de l'auteur et ne reflètent pas nécessairement les positions d'Adservio.
RÉCUPÉRER CET ARTICLE
Téléchargez l'article complet en PDF pour le lire hors ligne ou le partager.
RESTER INFORMÉ
Recevez nos prochaines analyses et retours d'expérience directement dans votre boîte mail.





Comment l'IA peut alimenter un fuzz-testing efficace ?
Dans une certaine mesure, l'IA, et spécifiquement l'IA générative, peut aider à rendre le fuzz-testing plus accessible aux équipes qui ne le considéreraient pas normalement dans leur arsenal de test. Générer des combinaisons nouvelles de mots ou d'autres séquences à grande échelle est, après tout, la base du fuzzing, et nous savons que l'IA générative excelle à cela.
OSS-Fuzz : générer et trier les cas de fuzzing avec des LLM
Ce travail est en cours actuellement : en novembre 2024, une équipe chez Google a écrit un article de blog expliquant comment sa plateforme de fuzz-testing open source OSS Fuzz a trouvé un certain nombre de vulnérabilités importantes dans des projets open source en exploitant l'IA générative. L'article explique que l'équipe a été expérimentée avec ce qu'elle appelle le « fuzzing alimenté par l'IA », où les capacités génératives des LLM sont utilisées pour créer des cas de fuzzing (en d'autres termes, les entrées aléatoires et inattendues) pour améliorer la couverture de test.
Les avantages d'une telle approche vont bien au-delà de la génération de tests et de la couverture. L'équipe note également qu'elle peut aussi être utile dans les étapes de triage et d'analyse pour identifier les vulnérabilités réelles. Ils écrivent qu'« un LLM peut être invité avec le contexte pertinent (stacktraces, code source du objectif de fuzz, code source pertinent du projet) pour effectuer ce triage ».
Le framework de fuzzing alimenté par l'IA développé pour OSS-Fuzz est open source depuis janvier 2024, et le bilan s'est étoffé depuis : l'initiative revendique la découverte de plus de 26 vulnérabilités inédites dans des projets open source grâce à des cibles de fuzz générées par IA, dont une faille critique dans OpenSSL (CVE-2024-9143), avec des gains de couverture mesurés sur plus de 270 projets C/C++ et plusieurs centaines de milliers de lignes de code nouvellement testées.
BandFuzz : choisir la stratégie par apprentissage par renforcement
Bien que l'IA générative puisse clairement jouer un rôle précieux dans le fuzz-testing, comme l'a démontré l'équipe chez Google, d'autres techniques et approches d'IA peuvent également être utiles.
En 2024, par exemple, une équipe de l'Université Northwestern a remporté la première place à une conférence internationale de fuzz-testing avec leur outil alimenté par l'IA BandFuzz. BandFuzz n'utilise pas l'IA générative mais plutôt l'apprentissage par renforcement pour sélectionner la stratégie de fuzzing la plus efficace pour une situation donnée.
Il ne fait aucun doute que nous allons continuer à voir l'IA intégrée dans le fuzz-testing. Compte tenu des défis de longue date que son implémentation efficace pose, notamment en termes de temps, l'utilisation de l'IA pour générer des cas de test et trier les problèmes signifie que le fuzz-testing devrait être plus accessible et attrayant pour les équipes de développement logiciel et de sécurité.