zoukankan      html  css  js  c++  java
  • 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)操作,


  • 相关阅读:
    python_16(bootstrap)
    python_15(jquery)
    python_14(js)
    .net 定义泛型方法解析XML数据赋值给相应对象
    SQL Server 数字字符串位数不够补0
    SQL Server 跨服务器查询
    JQ1.5 为动态追加的元素添加事件
    radio group 的change 事件
    记录兼职工作中遇到的问题-IIS 服务器站点无法启动
    记录第一份工作的最后一次需求-百分比环形进度条
  • 原文地址:https://www.cnblogs.com/xuesu/p/14632909.html
Copyright © 2011-2022 走看看