题目:VUzzer: Application-aware Evolutionary Fuzzing
作者:Sanjay Rawat, Vivek Jain, Ashish Kumar, Lucian Cojocar, Cristiano Giuffrida, Herbert Bos
出版:NDSS 2017
背景
模糊测试随机变异,不了解被测程序,进行盲目的变异。生成的输入往往在不符合程序输入的规则,导致陷在程序的浅层位置。而根据基于覆盖的fuzzing策略,触发浅层err handler代码也触发了新的覆盖,导致大量资源浪费在格式无效种子的变异上,给有效种子和执行深层代码种子的时间就少了。
白盒测试,比如符号执行,通过约束求解生成覆盖程序中路径的测试用例。白盒技术的加入,使得fuzzer更加有效。比如driller,在fuzzing遇到瓶颈的时候,会进行符号执行,交替两种技术。
但是fuzzer,比如afl,是可以分析大规模程序的。但是符号执行技术因为路径爆炸和约束求解问题,难以扩展到大规模程序。所以符号执行的加入破坏了fuzzer的scalable属性。
问题
在不使用符号执行的情况下,设计更加有效的fuzzer:在更少的种子生成情况下,有效发现crash。
方案
通过污点分析识别err handler code的方式,减少对格式无效种子的变异。在更少变异的前提下,发现更深层次的crash。
设计
静态分析:
使用IDA反编译被测二进制程序,
1-得到程序的函数的控制流图,通过基于马尔科夫模型的基本块权重计算方法,计算得到基本块权重文件。
2-得到程序中的函数名文件。
动态分析:
动态二进制插桩,使用pin工具。对程序输入种子的每个字节进行污点追踪。
1- 插桩程序中的cmp和lea指令。
cmp指令经常作为程序路径的分支条件,代表了程序中可能存在的magic byte,这是随机变异的fuzzer的一个挑战。
lea指令的操作数是int类型,lea的操作数对应的种子偏移位置的字节就可以在int范围内进行变异,降低变异的随机性。
2-确定error handler代码
首先,使用有效测试用例集合(test suit)喂给插桩后的被测程序,这些测试用例所执行的基本块我们叫做valid BB set.
然后,使用随机生成的种子集合,喂给插装后的被测程序,这些执行路径中的公共基本块BB,且如果BB不在valid BB set中,那么我们将这些BB 放在invalid BB set中。(依据:随机生成的种子很可能是无效的,会被err handler代码处理)
3-能量调度:
通过计算种子能量,给种子赋予不同的变异机会。
计算:对于一个种子的执行路径P,路径中每个基本块的权重在静态分析阶段已经给出。如果基本块是valid BB set中的,那么我们说该基本块权重为正,否则权重为负。这样,对所有基本块权重进行相加,得到该种子的能量。
对于种子能量高的种子,它应该是符合程序输入格式的,并且更有可能到达程序深层位置。所以给这些种子更多的变异机会。