V-Fuzz: Vulnerability-Oriented Evolutionary Fuzzing论文分析
- 针对二进制程序,也可以用于开源软件(需要将其编译成二进制程序)
- 类似于定向fuzz–不是定向fuzz,而是找到目标辅助种子选择
- V-Fuzz结合了漏洞预测和进化fuzz的优势,同时减小了劣势(由于漏洞预测模型不是精确的,所以对脆弱代码使用大权重,对其他代码使用较小的权重,以防止模型出现错误预测时导致误报)
- 实质上使用漏洞预测模型的结果来优化seed file的选择
2、背景
2.2二进制程序漏洞预测
使用深度学习模型:
- 因为使用静态分析工具的话,(1)只能针对开源软件,(2)会有较高的误报率和漏报率。
如何表示binary
- 表示binary program–使用汇编语言,分析程序的CFG(控制流图,包含丰富的语义和结构信息);
- 为了便于训练,需要表示成向量–使用Attributed Control Flow Graph (ACFG) [Scalable graph-based bug search for firmware images];
合适的分析粒度
- 不能太粗(不够准确)也不能太细(很难提取),最终选择函数粒度进行分析;
合适的神经网络模型
- graph embedding network图嵌入网络
- 已经有paper将该网络应用于提取结构化数据的有效特征和检测binary代码相似性,因此选择该种网络模型,并进行适当修改,以适应本文的工作目标。
discovre: Efficient cross-architecture identification of bugs in binary code(2016NDSS)
3、V-FUZZ: SYSTEM OVERVIEW
V-Fuzz整体框架
漏洞预测模型
- 输出一个binary中可能存在漏洞的函数,并给出这个函数存在漏洞的概率。
训练数据:
- 标签分别设置为secure和vulnerable;
- 可以将标签设置更加细致,以识别不同类型的漏洞。-----可以改进的地方
漏洞导向的进化fuzzer
- 使用vulnerable概率表示有漏洞的概率。
- 对于每个有vulnerable 概率的函数,V-Fuzz将会给函数中的每个基本块设置一个**SVS(Static Vulnerable Score)**来表示基本块的重要性。
- V-Fuzz利用进化算法生成正确的测试用例。对每个执行的输入,给定一个fitness score,即执行路径上所有基本块的SVS之和。
- 然后选取具有较高的fitness score或产生crash的输入作为新的种子输入。
目前分析–问题
- 相当于对binary程序分析一次,得到可能存在漏洞的函数,并为其中的基本块标注SVS;
- 然后使用基本块的SVS和crash作为选取新种子的标准;
- 变异策略?? – 类似AFL
4、漏洞预测
4.1问题定义
- 预测模型为M
- 程序中的函数集合为F = {f1,f2, …, fτ}
- 函数集合F中的每个函数 fi 作为M的输入,对应的输出为 fi 的vulnerable probability – PVfi
P V f i = M ( f i ) PVfi = M(fi) PVfi=M(f