
GUSTAVE es una plataforma de fuzzing para kernels de SO embebidos. Está basada en QEMU y AFL (y todos sus hermanos del forkserver). Permite realizar fuzzing a kernels de SO como si fueran aplicaciones simples.
(c) Airbus 2021, sduverger
GUSTAVE es una plataforma de fuzzing para kernels de sistemas operativos embebidos. Está basada en QEMU y AFL (y todos sus hermanos forkserver). Permite fuzzear kernels de SO como si fueran aplicaciones simples.
Gracias a QEMU, es multiplataforma. Se puede ver GUSTAVE como una implementación de forkserver de AFL dentro de QEMU, con inspección de objetivo de grano fino.
GUSTAVE ha sido diseñado principalmente para apuntar a kernels de SO embebidos. Puede que no sea la mejor herramienta para fuzzear kernels grandes y complejos como los de Windows, Linux o MACOS.
Sin embargo, si tienes un objetivo bajo el capó que se pueda preparar con una o dos aplicaciones para arrancar sin interacción del usuario, podría ser interesante darle una oportunidad a GUSTAVE.
La herramienta afl-fuzz, del proyecto AFL, se utiliza para fuzzear automáticamente tu objetivo. Sin embargo, AFL no puede fuzzear directamente un kernel de SO y espera que su objetivo analice directamente los casos de prueba generados.
En resumen, afl-fuzz ejecutará QEMU con la integración de GUSTAVE como su objetivo. A su vez, GUSTAVE manejará :
Al igual que el modo de usuario AFL/QEMU que se encuentra en el proyecto AFL++, GUSTAVE implementa instrumentación binaria a nivel de IR de TCG de QEMU para la cobertura de código.
Sin embargo, puedes optar por deshabilitarlo y reconstruir el código del kernel objetivo solo con partes específicas sujetas al análisis de cobertura de código. Tendrás que inyectar shims de AFL en tiempo de compilación para actualizar los bitmaps de rastreo. Ese fue nuestro enfoque inicial (ver Publicaciones).
Menos prevalente en las soluciones existentes, GUSTAVE no se preocupa por monitorear kernel panics. Los consideramos errores gestionados y queremos descubrir comportamientos ilegales que no activaron ninguna alarma.
Para ese propósito, GUSTAVE se basa en un bitmap de filtrado de memoria orientado a bytes O(1) para detectar accesos ilegales desde el kernel. Puede haber un gran debate sobre definir qué podría considerarse ilegal desde el punto de vista del kernel. Pero en entornos embebidos restringidos y altamente deterministas, podrías sentirte cómodo definiendo áreas de memoria legítimas para tu firmware y rastreando accesos fuera de los límites.
Existen enfoques comparables, como:
Las elecciones de diseño de GUSTAVE implican las siguientes diferencias:
Sin embargo, aún necesitas decirle a GUSTAVE:
Por ahora solo se admite host x86, ya que muchos entornos de trabajo se basan en esta arquitectura, no lo consideramos una limitación prohibitiva.
La restricción proviene de la forma en que inicialmente implementamos el backend de filtrado de memoria a nivel tcg-target para la ruta rápida de carga/almacenamiento de QEMU. La arquitectura reciente de callbacks de memoria TCGPlugin podría ser un enfoque alternativo para admitir cualquier host.
Hemos implementado y probado soporte para Intel x86 y PowerPC. La implementación de GUSTAVE es independiente de la arquitectura. Si puedes ejecutar tu objetivo con QEMU, puedes fuzzearlo con GUSTAVE con poco esfuerzo.
Proporcionamos ejemplos de placas Intel 440FX y PowerPC PREP con integración de GUSTAVE. La implementación de tu propia placa es realmente fácil y consiste en envolver la función MACHINE_INIT para una arquitectura determinada.
También agregamos soporte para shims de instrumentación GUSTAVE para x86 y PowerPC en afl-gcc, en caso de que no quieras proceder con la instrumentación binaria TCG.
Proporcionamos desarrollos específicos para el microkernel POK:
Necesitarás:
Lee el manual para el objetivo POK.
El material de diferentes charlas sobre GUSTAVE se puede encontrar en https://airbus-seclab.github.io/.