
GUSTAVE è una piattaforma di fuzzing per kernel di sistemi operativi embedded. Si basa su QEMU e AFL (e tutti i suoi fork-server correlati). Consente di eseguire fuzzing sui kernel di sistema operativo come se fossero semplici applicazioni.
(c) Airbus 2021, sduverger
GUSTAVE è una piattaforma di fuzzing per kernel di sistemi operativi embedded. È basata su QEMU e AFL (e tutti i suoi forkserver fratelli). Permette di fare fuzzing dei kernel di sistemi operativi come se fossero semplici applicazioni.
Grazie a QEMU, è multi-piattaforma. Si può vedere GUSTAVE come un'implementazione di forkserver AFL all'interno di QEMU, con ispezione fine del target.
GUSTAVE è stato progettato principalmente per colpire kernel di sistemi operativi embedded. Potrebbe non essere il miglior strumento per fare fuzzing di kernel grandi e complessi come quelli di Windows, Linux o macOS.
Tuttavia, se hai un target sotto il cofano che può essere preparato con una o due applicazioni per avviarsi senza alcuna interazione utente, potrebbe essere interessante provare GUSTAVE.
Lo strumento afl-fuzz, del progetto AFL, viene utilizzato per fare fuzzing automatico del tuo target. Tuttavia, AFL non può fare fuzzing direttamente di un kernel di sistema operativo e si aspetta che il suo target analizzi direttamente i casi di test generati.
Per farla breve, afl-fuzz eseguirà QEMU con l'integrazione di GUSTAVE come suo target. A sua volta, GUSTAVE gestirà:
Come la modalità utente AFL/QEMU del progetto AFL++, GUSTAVE implementa l'instrumentazione binaria a livello QEMU TCG IR per la copertura del codice.
Tuttavia, puoi scegliere di disabilitarla e ricostruire il codice del kernel target con solo parti specifiche soggette all'analisi di copertura del codice. Dovrai però iniettare gli shim AFL in fase di compilazione per aggiornare le bitmap di traccia. Questo è stato il nostro approccio iniziale (vedi Publications).
Meno diffuso nelle soluzioni esistenti, GUSTAVE non si preoccupa di monitorare i kernel panics. Li consideriamo errori gestiti e vogliamo scoprire comportamenti illegali che non hanno attivato alcun allarme.
A tal fine, GUSTAVE si basa su una bitmap di filtraggio della memoria orientata ai byte O(1) per rilevare accessi illegali dal kernel. Potrebbe esserci un ampio dibattito su cosa possa essere considerato illegale dal punto di vista del kernel. Ma in ambienti embedded ristretti e altamente deterministici, potresti sentirti a tuo agio nel definire aree di memoria legittime per il tuo firmware e nel tracciare accessi fuori dai limiti.
Esistono approcci comparabili, come:
Le scelte progettuali di GUSTAVE implicano le seguenti differenze:
Tuttavia, devi comunque dire a GUSTAVE:
Per ora è supportato solo l'host x86, poiché molti ambienti di lavoro sono basati su questa architettura, non la consideriamo una limitazione proibitiva.
La restrizione deriva dal modo in cui abbiamo inizialmente implementato il backend di filtraggio della memoria a livello tcg-target per il percorso veloce di load/store di QEMU. La recente architettura di callback di memoria TCGPlugin potrebbe essere un approccio alternativo per supportare qualsiasi host.
Abbiamo implementato e testato il supporto per Intel x86 e PowerPC. L'implementazione di GUSTAVE è indipendente dall'architettura. Se puoi eseguire il tuo target con QEMU, puoi fare fuzzing con GUSTAVE con poco sforzo.
Forniamo esempi di schede Intel 440FX e PowerPC PREP con integrazione GUSTAVE. L'implementazione della propria scheda è molto semplice e consiste nell'incapsulare la funzione MACHINE_INIT per una data architettura.
Abbiamo anche aggiunto il supporto per gli shim di instrumentazione GUSTAVE per x86 e PowerPC a afl-gcc, nel caso in cui non si voglia procedere con l'instrumentazione binaria TCG.
Forniamo sviluppi specifici per il micro-kernel POK:
Avrai bisogno di:
Leggi il manuale per il target POK.
I materiali di vari talk su GUSTAVE si trovano su https://airbus-seclab.github.io/.