
Fuzzer guidé par couverture pour les variables NVRAM UEFI utilisant l'émulation Qiling et AFL++ pour découvrir des vulnérabilités du firmware via la mutation automatique des entrées et la détection de crashes.
Un fuzzer simple, guidé par la couverture de code pour les variables NVRAM UEFI.
Basé sur Qiling et AFL++.
Écrit par Itai Liba (@liba2k) et Assaf Carlsbad (@assaf_carlsbad).
Créer l'image :
docker build -t efi_fuzz .
Tester l'environnement :
docker run -v $PWD:/efi_fuzz -it efi_fuzz sh -c "cd efi_fuzz/tests/ && pytest -s -v -W ignore::DeprecationWarning"
Utiliser l'environnement :
docker run -v $PWD:/efi_fuzz -it efi_fuzz sh -c "cd /efi_fuzz ; bash"
Préparer l'environnement NVRAM émulé (vous devrez fournir l'image ROM) :
python3 scripts/prepare_nvram.py rom.bin nvram.pickle
Préparer le corpus initial pour les variables NVRAM :
python3 scripts/prepare_afl_corpus.py rom.bin afl_inputs
Effectuer un essai à blanc du fuzzer :
python3 efi_fuzz.py <target> <nvram> <varname> <seed>
Si réussi, passer au fuzzing complet :
afl-fuzz -i afl_inputs/<varname> -o afl_outputs/ -U -- python3 efi_fuzz.py <target> <nvram> <varname> @@
Sous Windows, installez WSL. Nous recommandons WSL2 plutôt que le WSL original, qui peut parfois être lent. Les instructions d'installation complètes pour Windows 10 se trouvent ici : https://docs.microsoft.com/en-us/windows/wsl/install-win10
Dans la distribution WSL, installez quelques paquets nécessaires pour compiler du code source C :
sudo apt install build-essential automake
Installer AFL++ avec le support du mode Unicorn.
3.1. Cloner le dépôt :
git clone https://github.com/AFLplusplus/AFLplusplus
3.2. Construire les binaires de base AFL++ :
make
3.3. Construire la fonctionnalité de support Unicorn :
cd unicorn_mode
./build_unicorn_support.sh
3.4. Tout installer :
make install
Acquérir et décompresser le firmware UEFI que vous souhaitez fuzzer. Pour les détails techniques complets sur la manière de procéder en pratique, voir ici ou ici.
Cloner le fuzzer et installer les dépendances requises :
git clone https://github.com/Sentinel-One/efi_fuzz
Triton est nécessaire pour la propagation de taints.
Les instructions pour installer Triton se trouvent ici :
https://triton.quarkslab.com/documentation/doxygen/#install_sec
Préparer l'environnement NVRAM émulé :
python scripts/prepare_nvram.py rom.bin nvram.pickle
Préparer le corpus initial pour les variables NVRAM :
python scripts/prepare_afl_corpus.py rom.bin afl_inputs
Effectuer un essai à blanc du fuzzer :
python efi_fuzz.py <target> <nvram> <varname> <seed>
Si réussi, passer au fuzzing complet :
afl-fuzz -i afl_inputs/<varname> -o afl_outputs/ -U -- python efi_fuzz.py <target> <nvram> <varname> @@
-e, --end : Spécifier une adresse de fin pour l'émulation.-t, --timeout : Spécifier un nouveau délai d'attente pour l'émulation, en ms.-o, --output : Spécifier le format de sortie à des fins de débogage. Les valeurs valides sont : trace, disasm, debug et off (par défaut off).-n, --no-sanitize : Désactiver le sanitizer mémoire (par défaut False).-u, --track-uninitialized : Suivre la mémoire non initialisée via Triton et la propagation de taints (EXPÉRIMENTAL !).-x, --extra-modules : Une liste de modules supplémentaires à charger pour satisfaire les dépendances de la cible.Des informations supplémentaires sur le firmware UEFI en général et sur efi_fuzz en particulier peuvent être trouvées ici :
pip install -r efi_fuzz/requirements.txt