INTRODUCTION
本文引入了定向模糊测试(DGF),专注于到达程序中给定的目标位置。在高层次上,本文将可达性视为算法中的优化问题,并采用特定的元启发式,以最大限度地缩短生成的种子和目标的距离。为了计算种子距离,本文首先计算并插桩每个基本块到目标的距离。虽然种子距离是程序间的,但本文的新措施只需要对调用图和每个程序内CFG进行一次分析。运行时,模糊器聚合每个运行到的基本块的距离值,计算种子距离作为平均值。DGF以模拟退火算法作为最小化种子距离的元启发式,并且以能量分配来实现。一个种子的能量指定模糊器花费在这个种子上的时间。
DGF将目标位置的可达性当成优化问题,而现有的定向模糊测试方法(白盒)将其作为迭次约束满意度问题。
DGF在有效性和效率上都优于定向符号执行,然而,这两种技术的集成比每种技术都表现更好。
TECHNOLOGY
种子输入和多个目标之间的距离测量
为了计算各函数之间的距离,本文在函数级别的调用图和基本块级别的程序内控制流图中为每个节点分配一个值。
函数级目标距离决定了从函数到调用图中任意目标函数的距离,函数距离则决定了调用图中任意两个函数的距离。本文将函数距离定义为调用图中两个函数n、n'之间最短路径上的边缘数,将函数n和目标函数之间的函数级目标距离定义为函数n和任意可达到的目标函数之间的函数距离的谐波平均值。
基本块级目标距离决定了基本块到调用函数的所有其他基本块的距离,以及函数级目标距离的倍数。本文将基本块的目标距离定义为调用链中到达目标位置的其他基本块的平均距离。BB距离为控制流图中两个基本块的距离。BB距离为控制流图中两个基本块之间最短路径上的边缘数。N(m)为基本块m调用的一些函数。最后本文定义基本块级的目标距离:
最后,本文定义了归一化的种子距离,种子到目标位置结合的距离。本文首先定义种子距离:
模糊器将持续保持一个种子集S进行模糊测试。本文定义归一化的种子距离:
种子距离的计算时的重度程序分析可以放到插桩时计算,以保证运行时性能开销最小。只有归一化的种子距离需要在运行时通过收集预先计算的距离值进行计算。
基于模拟退火(SA)算法的能量分配
模拟退火算法的特征是:在随机运行的过程中,它总是接受更好的解决方案,但有时候也可能接受更差的解决方案。温度是SA的参数,它调节对更差方案的接受程度,并且按照冷却计划持续下降。在开始时,T=T0=1,SA算法接受更差方案的概率很高,当T趋近于0时,它退化为经典的梯度下降算法,并且只接受更好的解决方案。
冷却计划:
其中α是一个常数,通常为0.8~0.99.
基于模拟退火的能量分配
在自动化漏洞挖掘中,我们通常只有有限的时间。因此,本文指定一个时间tx,表示退火过程在经历了足够的探索时间后,进入开发阶段。在tx之后,模拟退火过程就可以和经典的梯度下降算法类似。本文让温度Tk<0.05时进入开发阶段。
接下来,本文使用质数冷却计划定义基于模拟退火的能量分配(APS)。给予种子s和目标位置Tb,能量为:
集成
将AFL的能量分配和本文的能量分配策略集成到一起。其中pafl(s)为AFL给种子s分配的能量。目标基本块Tb,种子s的能量为:
功率因子,即13式的后半段,控制能量的增加或减少,在两种极端情况下的功率因子的行为如下图所示:
第一种情况为种子距离最大的情况,仅仅过了15分钟之后,能量就降为原来的15%。当种子离目标很远时,分配的能量会越来越少。通过(12)和(13)可知:
第二种情况为归一化的种子距离最小的情况,同样可以得出结论: