1 points par GN⁺ 2024-10-07 | 1 commentaires | Partager sur WhatsApp
  • Fuzzing-101 est un cours conçu pour permettre aux personnes qui découvrent le fuzzing de s’entraîner à trouver des vulnérabilités sur de vrais logiciels
  • Le cours comprend 10 cibles réelles et 10 exercices, couvrant Xpdf, libexif, TCPdump, LibTIFF, Libxml2, GIMP, VLC media player, Adobe Reader, 7-Zip et Google Chrome/V8
  • Chaque exercice vise à reproduire ou découvrir une CVE, et utilise AFL++, ASan, LCOV, WinAFL, Fuzzilli, entre autres, avec des vulnérabilités comme CVE-2019-13288, CVE-2016-2334 et CVE-2019-5847
  • Le prérequis est un système Linux connecté à Internet ; une maîtrise de base de Linux est recommandée, et tous les exercices ont été testés sur Ubuntu 20.04.2 LTS
  • Le fuzzing est une technique de test automatisée qui consiste à fournir à un programme des entrées aléatoires ou mutées et à surveiller les exceptions ou les plantages ; ce cours prend pour objet d’apprentissage le fonctionnement de base des fuzzers évolutifs guidés par la couverture

Objectif du cours et public visé

  • Fuzzing-101 est un cours destiné aux personnes qui veulent apprendre le fuzzing comme des spécialistes, mais ne savent pas par où commencer
  • Le cours se compose de 10 cibles réelles et de 10 exercices
  • Le public visé est le suivant
    • Les personnes qui souhaitent apprendre les bases du fuzzing
    • Les personnes qui souhaitent apprendre à trouver des vulnérabilités dans de vrais projets logiciels

Structure des exercices

  • Chaque exercice présente le logiciel concerné, la CVE à trouver, la durée estimée et les principaux sujets abordés
Exercice Cible CVE à trouver Durée estimée Principaux sujets
Exercise 1 Xpdf CVE-2019-13288 120 min Afl-clang-fast, Afl-fuzz, GDB
Exercise 2 libexif CVE-2009-3895, CVE-2012-2836 6 h Afl-clang-lto, fuzzing de bibliothèque, Eclipse IDE
Exercise 3 TCPdump CVE-2017-13028 4 h ASan, Sanitizers
Exercise 4 LibTIFF CVE-2016-9297 3 h couverture de code, LCOV
Exercise 5 Libxml2 CVE-2017-9048 3 h dictionnaire, parallélisation de base, fuzzing des arguments en ligne de commande
Exercise 6 GIMP CVE-2016-4994, bug bonus 7 h fuzzing persistant, fuzzing d’applications interactives
Exercise 7 VLC media player CVE-2019-14776 6 h instrumentation partielle, harnais de fuzzing
Exercise 8 Adobe Reader aucune 8 h fuzzing d’applications à source fermé, instrumentation QEMU
Exercise 9 7-Zip CVE-2016-2334 8 h WinAFL, fuzzing d’applications Windows
Exercise 10 Google Chrome / V8 CVE-2019-5847 8 h Fuzzilli, fuzzing de moteurs JavaScript

Environnement d’exécution et outils

  • Il faut disposer d’un système Linux avec une connexion Internet
  • Une image VMware utilisable dans les exercices est fournie
  • Une maîtrise de base de Linux est fortement recommandée
  • Tous les exercices ont été testés sur Ubuntu 20.04.2 LTS
  • Le cours utilise AFL++
    • AFL++ est présenté comme un fork plus récent et supérieur d’AFL, créé à partir du projet de Michał “lcamtuf” Zalewski

Concepts de base du fuzzing

  • Le fuzz testing, ou fuzzing, est une technique de test logiciel automatisée qui consiste à fournir à un programme des entrées aléatoires ou mutées et à surveiller les exceptions ou les plantages
  • AFL, libFuzzer et HonggFuzz sont cités comme exemples de fuzzers performants sur des applications réelles
  • Ces trois outils sont tous des exemples de fuzzers évolutifs guidés par la couverture

Fuzzers évolutifs guidés par la couverture

  • L’approche évolutive (evolutionary) est une méthode métaheuristique inspirée des algorithmes évolutionnaires
    • Elle fait évoluer et mute au fil du temps un ensemble initial d’entrées, appelé seeds
    • La couverture est utilisée comme exemple de critère de sélection
  • Un fuzzer guidé par la couverture (coverage-guided) collecte et compare les données de couverture de code pour chaque entrée afin d’augmenter les chances de trouver de nouveaux plantages
    • La collecte de couverture se fait généralement au moyen de l’instrumentation
    • Les entrées menant à de nouveaux chemins d’exécution sont sélectionnées

Historique des modifications

  • 2022-02-14 : correction de quelques fautes de frappe wget dans l’Exercise 5
  • 2021-11-25 : mise à jour de l’Exercise 3 avec quelques corrections

1 commentaires

 
GN⁺ 2024-10-07
Avis sur Hacker News
  • Anecdote liée au fuzzing : https://threadreaderapp.com/thread/1799457232607985698
    Une excellente lecture si vous voulez perdre environ 11 minutes

    • Google ressort un article de CNET de 2007 ; c’est sans doute parce qu’eEye a « diffusé son communiqué de presse partout » : https://www.cnet.com/news/privacy/flaw-found-in-office-2007/
      J’ai du mal à comprendre cette culture qui consiste à rivaliser pour trouver des bugs dans les produits d’autres entreprises, puis à plastronner parce qu’on en a trouvé un dans Microsoft Publisher, tout en rabaissant Microsoft.
      Peut-être avons-nous tous de la chance d’avoir une entreprise dont le « processus standard » consiste à passer toute la semaine à tester notre produit en nuits blanches.
    • Le style d’écriture ajoute clairement au plaisir de lecture.
      En vérifiant l’auteur, il se pourrait que ce soit quelqu’un que je connaissais sur IRC ; « Mantis » et « infosec » correspondent parfaitement.
  • Ce qui est intéressant, c’est que l’approche de Go est nettement différente.
    En Go, on peut lancer du fuzzing aussi simplement que des tests, ce qui rend très facile le ciblage de parties précises d’une application ou d’une bibliothèque.
    Beaucoup de ces techniques deviennent donc inutiles.
    Je me demande quelles techniques permettent de mieux guider le fuzzing ; pour l’instant, le mieux semble être de fournir un corpus de seeds et d’espérer que ça marche.

    • Certains outils de fuzzing, comme libFuzzer, utilisent la représentation intermédiaire LLVM pour produire des métriques de couverture de code, puis les réinjectent dans l’algorithme de fuzzing afin d’augmenter la couverture des tests.
    • J’avais proposé comme sujet de doctorat l’idée d’utiliser l’apprentissage par renforcement pour guider la couverture, mais je ne suis finalement pas parti dans cette direction et je ne sais pas si cela fonctionnerait.
  • Je suis surpris que Heartbleed ne soit pas dans la liste. C’est très facile à reproduire.

    • Je suppose qu’il a été exclu parce que tous ces tutoriels utilisent des fichiers ou des données locales et ne couvrent pas le fuzzing réseau.