Proj THUDBFuzz Paper Reading: GRIMOIRE: Synthesizing Structure while fuzzing

Abstract

背景: Grammar Inference, 能够自动生成输入文法的技术。目前缺点: 一般是预先分析的,在fuzzing过程中的一些重要structures常常无法捕捉到
本文:
工具: GRIMOIRE
特点: 无需任何人工干预,无需预分析步骤,通过类似语法的组合和大量变异来生成高度结构化的测试用例
实验:

  1. GRIMOIRE比其他coverage-guided fuzzers更好
  2. 比现有的基于grammar-based的fuzzers更好
  3. 在实际程序上测出了19个memory corruption bugs, 11 CVEs

1. Intro

P1: AFL取得了成功;但是还是需要人工来设计某些cases;减少需要的领域知识有意义
P2: 语法语义有效性;
P3:

  1. 需要人工语法或者种子集的存在缺点:对没有文档的程序很难办;
  2. 有工作能通过静态分析推测语法,但是语法在运行中无法更正

本文工作:
P4:
前提:

  1. 可以用code coverage feedback来推测语法的结构属性
  2. 实践里并不需要准确正确的语法
  3. fuzzer的test case吞吐量很高,能够处理带一定噪声的语法
  4. 额外的噪音可测出程序的异常行为,反而会带来好处,比如能测错误处理不当
  5. 有时一些输入没在文档上及时标出来

P5:
本文与之前研究的区别:在fuzzing过程中合成语法
具体方法:

  1. 泛化方法:分析每个有新发现的输入,试着找到能够被替换或者重用的子序列
  2. 变异方法:从已有的输入中将这些fragments组合起来

P6: 工具GRIMOIRE
优点:

  1. 无需任何人工参与,也不需要种子集或者格式说明
  2. 不对程序或者程序环境做任何限定,因此也能用在闭源项目上(Q?)

P7:
实验A:
测试集:4个脚本语言解释器(mruby, PHP, lua, JavaScriptCore),编译器(TCC), 汇编器(NASM),数据库(SQLite),解析器(libxml),SMT solver(Boolector)
效果:1. outperforms all existing coverage-guided fuzzers

实验B:
效果 1. 证明GRIMOIRE可以和现有的grammar fuzzer联用来增加效果

实验C:
效果 1. 与其他自动推测语法的方法相比,outperform

最终:找到19个memory-corrupted bugs, 11 CVEs

Ch2 Challenges in fuzzing structured languages

Fuzzing特点:大规模执行;随机探索状态空间;监视执行runtime

2.1 Blind Fuzzing

例子: RADAMSA, PEACH, Sulley, ZZUF

2.2 Coverage-guided fuzzing

使用轻量级程序覆盖率测量方法。
例子: AFL, ANGORA, QSYM, T-FUZZ, REDQUEEN

2.3 Hybrid Fuzzing

例子: SAGE, DRILLER, QSYM
VUzzer和ANGORA仅仅使用了taint tracking来完成轻量级的符号执行
缺点:不擅长处理整体结构上的约束

2.4 Coverage-based Grammar Fuzzing

例子: NAUTILUS, AFLSMART

2.5 Grammar Inference

例子: GLADE
方法:

  1. 用户给定一种黑盒oracle让GLADE知道是否语法有效
  2. GLADE将有效的输入集合转为最能表达这些有效输入的正则表达式

缺点:

  1. 耗时
  2. 需要人工提供oracle
  3. 生成的语法并不适合fuzzing

例子2: AUTOGRAM
假设在解析中被调用的函数反映了语法的Non-terminal Symbols
方法:使用源程序和taint tracking来推测语法
缺点:不适合recursive descent parsers
优点:无需人工oracle

例子3: PYGMALION
假设在解析中被调用的函数反映了语法的Non-terminal Symbols,而函数调用栈则能够反应语法的递归
方法:简化版符号执行
优点:无需标准输入集合
缺点:在解析器是表格表示的自动机的情况下无法工作

2.6 Shortcomings of Existing Approaches

3 Design

GRIMOIRE被设计为coverage-guided fuzzer上层额外的一步。
泛化(generalization):

  1. strip:用方框符号代替替换后不会带来新coverage的部分
  2. 将输入归约为能引起新覆盖的fragments
  3. 维护gaps(或者称为candidate positions, 即用方框代替的部分)的信息

例2:
为了获取if(x>1)的基本语法,可以将if(x>1)then x = 2 end用方框遮挡为 if(x>1)框(这里的代表可以放若干个空格)then框end

原文地址:https://www.cnblogs.com/xuesu/p/14500539.html