
GUSTAVE é uma plataforma de fuzzing para kernels de sistemas operacionais embarcados. É baseada no QEMU e AFL (e todos os seus forkserver irmãos). Permite realizar fuzzing em kernels de SO como se fossem aplicações simples.
(c) Airbus 2021, sduverger
GUSTAVE é uma plataforma de fuzzing para kernels de SO embarcados. É baseado no QEMU e no AFL (e todos os seus forkservers irmãos). Permite fuzzear kernels de SO como se fossem aplicações simples.
Graças ao QEMU, é multi-plataforma. Pode-se ver o GUSTAVE como uma implementação do forkserver do AFL dentro do QEMU, com inspeção de alvo de grão fino.
GUSTAVE foi principalmente projetado para kernels de SO embarcados. Pode não ser a melhor ferramenta para fuzzear kernels grandes e complexos como os encontrados no Windows, Linux ou MACOS.
No entanto, se você tem um alvo que pode ser preparado com uma ou duas aplicações para iniciar sem qualquer interação do usuário, pode ser interessante dar uma chance ao GUSTAVE.
A ferramenta afl-fuzz, do projeto AFL, é usada para fuzzear automaticamente o seu alvo. No entanto, o AFL não pode fuzzear diretamente um kernel de SO e espera que seu alvo analise diretamente os casos de teste gerados.
Resumindo, afl-fuzz executará o QEMU com integração do GUSTAVE como seu alvo. Por sua vez, o GUSTAVE lidará com:
Assim como o modo AFL/QEMU-user encontrado no projeto AFL++, o GUSTAVE implementa instrumentação binária no nível IR TCG do QEMU para cobertura de código.
No entanto, você pode optar por desativá-la e reconstruir o código do kernel alvo com apenas partes específicas sujeitas à análise de cobertura de código. Você terá que injetar shims do AFL no momento da compilação para atualizar os bitmaps de rastreamento, no entanto. Essa foi a nossa abordagem inicial (veja Publicações).
Menos prevalente nas soluções existentes, o GUSTAVE não se preocupa em monitorar kernel panics. Nós os consideramos erros gerenciados e queremos descobrir comportamentos ilegais que não dispararam nenhum alarme.
Para esse propósito, o GUSTAVE depende de um bitmap de filtragem de memória orientado a bytes O(1) para detectar acessos ilegais do kernel. Pode haver um grande debate sobre o que poderia ser considerado ilegal do ponto de vista do kernel. Mas em ambientes embarcados restritos e altamente determinísticos, você pode se sentir confortável em definir áreas de memória legítimas para seu firmware e rastrear acessos fora dos limites.
Existem abordagens comparáveis, tais como:
As escolhas de design do GUSTAVE implicam nas seguintes diferenças:
No entanto, você ainda precisa informar ao GUSTAVE:
Por enquanto, apenas hospedeiros x86 são suportados; como muitos ambientes de trabalho são baseados nessa arquitetura, não consideramos isso uma limitação proibitiva.
A restrição vem da forma como implementamos inicialmente o backend de filtragem de memória no nível tcg-target para o caminho rápido de load/store do QEMU. A arquitetura recente de callbacks de memória TCGPlugin pode ser uma abordagem alternativa para suportar qualquer hospedeiro.
Implementamos e testamos suporte para Intel x86 e PowerPC. A implementação do GUSTAVE é independente de arquitetura. Se você puder executar seu alvo com QEMU, pode fuzzeá-lo com GUSTAVE com pouco esforço.
Fornecemos placas de exemplo Intel 440FX e PowerPC PREP com integração GUSTAVE. A implementação da sua própria placa é muito fácil e consiste em envolver a função MACHINE_INIT para uma determinada arquitetura.
Também adicionamos suporte para shims de instrumentação GUSTAVE para x86 e PowerPC ao afl-gcc, caso você não queira prosseguir com a instrumentação binária TCG.
Fornecemos desenvolvimentos específicos para o micro-kernel POK:
Você precisará:
Leia o manual para o alvo POK.
Material de diferentes palestras sobre GUSTAVE pode ser encontrado em https://airbus-seclab.github.io/.