
Un outil qui crée automatiquement des harnais de fuzzing à partir d'une bibliothèque
AutoHarness est un outil qui génère automatiquement des harnais de fuzzing pour vous. Cette idée découle d'un problème actuel dans le fuzzing des bases de code : les grandes bases de code contiennent des milliers de fonctions et de morceaux de code qui peuvent être assez profondément enfouis dans la bibliothèque. Il est très difficile, voire parfois impossible, pour les fuzzers intelligents d'atteindre ce chemin de code. Même pour de grands projets de fuzzing comme oss-fuzz, certaines parties de la base de code ne sont pas couvertes par le fuzzing. Par conséquent, ce programme essaie d'atténuer ce problème dans une certaine mesure et fournit également un outil que les chercheurs en sécurité peuvent utiliser pour tester initialement une base de code. Ce programme ne prend en charge que les bases de code écrites en C et C++.
Ce programme utilise llvm et clang pour libfuzzer, Codeql pour trouver les fonctions, et python pour le programme général. Ce programme a été testé sur Ubuntu 20.04 avec llvm 12 et python 3. Voici la configuration initiale.
sudo apt-get update;
sudo apt-get install python3 python3-pip llvm-12* clang-12 git;
pip3 install pandas lief subprocess os argparse ast;
Suivez la procédure d'installation de Codeql sur https://github.com/github/codeql. Assurez-vous d'installer les outils CLI et les bibliothèques. Pour mes tests, j'ai stocké à la fois les outils et les bibliothèques dans un seul dossier. Enfin, clonez ce dépôt ou téléchargez une version. Voici la sortie du programme après exécution sur nginx avec le mode d'argument multiple activé. Voici la commande que j'ai utilisée.
python3 harness.py -L /home/akshat/nginx-1.21.0/objs/ -C /home/akshat/codeql-h/ -M 1 -O /home/akshat/autoharness/ -D nginx -G 1 -Y 1 -F "-I /home/akshat/nginx-1.21.0/objs -I /home/akshat/nginx-1.21.0/src/core -I /home/akshat/nginx-1.21.0/src/event -I /home/akshat/nginx-1.21.0/src/http -I /home/akshat/nginx-1.21.0/src/mail -I /home/akshat/nginx-1.21.0/src/misc -I /home/akshat/nginx-1.21.0/src/os -I /home/akshat/nginx-1.21.0/src/stream -I /home/akshat/nginx-1.21.0/src/os/unix" -X ngx_config.h,ngx_core.h
Résultats :
Il est tout à fait possible d'augmenter le taux de réussite en déboguant davantage la compilation et en ajoutant plus de fichiers d'en-tête, etc. Notez que le projet nginx ne possède pas d'objets partagés après la compilation. Cependant, ce programme dispose d'une fonctionnalité permettant de convertir des exécutables PIE en bibliothèques partagées.
La méthode actuellement implémentée dans le programme pour fuzzer les fonctions avec plusieurs arguments utilise un fournisseur de données de fuzzing. Il y a quelques améliorations à apporter dans cette intégration ; cependant, je pense pouvoir intégrer cette fonctionnalité avec les structures de données. Un problème que j'ai rencontré en codant cela est lié à CodeQL et aux structures imbriquées. Cela devient particulièrement difficile sans écrire plusieurs requêtes qui varient pour chaque fonction. En bref, cette fonctionnalité nécessite plus de travail. Je pensais aussi à une solution simple utilisant des protobufs.
En utilisant CodeQL, il est possible de générer un graphe de flux de contrôle qui cartographie la façon dont les paramètres d'une fonction sont initialisés. À l'aide de ces informations, nous pouvons créer un meilleur harnais. Une autre méthode consiste à rechercher des implémentations de la fonction qui existent dans la bibliothèque et à utiliser ces informations pour faire une estimation éclairée d'une implémentation de la fonction en tant que harnais. Les problèmes que j'ai actuellement avec cela sont la génération des graphes de flux de contrôle avec CodeQL.
Je peux créer un programme simple qui exécute tous les harnais et détecte les faux positifs courants en utilisant ASAN. Je peux également créer une nouvelle interface qui exécute tous les harnais à la fois et affiche leurs statistiques.
Si vous trouvez des bogues dans ce programme, veuillez créer une issue. J'essaierai de proposer un correctif. De plus, si vous avez des idées sur de nouvelles fonctionnalités ou sur la façon d'implémenter des améliorations de performance ou les fonctionnalités prévues actuelles, veuillez créer une pull request ou une issue avec le tag (contribution).
Cet outil génère quelques faux positifs. Veuillez d'abord analyser les crashs et vérifier s'il s'agit d'un bogue valide ou d'un simple bogue d'implémentation. Vous pouvez également activer le mode débogage si certaines fonctions ne se compilent pas. Cela vous aidera à comprendre s'il manque des fichiers d'en-tête ou s'il y a des problèmes de liaison. Si le projet sur lequel vous travaillez n'a pas de bibliothèques partagées mais un exécutable, assurez-vous de compiler l'exécutable sous forme PIE afin que ce programme puisse le convertir en bibliothèque partagée.