
Fuzzer guidato dalla copertura per variabili UEFI NVRAM che utilizza l'emulazione Qiling e AFL++ per scoprire vulnerabilità del firmware attraverso mutazione automatica degli input e rilevamento dei crash.
Un semplice fuzzer guidato dalla copertura per variabili UEFI NVRAM.
Basato su Qiling e AFL++.
Scritto da Itai Liba (@liba2k) e Assaf Carlsbad (@assaf_carlsbad).
Costruisci l'immagine:
docker build -t efi_fuzz .
Testa l'ambiente:
docker run -v $PWD:/efi_fuzz -it efi_fuzz sh -c "cd efi_fuzz/tests/ && pytest -s -v -W ignore::DeprecationWarning"
Usa l'ambiente:
docker run -v $PWD:/efi_fuzz -it efi_fuzz sh -c "cd /efi_fuzz ; bash"
Prepara l'ambiente NVRAM emulato (dovrai fornire l'immagine rom):
python3 scripts/prepare_nvram.py rom.bin nvram.pickle
Prepara il corpus iniziale per le variabili NVRAM:
python3 scripts/prepare_afl_corpus.py rom.bin afl_inputs
Esegui un test a secco del fuzzer:
python3 efi_fuzz.py <target> <nvram> <varname> <seed>
In caso di successo, passa al fuzzing completo:
afl-fuzz -i afl_inputs/<varname> -o afl_outputs/ -U -- python3 efi_fuzz.py <target> <nvram> <varname> @@
Se sei su Windows, installa WSL. Consigliamo WSL2 invece del WSL originale, che a volte tende ad essere lento. Le istruzioni complete per l'installazione su Windows 10 sono disponibili qui: https://docs.microsoft.com/en-us/windows/wsl/install-win10
All'interno della distribuzione WSL, installa alcuni pacchetti necessari che ci permetteranno di compilare codice sorgente C:
sudo apt install build-essential automake
Installa AFL++ con il supporto della modalità Unicorn.
3.1. Clona il repository:
git clone https://github.com/AFLplusplus/AFLplusplus
3.2. Compila i binari principali di AFL++:
make
3.3. Compila la funzionalità di supporto Unicorn:
cd unicorn_mode
./build_unicorn_support.sh
3.4. Installa tutto:
make install
Ottieni e decomprimi il firmware UEFI che desideri sottoporre a fuzzing. Per tutti i dettagli tecnici su come si fa nella pratica, vedi qui o qui.
Clona il fuzzer e installa le dipendenze richieste:
git clone https://github.com/Sentinel-One/efi_fuzz
Triton è richiesto per la propagazione delle macchie (taint).
Le istruzioni per installare Triton sono disponibili qui:
https://triton.quarkslab.com/documentation/doxygen/#install_sec
Prepara l'ambiente NVRAM emulato:
python scripts/prepare_nvram.py rom.bin nvram.pickle
Prepara il corpus iniziale per le variabili NVRAM:
python scripts/prepare_afl_corpus.py rom.bin afl_inputs
Esegui un test a secco del fuzzer:
python efi_fuzz.py <target> <nvram> <varname> <seed>
In caso di successo, passa al fuzzing completo:
afl-fuzz -i afl_inputs/<varname> -o afl_outputs/ -U -- python efi_fuzz.py <target> <nvram> <varname> @@
-e, --end: Specifica un indirizzo finale per l'emulazione.-t, --timeout: Specifica un nuovo timeout per l'emulazione, in ms.-o, --output: Specifica il formato di output per scopi di debug. I valori validi sono: trace, disasm, debug e off (default: off).-n, --no-sanitize: Disabilita il memory sanitizer (default: False).-u, --track-uninitialized: Tiene traccia della memoria non inizializzata tramite Triton e propagazione delle macchie (SPERIMENTALE!).-x, --extra-modules: Un elenco di moduli extra da caricare per soddisfare le dipendenze del target.Ulteriori informazioni riguardanti il firmware UEFI in generale e efi_fuzz in particolare sono disponibili qui:
pip install -r efi_fuzz/requirements.txt