Skip to content

Fuzz Testing

Introduction

Fuzz的目的是驱动系统执行进入期望的状态。

Evolution

基因算法

基因算法是一种模拟自然选择的算法。将初始随机种子输入到种子池,通过选择和变异得到种子,以这个种子作为测试用例,执行程序,得到结果,根据结果判断是否是好的种子,如果是,加入到种子池,否则丢弃。

Coverage

如果fuzzer生成了一个能够扩大代码覆盖率的测试用例,那么这个测试用例就是好的种子。

覆盖分为Block Coverage(基本块覆盖)、Branch Coverage(分支覆盖)、Return Coverage(返回覆盖)、Path Coverage(路径覆盖)等。

如果我们可以获得一组覆盖程序控制流图(CFG)中每条可行路径的输入集,那么这个程序就被认为是饱和测试的。

路径覆盖是最全面的覆盖,但在实际中很难实现。在实践中,我们更多是采取分支覆盖,因为它在有效性和可行性之间取得了良好的平衡。

Loops: Trouble Maker for Branch Coverage

循环会影响分支覆盖的测试,应当使用Bounded Loop Unrolling技术。把循环变成一个一定次数的顺序执行的代码块。

Concolic execution: forced path exploration

Narrow-range constraints

对于一些约束很窄的情况,使用随机的输入很难找到满足约束的输入。但从另一方面,如果我们知道约束的范围,我们可以使用符号执行来找到满足约束的输入。

让fuzz完成大部分的状态空间探索,然后使用符号推理引擎来解决剩下的约束。