Tests sur des noyaux peu dynamiques (pas de Windows, Linux...)
Dans ces micro kernels, il y a des couches métiers assez importantes.
On va essayer de casser un OS à partir d'une application.
On génère des séquences d'appels systemes pour mettre à mal le noyau
Technique du syscall généré par le fuzzer: couvrir le maximum de code dans le kernel pour générer un deni de service ou un buffer overflow.
Outil de fuzzing: AFL qui est fait pour fuzzer des applis de base
On fait parser par la libpng par exemple
AFL generique un test case, afl-fuzz
Et pour fuzzer un OS?
On prend un noyau dont on a le code source, on recompile le noyau, par contre, on s'en fiche des applications de cet OS. Ce qui nous intéresse c'est ce qu'il y a dans le noyau.
Ce n'est pas nouveau, il existe plein d'outils sous Windows et linux, pas dans l'embarqué c'est rare. Il existe Triforce AFL qui permet de fuzzer des binaires dont on n'a pas de code source. Ils 'appuie sur QMU qui est est capable de décomposer le code d'un programme en basic blocs
Mais, les intégrateurs ont accès au code source.
AFL-unicorn
On va laisser penser AFL qui va fuzzer QEMU
AFL a une optimistion fork server qui evite pour chaque test case soit repris depuis le début
AFL genere les tests cases, les envoie à QEMU. Ce flux est traduit en appels sequences systemes qui provoque des executions de composants du noyaux, qui mettent en evidence une coverage map qui sera analysé par AFL.
On recompile le noyau cible pour pouvoir injecter les shms
AFL crée une SHM dans l'hôte
LA cible accède à une adresse MMIO arbitraire
GUSTAVE al redirige vers la bitmap d'AFL
Aucun surcout à l'execution.
Gustave: interprétation des entrées d'AFL?
Transformer les données brutes en programmes
Traduire les entrées AFL en séquences d'appels système (et le modéliser en ARM, X86...)
Spécifique à l'architectuire et à la cible
AFL classifie les tests-cases
Fin d'execution ormale
Time-out
faute (abort, segv)
Gustave intercepte des evenements
Timers dans QEMU
Breakpoints internes
Fin du test injecté
Fautes controlées: panic, reboot
PAs de véritable garde-fou noyau
Detection d'accès illégitimes silencieux
Définition d'oravles mémoire
SNapshot fuzzing: on sauvegarde l'intégralité de la machine virtuelle. On monitore
Gustave: configuration de Gustave
usage basique:
AFL (AFL fast, AFLGo, Fair-fuzz) -> afl-buzz -> Gustave -> (QEMU) OS
Cas d'usage: POC sur l'os POK
Petit OS open source pour tester
Vérification formelle à 90%, avc des vulnérabilités, en 1 seconde, on trouve 25 0days !
Diverses possibilités d'interprétation des entrées (exemple de POK_SYSCALL_MIDDLEWARE_QUEUEING_SEND)
MMU POK
pas de pagination, mais de la segmentation
Oracle GUSTAVE
Mapping exclusif des plages mémoire utilisateur/noyau
Interception des fautes de pages sur les zones non mappées
Cet article reflète exclusivement l'opinion de ses auteurs et n’engage en aucune façon Consultingit. J'espère que ça vous a plu. Vos commentaires/remarques sont les bienvenus: