Consulting, services, computer engineering. Implementation of technology solutions and support for businesses.

User Rating: 5 / 5

Star ActiveStar ActiveStar ActiveStar ActiveStar Active
 

 

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: