
Un ipervisore per fuzzing costruito con WHVP e Bochs
Ciao! Benvenuto in applepie! Questo è uno strumento progettato per fuzzing, introspezione e ricerca di bug! È un hypervisor che utilizza l'API Windows Hypervisor Platform presente nelle versioni recenti di Windows (in particolare è stato sviluppato e testato su Windows 10 17763). Bochs viene utilizzato per fornire un'introspezione approfondita e l'emulazione dei dispositivi.
L'API Windows Hypervisor Platform (WHVP) è un insieme di API per accedere alle funzionalità di hypervisor di Hyper-V. Questa API ci facilita l'implementazione di una macchina virtuale interamente in spazio utente senza bisogno di driver speciali o permessi.
Questo è un progetto in rapido sviluppo. Probabilmente twitto quando escono nuove funzionalità prima che vengano documentate.
Mi piace avere oggetti fisici per i miei progetti:
Questo è uno strumento progettato per il fuzzing e l'introspezione durante la ricerca sulla sicurezza. Utilizzando un hypervisor, è possibile applicare tecniche comuni di fuzzing a qualsiasi target, kernel o spazio utente. Questo ambiente permette di fare fuzzing di interi sistemi senza bisogno del codice sorgente del target. A livello di hypervisor è possibile raccogliere la copertura del codice e, se necessario, l'emulazione Bochs può essere utilizzata per fornire introspezione arbitraria in un ambiente di emulazione. Queste informazioni di copertura possono essere utilizzate per determinare l'efficacia dei casi di fuzz. Un caso di fuzz che ha causato un aumento della copertura può essere salvato poiché è risultato interessante. Questo input può essere utilizzato in seguito, costruendovi sopra nuove corruzioni.
Il fuzzing con snapshot è l'uso principale di questo strumento. Si prende uno snapshot di un sistema in un certo stato e lo si salva. Questo snapshot può poi essere caricato per il fuzzing, dove viene iniettato un caso di fuzz e si riprende l'esecuzione. Poiché la VM può essere resettata molto a buon mercato, la VM può essere resettata spesso. Se Word impiega 5 secondi per avviarsi, ma si può fare uno snapshot proprio mentre legge il file, si può ridurre il caso di fuzz a solo ciò che è rilevante per un input. Ciò consente un ciclo molto stretto di fuzzing senza dover avere accesso al codice sorgente. Poiché le VM sono sistemi completamente separati, molte possono essere eseguite in parallelo per scalare su tutti i core.
Attualmente questo strumento supporta solo la raccolta della copertura del codice, il download dinamico dei simboli per Windows e l'analisi di simboli/moduli per target Windows. L'aggiunta del supporto per il fuzzing sarà molto presto.
Dato che ho già scritto quasi tutte le funzionalità qui in precedenza (copertura, fuzzing, reset rapidi, ecc.), mi aspetto che questo progetto diventi rapidamente pronto per il fuzzing, a meno che non venga distratto :D
Punto a fine gennaio per la copertura (fatto!), feedback, elenchi di moduli (fatto!), elenchi di processi, reset rapidi e supporto dei simboli (fatto!). Il che lo renderebbe un fuzzer molto capace.
Il target principale supportato è il moderno Windows 10. I target Windows hanno il download dei simboli dal symbol store. Ciò consente una copertura simbolica nei target Windows pronta all'uso. Tuttavia, il codice è scritto in modo tale che l'enlightenment per Linux possa essere facilmente aggiunto.
Senza alcun enlightenment, qualsiasi SO che si avvia può comunque essere sottoposto a fuzzing e si può raccogliere una copertura di base.
Prima di segnalare problemi di supporto SO, verifica che il problema sia nell'hypervisor/modifiche a Bochs provando ad avviare il tuo target utilizzando Bochs standard precompilato senza hypervisor. Bochs non è comunemente usato e può avere frequenti bug che rompono anche cose comuni come l'avvio di Linux. Soprattutto con i rapidi cambiamenti interni agli usi di CPUID/MSR con le mitigazioni Spectre/Meltdown che vengono integrate nei SO.
Vedi la pagina delle issues su Github per un elenco di problemi. Ne ho già inseriti alcuni. Alcuni di questi devono essere affrontati rapidamente prima di iniziare lo sviluppo del fuzzing.
Per compilare questo hai bisogno di alcune cose:
Installa Visual Studio 2017 e assicurati che sia aggiornato. Stiamo usando API, header e librerie all'avanguardia qui.
Stavo usando cl.exe versione: Microsoft (R) C/C++ Optimizing Compiler Version 19.16.27025.1 for x64
E SDK versione 10.0.17763.0
Installa Rust tramite https://rustup.rs/. Ho usato rustc 1.32.0-nightly (b3af09205 2018-12-04)
Assicurati di installare il toolchain x86_64-pc-windows-msvc poiché per questo progetto è supportato solo il 64-bit.
Assicurati che cargo sia nel tuo PATH. Dovrebbe essere l'impostazione predefinita.
Vai a prendere Python https://www.python.org/ e assicurati che sia nel tuo PATH in modo che python possa essere invocato.
Installa Cygwin a 64 bit (https://www.cygwin.com/setup-x86_64.exe) specificamente in C:\cygwin64. Durante l'installazione di Cygwin assicurati di installare i pacchetti autoconf e make.
Vai su "Attiva o disattiva funzionalità di Windows" e spunta la casella accanto a "Hyper-V" e "Piattaforma Hypervisor Windows". Questo richiede ovviamente che il tuo computer supporti Hyper-V.
Questa guida al processo di installazione è stata verificata su:
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

