HouseFuzz论文笔记
论文简介
论文题目:HouseFuzz: Service-Aware Grey-Box Fuzzing for Vulnerability Detection in Linux-Based Firmware
论文作者:Haoyu Xiao; Ziqi Wei; Jiarun Dai; Bowen Li; Yuan Zhang; Min 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 都实现了对所有守护进程的识别
多进程模糊测试框架实验
消融实验