相同体系结构固件重新托管和模糊测试
作者:Sec-Labs | 发布时间:
项目地址
https://github.com/pr0me/SAFIREFUZZ
SAFIREFUZZ
相关技术点
- 高级仿真(HLE):一种仿真技术,通过在宿主机上直接运行目标二进制代码来实现对目标软件的仿真。
- 动态二进制重写:一种将二进制代码转换为另一种形式的技术,以便在其他环境中运行。
- LibAFL:一个基于AFL的全系统自动化Fuzzing框架。
项目用途
SAFIREFUZZ是一个用于ARM Cortex-M固件的高吞吐率仿真和Fuzzing框架,可在高性能系统上运行固件,以获得更好的性能。它使用高级仿真(HLE)和动态二进制重写来运行单片机固件,将其作为Linux用户空间进程运行,并通过LibAFL实现Fuzzing。在12个目标上的24小时运行中,该框架实现了比HALucinator更高的覆盖率和更快的执行速度,性能提升超过600倍。
SAFIREFUZZ
同构固件再托管和模糊测试
简介
我们提出了近乎本地的再托管:在共享指令集系列的高性能系统上运行嵌入式固件作为Linux用户空间进程,目标设备采用ARM Cortex-M架构。SAFIREFUZZ是一个针对ARM Cortex-M固件的吞吐量优化的再托管和模糊测试框架。它采用高级模拟(HLE)和动态二进制重写来运行单片机只有二进制的固件镜像,以低开销在更加强大的硬件上运行。 此存储库包含了USENIX 23的出版物“Forming Faster Firmware Fuzzers”的代码。
安装
-
安装
armv7-unknown-linux-gnueabihf的 cargo 交叉编译工具链,以及gcc-arm-unknown-linux-gnueabihf和g++-arm-unknown-linux-gnueabihf。
将以下内容添加到~/.cargo/config中的cargo配置中:[target.armv7-unknown-linux-gnueabihf] linker = "arm-linux-gnueabihf-gcc" -
检出正确提交的子模块:
git submodule update --init --recursive -
在
engine.rs顶部导入要执行的测试框架:use crate::harness::wycinwyc as harness;每当更改目标和/或测试框架时,都需要重新编译二进制文件。
-
使用以下命令进行构建:
cargo build --release --target armv7-unknown-linux-gnueabihfrust-toolchain文件会自动设置正确的编译器版本。 -
在第一次执行之前配置您的系统:
prepare_sys.sh脚本禁用ASLR并允许虚拟内存映射到地址0。
注意,需要支持ARMv7-M的CPU,例如,在Raspberry Pi 4中找到的Cortex-A72s。
使用方法
- 可以使用以下命令执行单个文件或目录中的所有文件N(例如1000)次:
./safirefuzz -b firmware/atmel_6lowpan_udp_rx.bin -i inputs/atmel_6lowpan_udp_rx/input/input1 -n 1000 - 要开始使用LibAFL对测试框架进行模糊测试,只需指定
-f:./safirefuzz -b firmware/wycinwyc.bin -i inputs/wycinwyc -f
在我们的评估中使用的固件二进制文件和模糊测试种子将在 https://github.com/pr0me/safirefuzz-experiments 上提供。
测试框架
在 src/harness/skeleton.rs 中提供了基本的测试框架模板。
引擎需要任何测试框架实现以下接口:
pub static mut EMU_SP: u32;
pub static mut ENTRY: u32;
pub fn set_hooks();
pub fn reset();
pub fn setup(code: &[u8], offset: u32) -> Result<(), String>;
我们为多个真实目标提供了示例测试框架。
性能
我们在24小时的活动中对12个目标进行模糊测试,与使用高级模拟和Unicorn的最新固件模糊测试方法HALucinator相比,平均吞吐量提高了超过600倍,覆盖率提高了30%。
该图显示了TCP Echo Client目标的中位数和95%置信区间,共进行了五次24小时的运行。覆盖范围以达到基本块的数量报告,并且时间采用对数刻度。在与HALucinator(橙色)、将后端替换为LibAFL的HALucinator(绿色)、FuzzWare(蓝色)和不计算硬件抽象层内的基本块的FuzzWare(紫色)进行比较时,SAFIREFUZZ(红色)在更短时间内实现了更好的覆盖范围。
在此目标上,我们每秒实现3400次执行,而HALucinator为4.8,FuzzWare为87.2。

我们的论文中提供了详细的性能评估。
实验数据将在 https://github.com/pr0me/safirefuzz-experiments 上提供。
引用
@inproceedings{seidel2023ffff,
title={构建更快的固件模糊测试器},
author={Seidel, Lukas and Maier, Dominik and Muench, Marius},
booktitle={USENIX 2023},
year={2023}
}
