论文简介

论文题目:HouseFuzz: Service-Aware Grey-Box Fuzzing for Vulnerability Detection in Linux-Based Firmware
论文作者:Haoyu XiaoZiqi WeiJiarun DaiBowen LiYuan ZhangMin Yang
机构/高校:Fudan University

该工作提出了一个针对 linux 固件的用户态模拟模糊测试方案

技术路线

分为三个部分:

  • 服务进程定位与模拟
  • 协议字段关键字提取与种子生成
  • 多进程模糊测试框架构建

服务进程定位与模拟

作者将服务进程分为了三个类型:网络进程,守护进程,工具进程。网络进程负责提供对外部的端口服务;守护进程开启本地的端口服务,负责给网络进程提供 IPC 通信;工具进程由网络进程 fork 用于单个请求的处理。

网络进程定位

首先其根据系统初始化脚本借用 GreenHouse 的 patch-run-loop 思路去运行系统初始化脚本 init,然后在此过程进行插桩检测启动的网络服务,例如 bind() 系统调用,然后再根据 execve() 系统调用提取出其模拟的参数。

守护进程识别

首先通过动态跟踪方法识别 IPC 的特征 key(例如文件路径)来确定是否存在 IPC 通道。然后确定网络服务的依赖 IPC 来确定守护进程(通过 recv, send 这些系统调用对应的 socket 来定位识别),然后就是提取其启动的命令了

进程模拟

基于 GreenHouse 工作来实现用户模拟。

多进程模糊测试框架

主要体现在两个方面:多进程的代码覆盖率统计;多进程的漏洞检测

多进程覆盖率

代码覆盖率统计分为三个步骤:记录测试用例在执行过程中的代码覆盖信息;检测测试用例的执行是否结束;基于收集的代码覆盖率信息判断测试用例是否是有价值的

覆盖率统计的执行过程范围

在多进程的情况下,判断测试用例的执行是否结束是需要考虑的,作者针对三个不同进程提出了不同的判断逻辑:

  • 工具进程:是否运行退出,与单进程模糊测试类似
  • 网络进程:是否释放了建立的 socket 连接,即 close();
  • 守护进程:在前两个进程结束后,检测守护进程是否在进行 I/O 监听
    与之对应的多进程服务执行状态图对应如下:
覆盖率记录

为每一个进程单独分配一个覆盖率 bitmap,到最后进行合并。
这里对于守护进程,其采取的策略是仅当守护进程调用 accept 系统调用时,才会去记录其覆盖率信息。

覆盖率反馈

当 bitmap 有新的覆盖,则视作好种子。
有一个问题是:运行启动的进程在测试过程中可能会发生变化(启动了不同的程序或者以不同的顺序启动)然后,该工作会将bitmap与每一个elf🔗起来。

多进程漏洞检测

检测内存型漏洞以及命令注入漏洞
命令注入漏洞似乎是在 execve 系统调用处作插桩,如果发生语法错误就令其 segment fault (由于命令注入以及 fuzz 的本身特性,所以这个是合理的)。

协议模糊测试方法

服务协议形式化

作者采用了 CFG (Context-Free Grammer) 以及 TDG (Token Dependent Graph) 策略来进行测试种子的生成。
TDG 的大致样式如下,大致就是给程序中的相关字符串打上 PATH, KEY, VALUE 的标签,然后还会做数据流和控制流依赖分析从而建立图结构:

后续根据 CFG 以及 TDG 生成测试用例,当然也会采取 Random 的变异策略

实验评估

该工作有两个数据集,一个是比较旧的,用于与其他工作的对比(60个固件)。另一个为20年后,用于测试漏洞挖掘能力(12个固件)
该工作实现上是基于 GreenHouse, QEMU, AFL++, Radare2, IDA PRO。

模糊测试性能对比

这里可以看到 HouseFuzz 的覆盖率是稍微高于 GreenHouse 的,然后其仅统计了网络进程;漏洞方面也是除去了命令注入漏洞。

服务识别对比

与 FirmAE, GreenHouse 进行对比:

守护进程识别对比

GreenHouse 和 HouseFuzz 都实现了对所有守护进程的识别

多进程模糊测试框架实验

消融实验
。。。(其余的先🕊了)

参考链接