
Um hipervisor para fuzzing construído com WHVP e Bochs
Olá! Bem-vindo ao applepie! Esta é uma ferramenta projetada para fuzzing, introspecção e encontrar bugs! Este é um hypervisor que utiliza a API Windows Hypervisor Platform presente em versões recentes do Windows (especificamente, foi desenvolvido e testado no Windows 10 17763). O Bochs é usado para fornecer introspecção profunda e emulação de dispositivos.
A API Windows Hypervisor Platform (WHVP) é um conjunto de APIs para acessar as capacidades de hypervisor do Hyper-V. Essa API facilita a implementação de uma máquina virtual totalmente em espaço de usuário, sem necessidade de drivers ou permissões especiais.
Este é um projeto em rápido desenvolvimento. Provavelmente twittarei quando novos recursos forem lançados antes de serem documentados.
Gosto de ter coisas físicas para meus projetos:
Esta é uma ferramenta projetada para fuzzing e introspecção durante a pesquisa de segurança. Usando um hypervisor, técnicas comuns de fuzzing podem ser aplicadas a qualquer alvo, kernel ou userland. Este ambiente permite fuzzing de sistemas inteiros sem necessidade de acesso ao código fonte do alvo. No nível do hypervisor, a cobertura de código pode ser coletada e, se necessário, a emulação do Bochs pode ser usada para fornecer introspecção arbitrária em um ambiente de emulação. Essas informações de cobertura podem ser usadas para avaliar a eficácia dos casos de fuzz. Um caso de fuzz que causou um aumento na cobertura pode ser salvo por ser um caso interessante. Essa entrada pode ser usada posteriormente, sendo incrementada por novas corrupções.
O fuzzing de snapshots é o uso principal desta ferramenta. Onde você tira um snapshot de um sistema em um determinado estado e o salva. Esse snapshot pode então ser carregado para fuzzing, onde um caso de fuzz é injetado e o sistema é retomado. Como a VM pode ser reiniciada de forma muito barata, a VM pode ser reiniciada com frequência. Se o Word leva 5 segundos para inicializar, mas você pode tirar um snapshot no momento em que ele lê seu arquivo, você pode reduzir o caso de fuzz apenas ao que é relevante para uma entrada. Isso permite um loop de fuzzing muito apertado sem necessidade de ter acesso ao código fonte. Como as VMs são sistemas completamente separados, muitas podem ser executadas em paralelo para permitir escalabilidade para todos os núcleos.
Atualmente, esta ferramenta suporta apenas a coleta de cobertura de código, download dinâmico de símbolos para Windows e análise de símbolos/módulos para alvos Windows também. Adicionar suporte para fuzzing será em breve.
Considerando que já escrevi quase todos os recursos aqui antes (cobertura, fuzzing, reinicializações rápidas, etc). Eu espero que este projeto se torne rapidamente pronto para fuzzing, a menos que eu me distraia :D
Estou mirando o final de janeiro para cobertura (concluído!), feedback, listagens de módulos (concluído!), listas de processos, reinicializações rápidas e suporte a símbolos (concluído!). O que o tornaria um fuzzer muito capaz.
O principal alvo suportado é o Windows 10 moderno. Os alvos Windows têm download de símbolos da loja de símbolos. Isso permite cobertura simbólica em alvos Windows imediatamente. No entanto, o código é escrito de forma que a iluminação (enlightenment) do Linux possa ser facilmente adicionada.
Sem qualquer iluminação, qualquer SO que inicialize ainda pode ser submetido a fuzzing e a cobertura básica pode ser coletada.
Antes de relatar problemas de suporte a SO, valide se o problema está no hypervisor/alterações no Bochs tentando inicializar seu alvo usando o Bochs pré-construído padrão sem hypervisor. O Bochs não é comumente usado e pode frequentemente ter bugs que quebram até mesmo tarefas comuns como inicializar o Linux. Especialmente com as rápidas mudanças internas nos usos de CPUID/MSR com as mitigações Spectre/Meltdown sendo incorporadas aos SOs.
Consulte a página de issues no Github para uma lista de problemas. Já coloquei algumas. Alguns desses precisam ser resolvidos rapidamente antes do início do desenvolvimento de fuzzing.
Para compilar isso, você precisa de algumas coisas:
Instale o Visual Studio 2017 e certifique-se de que está atualizado. Estamos usando algumas APIs, cabeçalhos e bibliotecas de ponta aqui.
Eu estava usando a versão cl.exe: Microsoft (R) C/C++ Optimizing Compiler Version 19.16.27025.1 for x64
E versão do SDK 10.0.17763.0
Instale o Rust via https://rustup.rs/. Usei rustc 1.32.0-nightly (b3af09205 2018-12-04)
Certifique-se de instalar a toolchain x86_64-pc-windows-msvc, pois apenas 64-bit é suportado para este projeto.
Certifique-se de que cargo está no seu PATH. Isso deve ser o padrão.
Baixe o Python https://www.python.org/ e certifique-se de que ele está no seu PATH para que python possa ser invocado.
Instale o Cygwin 64-bit (https://www.cygwin.com/setup-x86_64.exe) especificamente em C:\cygwin64. Ao instalar o Cygwin, certifique-se de instalar os pacotes autoconf e make.
Vá em "Ativar ou desativar recursos do Windows" e marque a caixa de seleção ao lado de "Hyper-V" e "Windows Hypervisor Platform". Isso requer, é claro, que seu computador suporte Hyper-V.
Este guia de processo de instalação foi verificado no seguinte:
Clean install of Windows 10, Build 17763
rustc 1.33.0-nightly (8e2063d02 2019-01-07)
Microsoft (R) C/C++ Optimizing Compiler Version 19.16.27025.1 for x64
Visual Studio Community 2017 version 15.9.4
applepie commit `f84c084feb487e2e7f31f9052a4ab0addd2c4cf9`
Python 3.7.2 x64
git version 2.20.1.windows.1

