Abstract
工具: Zest
目的:自动引导像QuickCheck这类的随机输入生成器更好地通过语义分析
步骤:
- 将random-input generators转化为确定性的参数生成器
- 借助code coverage和input validity来做feedback-directed parameter serach
前提: mutations in the untyped parameter domain map to structural mutations in the input domain.(在没有标出类型的参数域上的变异往往与输入域中的结构化变异相关联无类型参数域中的突变映射到输入域中的结构突变。)
实验:
竞品: AFL, QuickCheck
对象: 5个java program-Maven; Ant; BCEL; Closure; Rhino
效果: - branch coverage 1.03x-2.81x
- 找到10 new bugs
- 平均需要10分钟找到每个bug
1. Intro
P1: 需要复杂输入的程序往往要把输入转化为某种数据结构;例子;check-and-run pattern
P2: 两阶段: a syntax parser和a semantic analyzer
P3: 挑战: 1. 需要满足结构上的复杂约束 2. 激活语义分析阶段的多条code paths
程序员可以写针对某种特定领域的generators,该策略主要发源于QuickCheck,在Java, PHP, Python, JS, Scala和Clojure等多种语言中均有对应的移植。
黑盒商业生成式模糊测试工具:Peach, beSTORM, Cyberflood, Codenomicon
以CSmith为例,需要开发者花费很大心力来实现语义有效。
P4: Zest: 自动引导QuickCheck类型的input generator来激活多条语义分析阶段的代码路径。Zest会使用测试程序的语义检查的检查结果和code coverage来指导新输入的生成。
P5: 介绍CGF工具,CFG工具大部分无法通过语法检查。
P6: Zest: 总览;基本步骤:1. 将Quick-check类型的generators改成确定性的generator,这样一串参数bits就能转化为一个语义有效的输入。 2. 对这个参数bits做CFG算法
P7: Zest已经集成入JQF框架;
实验1:
在5个java benchmarks上与AFL和QuickCheck进行对比
效果:更高的code coverage;找到了10个bugs;在每个benchmark上平均找到bug的时间在10min内;
2. Background
2.1 Generator-based testing
P1: 列出generation-based tools相关的一些工作;以junit-quickcheck中xml文件的生成为例讲了这些框架是随机采样的;
P2: 以testProgram函数为例说明语法和语义检查的特殊性
P3: P1中程序生成的例子可以语法有效,但是很难语义有效,造成浪费
P4: 直接使用Apache Maven model reader:语义有效性低;没有程序反馈
2.2 Coverage-Guided Fuzzing
P1-P4:用伪代码Algo1来具体展示CGF的具体流程;缺点是难以满足语义分析的要求;
3 Proposed Tech
Zest: coverage-guided fuzzing + generator-based testing
基本步骤
效果: 能够guide the search towards deeper code paths in the semantic analysis stage
3.1 Parametric Generators
以Figure2中的例子为例,将其转化为untyped bits的过程;定义parameters;定义parametric genearator;
两个key observations:
- 每个untyped parameter sequence会相当于一个语法有效的输入-假设generator只会产生语法有效的输入
- bit等级的变异就相当于在语法有效输入空间中做高级结构变异
P7: 解释两个observations为何合理
用例子来解释observation2
当变异使得子树规则无效时,没被用完的parameters会被简单地忽略掉,也即相当于是能够保存语法无效性质,还能够简单的快速的删除掉AST子树
3.2 Feedback-directed Parameter Search
4 Implementation
P1: 基于JQF平台(一个提供了选择feedback-directed fuzzing算法的java fuzzing test framework,允许动态插桩,允许接受code coverage events)
P2: JQF自带NoGuidance和AFLGuidance两种策略;AFLGuidance使用了proxy,进程间通信的时间基本可以忽略;NoGuidance相当于同junit-quickcheck中随机取值;本文实现了ZestGuidance
P3: 具体实现策略: 将java.util.Random.next(int bits)的返回值替换为准备好的parameter stream
P4: 变异算子:
- 选择随机数m作为要变异的数量
- 每一次都随机选择长度l,offset k,填入随机数
5 Evaluation
P1:
测试数据集: 5 benchmark programs
竞品: AFL(2.52b), junit-quickcheck
指标: 1. code coverage 2. effectiveness in triggering bugs
P2:
介绍5个数据集: Maven, Ant, Closure, Rhino, BCEL
P3: Experiment Setup
- duration
- repetition
- seeds and dicts
- generators
- 机器环境