
GUSTAVE est une plateforme de fuzzing pour les noyaux de systèmes d'exploitation embarqués. Elle est basée sur QEMU et AFL (ainsi que tous ses forkserver frères). Elle permet de fuzzer les noyaux OS comme de simples applications.
(c) Airbus 2021, sduverger
GUSTAVE est une plateforme de fuzzing pour les noyaux de systèmes d'exploitation embarqués. Il est basé sur QEMU et AFL (et tous ses frères forkserver). Il permet de fuzzer les noyaux OS comme de simples applications.
Grâce à QEMU, il est multi-plateforme. On peut voir GUSTAVE comme une implémentation AFL forkserver à l'intérieur de QEMU, avec une inspection fine de la cible.
GUSTAVE a principalement été conçu pour cibler les noyaux de systèmes embarqués. Il pourrait ne pas être le meilleur outil pour fuzzer des noyaux volumineux et complexes comme ceux trouvés dans Windows, Linux ou MACOS.
Cependant, si vous avez une cible sous le capot qui peut être préparée avec une ou deux applications à démarrer sans aucune interaction utilisateur, il pourrait être intéressant d'essayer GUSTAVE.
L'outil afl-fuzz, du projet AFL, est utilisé pour fuzzer automatiquement votre cible. Cependant, AFL ne peut pas fuzzer directement un noyau OS et s'attend à ce que sa cible analyse directement les cas de test générés.
Pour faire court, afl-fuzz exécutera QEMU avec l'intégration GUSTAVE comme cible. En retour, GUSTAVE gérera :
Comme dans le mode AFL/QEMU-user trouvé dans le projet AFL++, GUSTAVE implémente une instrumentation binaire au niveau TCG IR de QEMU pour la couverture de code.
Cependant, vous pouvez choisir de la désactiver et reconstruire le code de votre noyau cible en ne soumettant que des parties spécifiques à l'analyse de couverture de code. Vous devrez toutefois injecter des shims AFL au moment de la compilation pour mettre à jour les bitmaps de trace. C'était notre approche initiale (voir Publications).
Moins répandu dans les solutions existantes, GUSTAVE ne se préoccupe pas de surveiller les kernel panics. Nous les considérons comme des erreurs gérées, et nous voulons découvrir des comportements illégaux qui n'ont déclenché aucune alarme.
À cette fin, GUSTAVE s'appuie sur un bitmap de filtrage mémoire orienté octet en O(1) pour détecter les accès illégaux depuis le noyau. Il pourrait y avoir un large débat sur la définition de ce qui pourrait être considéré comme illégal du point de vue du noyau. Mais dans des environnements embarqués restreints et hautement déterministes, vous pourriez vous sentir à l'aise de définir des zones mémoire légitimes pour votre firmware et de suivre les accès hors limites.
Il existe des approches comparables, telles que :
Les choix de conception de GUSTAVE impliquent les différences suivantes :
Cependant, vous devez toujours dire à GUSTAVE :
Pour l'instant, seul l'hôte x86 est supporté, car de nombreux environnements de travail sont basés sur cette architecture, nous ne considérons pas cela comme une limitation prohibitive.
La restriction provient de la façon dont nous avons initialement implémenté le backend de filtrage mémoire au niveau tcg-target pour le chemin rapide de chargement/stockage de QEMU. La récente architecture de rappels mémoire TCGPlugin pourrait être une approche alternative pour supporter n'importe quel hôte.
Nous avons implémenté et testé le support Intel x86 et PowerPC. L'implémentation de GUSTAVE est indépendante de l'architecture. Si vous pouvez exécuter votre cible avec QEMU, vous pouvez la fuzzer avec GUSTAVE avec peu d'effort.
Nous fournissons des exemples de cartes Intel
440FX
et PowerPC
PREP
avec intégration GUSTAVE. L'implémentation de votre propre carte est très simple, et consiste à envelopper la fonction MACHINE_INIT pour une architecture donnée.
Nous avons également ajouté le support des shims d'instrumentation GUSTAVE pour x86 et PowerPC à afl-gcc, au cas où vous ne voudriez pas procéder avec l'instrumentation binaire TCG.
Nous fournissons des développements spécifiques au micro-noyau POK :
Vous aurez besoin de :
Lisez le manuel pour la cible POK.
Le matériel provenant de différentes présentations sur GUSTAVE peut être trouvé sur https://airbus-seclab.github.io/.