面向漏洞的进化Fuzzer
今天arxiv出现一篇论文,大概意思就是设计了一个新的Fuzzer,使用神经网络来快速预测哪部分代码容易被攻击,然后针对这容易攻击的部分,利用进化算法生成输入,进行模糊测试。效果是在一些较小的样本集上重现了7个CVE,新发现3个CVE。
论文链接: V-Fuzz: Vulnerability-Oriented Evolutionary Fuzzing (https://arxiv.org/pdf/1901.01142.pdf)
现在流行的fuzzer都是基于代码覆盖率的,包括AFL,libfuzzer,honggfuzz等,它们对所有的组件是公平的。而V-Fuzz以函数为粒度,人工标注函数并预测函数受攻击的概率。
V-Fuzz的架构如上,程序的预测输入是ACFG(Graph Embedding),这是一种将二进制程序函数转换为数值向量的的方法。
以前需要手工指定的二进制函数都通过图嵌入转换为了ACFG向量,提取到了有效的特征。在已经训练好的模型上做预测可以得到该函数脆弱的概率,然后该概率就是函数的权重。
可以看到预测模型的结构如上图,其实就是一个分类模型,然后输出是概率值。拿到了函数的概率值,我们进行Fuzzing Test。
上图可以看到,函数的预测值赋予每个基础的块权重(SVS),用来评估测试用例,这里权重影响的是Fuzzer生成的样本数量,进而影响覆盖率。通俗来说就是权重越高,越脆弱,覆盖率越高,越容易出漏洞。
上图为真实Linux程序上V-Fuzz的测试结果
关于代码覆盖率,V-Fuzz只是加快了Fuzzing的速度,并不是基于覆盖的Fuzzer。如果有充足的时间,那你可以平等对待所有的函数。V-Fuzz也不是定向的Fuzzer,因为它可以测试很多不同类型的漏洞。
论文不算突破性的进展,但是对于想使用机器学习的Fuzzer还是有一定的意义。最近几年,很多研究者都在尝试在挖掘漏洞领域使用上机器学习,在这个方向上期待更多的成果。