
Фаззер с направленным покрытием для переменных UEFI NVRAM, использующий эмуляцию Qiling и AFL++ для обнаружения уязвимостей в прошивке с помощью автоматической мутации входных данных и обнаружения сбоев.
Простой, управляемый покрытием фаззер для переменных UEFI NVRAM.
Основан на Qiling и AFL++.
Написан Итаем Либой (@liba2k) и Ассафом Карлсбадом (@assaf_carlsbad).
Сборка образа:
docker build -t efi_fuzz .
Тестирование среды:
docker run -v $PWD:/efi_fuzz -it efi_fuzz sh -c "cd efi_fuzz/tests/ && pytest -s -v -W ignore::DeprecationWarning"
Использование среды:
docker run -v $PWD:/efi_fuzz -it efi_fuzz sh -c "cd /efi_fuzz ; bash"
Подготовка эмулированной среды NVRAM (Вам потребуется предоставить образ rom):
python3 scripts/prepare_nvram.py rom.bin nvram.pickle
Подготовка начального корпуса для переменных NVRAM:
python3 scripts/prepare_afl_corpus.py rom.bin afl_inputs
Выполнение пробного запуска фаззера:
python3 efi_fuzz.py <target> <nvram> <varname> <seed>
В случае успеха переходите к полноценному фаззингу:
afl-fuzz -i afl_inputs/<varname> -o afl_outputs/ -U -- python3 efi_fuzz.py <target> <nvram> <varname> @@
Если вы работаете в Windows, установите WSL. Мы рекомендуем WSL2, в отличие от исходной WSL, которая иногда бывает медленной. Полные инструкции по установке для Windows 10 можно найти здесь: https://docs.microsoft.com/en-us/windows/wsl/install-win10
Внутри дистрибутива WSL установите необходимые пакеты, которые позволят скомпилировать исходный код на C:
sudo apt install build-essential automake
Установите AFL++ с поддержкой режима Unicorn.
3.1. Клонируйте репозиторий:
git clone https://github.com/AFLplusplus/AFLplusplus
3.2. Сборка основных бинарных файлов AFL++:
make
3.3. Сборка функции поддержки Unicorn:
cd unicorn_mode
./build_unicorn_support.sh
3.4. Установка всего:
make install
Получите и распакуйте прошивку UEFI, которую вы хотите фаззить. Полные технические подробности о том, как это делается на практике, см. здесь или здесь.
Клонируйте фаззер и установите необходимые зависимости:
git clone https://github.com/Sentinel-One/efi_fuzz
Triton необходим для распространения меток (taint propagation).
Инструкции по установке Triton можно найти здесь:
https://triton.quarkslab.com/documentation/doxygen/#install_sec
Подготовка эмулированной среды NVRAM:
python scripts/prepare_nvram.py rom.bin nvram.pickle
Подготовка начального корпуса для переменных NVRAM:
python scripts/prepare_afl_corpus.py rom.bin afl_inputs
Выполнение пробного запуска фаззера:
python efi_fuzz.py <target> <nvram> <varname> <seed>
В случае успеха переходите к полноценному фаззингу:
afl-fuzz -i afl_inputs/<varname> -o afl_outputs/ -U -- python efi_fuzz.py <target> <nvram> <varname> @@
-e, --end: Укажите конечный адрес для эмуляции.-t, --timeout: Укажите новое значение таймаута для эмуляции, в мс.-o, --output: Укажите формат вывода для отладки. Допустимые значения: trace, disasm, debug и off (по умолчанию off).-n, --no-sanitize: Отключите санитайзер памяти (по умолчанию False).-u, --track-uninitialized: Отслеживает неинициализированную память с помощью Triton и распространения меток (taint propagation) (ЭКСПЕРИМЕНТАЛЬНО!).-x, --extra-modules: Список дополнительных модулей для загрузки, чтобы удовлетворить зависимости цели.Дополнительную информацию о прошивке UEFI в целом и об efi_fuzz в частности можно найти здесь:
pip install -r efi_fuzz/requirements.txt