
Fuzzer guiado por cobertura para variables UEFI NVRAM que utiliza emulación Qiling y AFL++ para descubrir vulnerabilidades de firmware mediante mutación automatizada de entradas y detección de fallos.
Un fuzzer simple, guiado por cobertura para variables NVRAM de UEFI.
Basado en Qiling y AFL++.
Escrito por Itai Liba (@liba2k) y Assaf Carlsbad (@assaf_carlsbad).
Construir la imagen:
docker build -t efi_fuzz .
Probar el entorno:
docker run -v $PWD:/efi_fuzz -it efi_fuzz sh -c "cd efi_fuzz/tests/ && pytest -s -v -W ignore::DeprecationWarning"
Usar el entorno:
docker run -v $PWD:/efi_fuzz -it efi_fuzz sh -c "cd /efi_fuzz ; bash"
Preparar el entorno NVRAM emulado (Deberá proporcionar la imagen de la ROM):
python3 scripts/prepare_nvram.py rom.bin nvram.pickle
Preparar el corpus inicial para las variables NVRAM:
python3 scripts/prepare_afl_corpus.py rom.bin afl_inputs
Realizar una ejecución de prueba del fuzzer:
python3 efi_fuzz.py <target> <nvram> <varname> <seed>
Si tiene éxito, continúe con el fuzzing completo:
afl-fuzz -i afl_inputs/<varname> -o afl_outputs/ -U -- python3 efi_fuzz.py <target> <nvram> <varname> @@
Si está ejecutando en Windows, instale WSL. Recomendamos WSL2 en lugar del WSL original, que tiende a ser lento a veces. Las instrucciones completas de instalación para Windows 10 se pueden encontrar aquí: https://docs.microsoft.com/en-us/windows/wsl/install-win10
Dentro de la distribución WSL, instale algunos paquetes necesarios que nos permitirán compilar código fuente en C:
sudo apt install build-essential automake
Instalar AFL++ con soporte de modo Unicorn.
3.1. Clonar el repositorio:
git clone https://github.com/AFLplusplus/AFLplusplus
3.2. Compilar los binarios principales de AFL++:
make
3.3. Compilar la funcionalidad de soporte de Unicorn:
cd unicorn_mode
./build_unicorn_support.sh
3.4. Instalar todo:
make install
Adquiera y extraiga el firmware UEFI que desea fuzzear. Para los detalles técnicos completos sobre cómo se hace esto en la práctica, consulte aquí o aquí.
Clonar el fuzzer e instalar las dependencias requeridas:
git clone https://github.com/Sentinel-One/efi_fuzz
Triton es necesario para la propagación de manchas.
Las instrucciones para instalar Triton se pueden encontrar aquí:
https://triton.quarkslab.com/documentation/doxygen/#install_sec
Preparar el entorno NVRAM emulado:
python scripts/prepare_nvram.py rom.bin nvram.pickle
Preparar el corpus inicial para las variables NVRAM:
python scripts/prepare_afl_corpus.py rom.bin afl_inputs
Realizar una ejecución de prueba del fuzzer:
python efi_fuzz.py <target> <nvram> <varname> <seed>
Si tiene éxito, continúe con el fuzzing completo:
afl-fuzz -i afl_inputs/<varname> -o afl_outputs/ -U -- python efi_fuzz.py <target> <nvram> <varname> @@
-e, --end: Especificar una dirección final para la emulación.-t, --timeout: Especificar un nuevo valor de tiempo de espera para la emulación, en ms.-o, --output: Especificar el formato de salida para fines de depuración. Los valores válidos son: trace, disasm, debug y off (por defecto es off).-n, --no-sanitize: Deshabilitar el sanitizador de memoria (por defecto es False).-u, --track-uninitialized: Mantiene seguimiento de la memoria no inicializada mediante Triton y propagación de manchas (¡EXPERIMENTAL!).-x, --extra-modules: Una lista de módulos adicionales a cargar para satisfacer las dependencias del objetivo.Información adicional sobre el firmware UEFI en general y efi_fuzz en particular se puede encontrar aquí:
pip install -r efi_fuzz/requirements.txt