fuzzbuild
概述
- 本篇论文主要介绍了如何从单元测试自动化构建fuzz。要点在于对单元测试的llvm中间表示进行插桩,通过FuzzAPI中的函数手册,将单元测试的输入修改为fuzz 传入的参数,包括data和size。在此之前通过在lib中插入相关的指令,收集单元测试使用的seed,这样就获得了fuzz和seed.
- 本篇论文主要利用了单元测测试已经搭建好的环境,修改了两个变量的地址给fuzz
前提条件
- 一个单元测试的LLVM IR表示
- Fuzzable API(lib、fun、pars)(接受输入的参数的位置 & 长度)
- find test function & skip others function
- 每个测试以函数形式实现
- 每个测试都是独立的
实现方案
- 预处理
- 从LLVM bitcode文件中提取entry函数和test函数,entry函数即main函数
- 插入接口
- 插入两个全局变量,分别用于保存value & size
- 插入一系列的指令完成以下功能
- 为value分配足够的内存空间
- 将input拷贝到value
- 设置size的值
- 从fuzzer获取value的值
- 判断是否必要
- 该测试没有调用FA中的函数
- 该测试是否包括skiped function
- 满足以上两点的任一点,就执行remove-test
- 插入操作数
- 改变test中存在的FA中的参数为前面设置的全局变量
- 删除不需要的test
- 提高fuzz的速度
- 且已经假定test之间不相互依赖
- 优化
- seeds获取
- 通过在lib函数中插入FA相关的参数获取的指令,
- 将其于unite test 链接,形成的可执行文件可用于收集seeds
实验评价
- 从产生的种子的代码覆盖率、自动生成的fuzz的FA回调函数以及发现漏洞的实际效果看,效果都不错
- 覆盖率怎么实现的,llvm中间表示之前,还是之后
- 相对于fuzzgen,他的优缺点,在于不用静态分析,直接有完整环境
问题
- 看一下代码(llvm ir -> exec)
- fuzzgen 的可行性、成功率
deepstate
|