相同体系结构固件重新托管和模糊测试

作者: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”的代码。

ad1a1b7183235134

 

 

安装

  1. 安装 armv7-unknown-linux-gnueabihf 的 cargo 交叉编译工具链,以及 gcc-arm-unknown-linux-gnueabihfg++-arm-unknown-linux-gnueabihf
    将以下内容添加到 ~/.cargo/config 中的cargo配置中:

    [target.armv7-unknown-linux-gnueabihf]
    linker = "arm-linux-gnueabihf-gcc"
    
  2. 检出正确提交的子模块:

    git submodule update --init --recursive
    
  3. engine.rs 顶部导入要执行的测试框架:

    use crate::harness::wycinwyc as harness;
    

    每当更改目标和/或测试框架时,都需要重新编译二进制文件。

  4. 使用以下命令进行构建:

    cargo build --release --target armv7-unknown-linux-gnueabihf
    

    rust-toolchain 文件会自动设置正确的编译器版本。

  5. 在第一次执行之前配置您的系统: 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。

ad1a1b7183235043

我们的论文中提供了详细的性能评估。
实验数据将在 https://github.com/pr0me/safirefuzz-experiments 上提供。

 

引用

@inproceedings{seidel2023ffff,
  title={构建更快的固件模糊测试器},
  author={Seidel, Lukas and Maier, Dominik and Muench, Marius},
  booktitle={USENIX 2023},
  year={2023}
}
标签:工具分享, 模糊测试