• 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)操作,


  • 相关阅读:
    Linux下文件的三种时间标记:访问时间、修改时间、状态改动时间 (转载)
    linux下创建文件的文件权限问题
    linux下文件特殊权限设置位S和沾附位T(转载)
    c 不同类型的指针
    linux exit 和 _exit的区别
    (转)linux下错误的捕获:errno和strerror的使用,以及perror和strerror的区别
    (总结)Linux下su与su -命令的本质(转)
    linux切换shell
    mysql安装两个版本
    远程连接数据库 出现 Client does not support authentication protocol requested by server的解决方法
  • 原文地址:https://www.cnblogs.com/xuesu/p/14632909.html
Copyright © 2020-2023  润新知