
Un hipervisor para fuzzing construido con WHVP y Bochs
¡Hola! ¡Bienvenido a applepie! Esta es una herramienta diseñada para fuzzing, introspección y encontrar errores. Es un hipervisor que utiliza la API de Windows Hypervisor Platform presente en versiones recientes de Windows (específicamente, fue desarrollado y probado en Windows 10 17763). Bochs se utiliza para proporcionar una introspección profunda y emulación de dispositivos.
La API de Windows Hypervisor Platform (WHVP) es un conjunto de API para acceder a las capacidades de hipervisor de Hyper-V. Esta API facilita la implementación de una máquina virtual completamente en el espacio de usuario, sin necesidad de controladores especiales ni permisos adicionales.
Este es un proyecto en rápido desarrollo. Probablemente twittearé cuando salgan nuevas funciones antes de que se documenten.
Me gusta tener objetos físicos para mis proyectos:
Esta es una herramienta diseñada para fuzzing e introspección durante la investigación en seguridad. Al usar un hipervisor, se pueden aplicar técnicas comunes de fuzzing a cualquier objetivo, ya sea kernel o espacio de usuario. Este entorno permite el fuzzing de sistemas completos sin necesidad del código fuente del objetivo. A nivel de hipervisor se puede recopilar cobertura de código y, si es necesario, se puede usar la emulación de Bochs para proporcionar introspección arbitraria en un entorno de emulación. Esta información de cobertura se puede utilizar para determinar la efectividad de los casos de fuzzing. Un caso de fuzzing que provocó un aumento en la cobertura se puede guardar por ser un caso interesante. Esta entrada se puede usar más tarde, mejorada con nuevas corrupciones.
El fuzzing con instantáneas es el uso principal de esta herramienta. Consiste en tomar una instantánea de un sistema en un estado determinado y guardarla. Luego, esta instantánea se puede cargar para el fuzzing, donde se inyecta un caso de fuzzing y se reanuda. Dado que la VM se puede reiniciar de manera muy económica, se puede reiniciar con frecuencia. Si Word tarda 5 segundos en iniciarse, pero puedes tomar una instantánea justo cuando lee tu archivo, puedes reducir el caso de fuzzing solo a lo que es relevante para una entrada. Esto permite un bucle de fuzzing muy ajustado sin necesidad de tener acceso al código fuente. Como las VM son sistemas completamente separados, se pueden ejecutar muchas en paralelo para escalar a todos los núcleos.
Actualmente, esta herramienta solo admite la recopilación de cobertura de código, la descarga dinámica de símbolos para Windows y el análisis de símbolos/módulos para objetivos Windows también. La adición de soporte para fuzzing será muy pronto.
Dado que ya he escrito casi todas las funciones aquí antes (cobertura, fuzzing, reinicios rápidos, etc.), espero que este proyecto se vuelva rápidamente utilizable para fuzzing, a menos que me distraiga :D
Apunto a finales de enero para cobertura (¡hecho!), comentarios, listados de módulos (¡hecho!), listas de procesos, reinicios rápidos y soporte de símbolos (¡hecho!). Eso lo convertiría en un fuzzer muy capaz.
El objetivo principal compatible es Windows 10 moderno. Los objetivos Windows tienen descarga de símbolos desde el almacén de símbolos. Esto permite una cobertura simbólica en objetivos Windows de forma inmediata. Sin embargo, el código está escrito de manera que se pueda agregar fácilmente iluminación para Linux.
Sin ninguna iluminación, cualquier sistema operativo que arranque aún puede ser fuzzeado y se puede recopilar cobertura básica.
Antes de informar problemas de soporte de SO, valide que el problema esté en el hipervisor/cambios en Bochs intentando arrancar su objetivo usando Bochs estándar preconstruido sin hipervisor. Bochs no se usa comúnmente y puede tener errores críticos incluso para cosas comunes como arrancar Linux. Especialmente con los rápidos cambios internos en los usos de CPUID/MSR con las mitigaciones de Spectre/Meltdown en los sistemas operativos.
Consulte la página de issues en Github para obtener una lista de problemas. Ya he sembrado algunos. Algunos de estos deben solucionarse rápidamente antes de que comience el desarrollo de fuzzing.
Para compilar esto necesitas algunas cosas:
Instale Visual Studio 2017 y asegúrese de que esté actualizado. Aquí estamos usando API, encabezados y bibliotecas de vanguardia.
Yo usaba la versión de cl.exe: Microsoft (R) C/C++ Optimizing Compiler Version 19.16.27025.1 for x64
Y la versión del SDK 10.0.17763.0
Instale Rust a través de https://rustup.rs/. Yo usé rustc 1.32.0-nightly (b3af09205 2018-12-04)
Asegúrese de instalar el toolchain x86_64-pc-windows-msvc, ya que solo se admite 64 bits para este proyecto.
Asegúrese de que cargo esté en su PATH. Esto debería ser el valor predeterminado.
Vaya a https://www.python.org/ y asegúrese de que esté en su PATH para que se pueda invocar python.
Instale Cygwin de 64 bits (https://www.cygwin.com/setup-x86_64.exe) específicamente en C:\cygwin64. Al instalar Cygwin, asegúrese de instalar los paquetes autoconf y make.
Vaya a "Activar o desactivar las características de Windows" y marque la casilla junto a "Hyper-V" y "Windows Hypervisor Platform". Esto requiere, por supuesto, que su computadora tenga soporte para Hyper-V.
Esta guía de instalación fue verificada en lo siguiente:
Instalación limpia de 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

