présentation
Les tests de fuzzing sont une méthode pour tester la robustesse d'un programme en lui fournissant des entrées aléatoires. Initialement, les fuzzers ne disposaient que d'une rétroaction limitée, ne sachant que si l'entrée avait provoqué une erreur ou non. L'avènement de l'American Fuzzy Lop (AFL) a révolutionné le domaine en introduisant le fuzzing guidé par la couverture, qui permet de recueillir des informations sur les parties du code exécutées lors de chaque test.
fonctionnement du fuzzing guidé par la couverture
AFL fonctionne en compilant le programme à tester avec un compilateur clang personnalisé qui ajoute des informations de couverture sur les arêtes du graphique de flux de contrôle (CFG). Lorsqu'un nouveau bloc de base est exécuté, un nouvel élément de bitmap de couverture est défini. Cela permet au fuzzer de savoir si une nouvelle entrée exécute du code qui n'a pas été exécuté auparavant, et ainsi de cibler les parties du programme qui n'ont pas encore été testées.
couverture de code pour les binaires noirs
Pour les binaires noirs, il est possible d'utiliser des outils tels qu'AFL++ avec son backend qemu_mode, qui exécute le programme à tester sous QEMU et ajoute des instruments de couverture aux blocs de code. Cependant, cette méthode peut être lente. Une autre approche consiste à utiliser les fonctionnalités de comptage de performances du processeur, telles que Intel PT, qui permettent de recueillir des informations de couverture sans avoir à modifier le code du programme à tester.
implémentation d'une couverture binaire à la mauvaise façon
L'auteur a tenté d'implémenter une couverture binaire pour un projet personnel en remplaçant les instructions de branchement par des instructions INT3, qui permettent de détourner le flux de contrôle et de recueillir des informations de couverture. Cependant, cette approche s'est avérée être très lente en raison des nombreux changements de contexte nécessaires pour gérer les interruptions. L'utilisation d'extensions de virtualisation telles que Intel VT-x pourrait offrir une solution plus efficace.
INT3