一个简单的、基于覆盖引导的用于 UEFI NVRAM 变量的模糊测试工具。
基于 Qiling 和 AFL++。
由 Itai Liba (@liba2k) 和 Assaf Carlsbad (@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
安装支持 Unicorn 模式的 AFL++。
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
克隆模糊测试工具并安装所需依赖:
git clone https://github.com/Sentinel-One/efi_fuzz
pip install -r efi_fuzz/requirements.txt
Triton 是进行污点传播所必需的。
安装 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 和污点传播跟踪未初始化的内存(实验性功能!)。-x, --extra-modules:用于满足目标依赖关系而加载的额外模块列表。关于 UEFI 固件的一般信息以及 efi_fuzz 的更多详细信息,请参见: