Fuzzing-101
Structure
- Exercice 1 : Xpdf, CVE-2019-13288, 120 minutes, Afl-clang-fast, Afl-fuzz, GDB
- Exercice 2 : libexif, CVE-2009-3895, CVE-2012-2836, 6 heures, Afl-clang-lto, bibliothèque de fuzzing, Eclipse IDE
- Exercice 3 : TCPdump, CVE-2017-13028, 4 heures, ASan, Sanitizers
- Exercice 4 : LibTIFF, CVE-2016-9297, 3 heures, couverture de code, LCOV
- Exercice 5 : Libxml2, CVE-2017-9048, 3 heures, dictionnaire, parallélisation de base, fuzzing des arguments en ligne de commande
- Exercice 6 : GIMP, CVE-2016-4994, bug bonus, 7 heures, fuzzing persistant, fuzzing d'applications interactives
- Exercice 7 : lecteur multimédia VLC, CVE-2019-14776, 6 heures, instrumentation partielle, harness de fuzzing
- Exercice 8 : Adobe Reader, 8 heures, fuzzing d'applications closed source, instrumentation QEMU
- Exercice 9 : 7-Zip, CVE-2016-2334, 8 heures, WinAFL, fuzzing d'applications Windows
- Exercice 10 (défi final) : Google Chrome / V8, CVE-2019-5847, 8 heures, Fuzzilli, fuzzing de moteur JavaScript
Journal des modifications
- 14 février 2022 : correction d'une faute de frappe sur 'wget' dans l'exercice 5
- 25 novembre 2021 : mise à jour et corrections de l'exercice 3
À qui s'adresse ce cours ?
- Aux personnes qui veulent apprendre les bases du fuzzing
- À celles qui veulent trouver des vulnérabilités dans de vrais projets logiciels
Prérequis
- Un système Linux et une connexion Internet sont nécessaires
- Des bases en Linux sont recommandées
- Tous les exercices ont été testés sur Ubuntu 20.04.2 LTS
- Ce cours utilise AFL++, un nouveau fork de l'AFL de Michał "lcamtuf" Zalewski
Qu'est-ce que le fuzzing ?
- Fuzz testing (ou fuzzing) : technique automatisée de test logiciel qui consiste à fournir à un programme des entrées aléatoires/modifiées et à surveiller les exceptions/plantages
- AFL, libFuzzer et HonggFuzz sont des exemples de fuzzers ayant fait leurs preuves sur des applications réelles
- Fuzzer évolutif basé sur la couverture : sélectionne des entrées permettant de découvrir de nouveaux chemins d'exécution en collectant et en comparant les données de couverture de code
Fuzzer évolutif basé sur la couverture
- Évolutif : approche métaheuristique inspirée des algorithmes évolutionnaires, qui cherche de nouveaux crashs via l'évolution et la mutation d'un sous-ensemble initial (seeds)
- Basé sur la couverture : sélectionne des entrées permettant de découvrir de nouveaux chemins d'exécution en collectant et en comparant les données de couverture de code
Remerciements
- Personnes ayant aidé : Xavier RENE-CORAIL, Alan Vivona, Jason White, Octavio Gianatiempo, van Hauser, Marc Poulhiès, Xu Hanyu, tclan126, epi052, Jeremias Gomes
Contact
- Si vous avez besoin d'aide ou des suggestions, rejoignez le canal
#fuzzing du GitHub Security Lab Slack
Le récapitulatif de GN⁺
- Ce cours est utile pour apprendre les concepts de base du fuzzing et trouver des vulnérabilités dans des logiciels réels
- Il permet d'acquérir des techniques de fuzzing à l'aide d'outils comme AFL++ à travers divers cas concrets
- Le fuzzing joue un rôle important dans le renforcement de la stabilité et de la sécurité des logiciels, et ce cours propose une approche pratique pour y parvenir
- Des outils aux fonctions similaires incluent libFuzzer et HonggFuzz
1 commentaires
Avis sur Hacker News
L’article lié est une lecture d’environ 11 minutes, et la différence avec l’approche de golang est intéressante
Je me demande quelles techniques permettent de mieux guider le fuzzing
Je suis surpris que Heartbleed ne figure pas dans la liste
Merci pour le partage