Proj THUDBFuzz Paper Reading: Angora: Efficient Fuzzing by Principled Search

Angora

Abstract

背景: 符号执行能够产生效果不错的测试样例,但是速度太慢了
工具: Angora
特点: 不用符号执行就解决路径约束
目的:增加branch coverage
技术:

  1. 规模化byte层级的污点分析
  2. 上下文敏感的分支计数
  3. 基于梯度下降的搜索
  4. 探索输入长度
    实验:
    A: LAVA-M数据集:
  5. 找到了几乎所有注入的bugs
  6. 比其他竞品软件找到的bugs数目都多
  7. 找到了103个之前没能激发的bug
    B: 八个成熟的开源项目
  8. 在file, jhead, nm, objdump和size中分别找6,52,29,40,48个bugs

1. Intro

P1: 叙述背景:符号执行过重,简单变异大多执行无效
Angora对策:避免符号执行,不用重量级的程序分析,coverage-guided
P2: 介绍AFL

  1. Context-sensitive branch coverage: 效果-能够更快地探索更多种程序状态
  2. Scalable byte-level taint tracking: 方式-只mutate和某个分支相关的byte
  3. Search based on gradient descent: 效果-更快的找到满足某个path constaint的结果
  4. Type and shape inference: 方式-多个被视作同个变量值的bytes将会被视作一个group并且推测类型
  5. Input length exploration: 背景-符号执行和梯度下降做不到增长input length; 方式-检测后增加input length
    P3: 实验

2. Background

P1: 介绍AFL: 轻量级插桩,遗传算法,coverage-guided

2.1 Branch Coverage

P1: path trace table: 编译时插桩,该表对每个run记录一次,具体来说对每个branch计算h(lprev, lcur),然后在对应的hashtable中记录hitcnt
P2: global branch coverage table: 该表对全部run都记录,这里将hitcnt用8-bit vector表示,分别对应hitcnt是否出现在某个区间内: [1], [2], [3], [4,7], [8,15], [16,31], [32, 127], [128, +无穷)
P3: AFL认为找到了程序的新状态:

  1. 发现了新的branch
  2. 某个branch的hitcnt不同于global branch coverage table中记录的

2.2 Mutation Strategies

AFL变异策略

  1. bit or byte flips
  2. 设置interesing bytes
  3. 在bytes, words, dwords上加/减一个小值
  4. 为单个byte放入随机数
  5. 删/重复/置零一块block
  6. 将两个种子随机组合

3. Design

3.1 Overview

P1: 背景: AFL没有考虑call context->无法充分探索程序状态:本文context-sensitive branch coverage
P2: Angora's fuzzing loop介绍

关键技术:

  1. Section 3.3: 只变异某个条件分支对应的关键bytes
  2. Section 3.4: 确定关键bytes之后,用梯度下降来快速找到满足条件的值
  3. Section 3.5: 推测哪些bytes是一组,然后推测这组bytes到底是什么类型
  4. Section 3.6: 大部分fuzzers使用ad hoc方法来改输入长度,但是Angora用插桩来直接检测何时input长度不足。

P3: 引入Fig1和Fig2,Fig1中有关键步骤,用Fig2中的程序作为关键步骤的示例。注意这里提到了为了计算偏导数必须要推测bytes的可能类型

3.2 Context-sensitive branch count

P1: 介绍AFL的global branch coverage table的好处:节约空间,此外不同区间也进行了行为细分
P2: 用例子介绍该方法的限制-没法区分calling context
P3: Angora考虑了calling context,通过将h(lprev, lcur)拓展为h(lprev, lcur, stack),这里stack是调用栈,比如[f19,f21],代表第21个call site调用了第19个call site进而到达目前所在的branch。考虑到深度回调法神的时候,stack会很深,这里计算stack的hash方式是异或以此控制hash值总数目。table7显示在LAVA-M上只增长了7倍branch数目。

3.3 Byte-level taint tracking

P1: 为了探索unexplored branches,angora需要实现byte-level taint tracking。本文认为,并不需要在全部runs上面都做taint analysis,为此,Angora只对种子(不是变异后的测试样例)上面跑一次taint analysis,以此来节约时间
P2: Angora taint label的数据结构是经过特殊设计的;简单的想法可能是将taint label设计为bit vector,每个bit代表输入中的一个位置,但是这样实现是无法支持很大的test case的。
P3: Angora将taint label信息存在一个table中,这个table要能支持INSERT(b), FIND(t)和UNION(tx, ty)操作,


posted @ 2021-04-08 16:17  雪溯  阅读(197)  评论(0编辑  收藏  举报