《Hawkeye: Towards a Desired Directed Grey-box Fuzzer》论文阅读

作者会议
Hongxu Chen 新加坡南洋理工大学CCS’18
ABSTRACT
  • 定向灰盒fuzzing
    • 背景:灰盒fuzzing测试 (在测试真实世界程序是有效的)
    • 转折:现有的灰盒fuzzing方法缺乏导向性
  • 本文工作
    • 提出了4个定向fuzzer的特性
    • 设计要点
      • 收集call graph, 函数还有基本块层次到目标的距离
      • 在fuzzing的时候,根据静态信息和执行追踪来评估种子,以生成动态度量,然后用于种子优先级,功率调度和自适应突变
    • 这些方法帮助Hawkeye实现更好的指导和到达目的站点
  • 实现评估
    • 实现:作为一个fuzzing的框架
    • 测试场景:多种真实世界程序,不同的场景
    • 实验结果:能到达目标站点,并且比AFL和AFLGo更快
      • 时间开销少:某些漏洞发现从3.5个小时缩短到0.5小时
      • 新crash: 发现了41个以前未知的crash
      • 新CVE:这些crash被确认,而其中的14个被分配了CVE
1 INTRODUCTION
  • 背景
    • fuzzing的基本原理
    • fuzzing分类:黑盒,白盒,灰盒
      • 灰盒广泛使用并被证明是有效的
    • 定向灰盒fuzzing的场景
      • 漏洞检测: 不同平台的漏洞检测
      • 补丁测试:检测补丁打的正不正确
  • 现有研究
    • AFLGo: 将靶位点可达性作为优化问题,使用元启发算法生成更短距离的种子
    • 距离计算:根据输入种子执行基本块的平均权重到目标基本块的平均权重计算距离
      • 权重来源:call graph(CG)和control flow graph(CFG)
    • 启发式算法模拟退火算法
    • 能量调度:基于本次种子应该生成多少输入
    • 总结:通过静态分析和动态分析,DGF实现了达到目标站点的目标
  • **问题与挑战(**理想定向fuzzer期望的属性)
    • P1鲁棒性很好的路径机制,引导fuzzer到达目标点的路径,而不是偏向于特定路径
      • 需要有效的测量距离而不影响某些所需特征
      • 特别的, 需要保持种子的多样性
      • 例子:AELGo倾向于到目标点的最短距离,这可以更容易变异以达到目标位置并引起crash
        • 问题:libFuzzer作者认为,可能无法暴露隐藏在较长路径中的错误
    • P2静态分析应该平衡开销与实用性
      • 原因:粗略的静态分析对动态分析没有好处,而重量级的静态分析会花费很长的时间
    • P3对种子进行优先排序和安排,以快速到达目标地点
      • 目的:为了尽快地到达目标地点
    • P4:采取适应性的变异策略
  • **解决方法(**设计)
    • 对于属性P1
      • 应用静态分析结果来增强相邻函数的距离
      • 函数级别和基本块级别的距离应该基于增强的函数距离来模拟函数之间的亲和力
      • 在模糊处理过程中,通过整合静态分析结果和执行时信息,计算基本块追踪距离和执行跟踪与目标函数的覆盖函数相似度
      • 总结:重新定义距离函数
    • 对于属性2
      • 应基于调用图(CG)和控制流(CFG)的函数级可达性分析,间接调用的指针点对点分析,基本块度量
      • 总结:考虑间接调用
    • 对于属性3
      • 结合基本块追踪距离和覆盖函数相似性,来解决能量调度和优先化问题
      • 总结:修改能量算法,距离导向种子排序
    • 对于属性4
      • 根据可达性分析与覆盖函数相似性使用自适应变异策略
  • 实现与评估
    • 实现:Hawkeye
    • 实验对象:真实世界程序
    • 实验效果:到达目标点的时间更短
      • 例子:一些漏洞点的暴露时间从3.5小时缩短到0.5小时
    • 实验效果:41个先前未发现的crash
    • 实验效果:15个CVE
  • 贡献
    • 分析定向灰盒fuzz的挑战,并提出提高DFG需要的四种特性
    • 提供了一种测量能量函数标准,可以引导fuzzer到目标点
    • 提出了一种提速的新颖方法,通过能量调度,自适应变异和种子优先排序
    • 实现效果,包括crash复现和目标站点覆盖
2 DESIRED PROPERTIES OF DGF
2.1 动机案例

  • 基本情况:CVE-2017-15939相关的两个执行路径,是由CVE-2017-15023中不完整修复引起的空指针解除引用错误

  • 现有的灰盒fuzzing很难发现

    • 例子:AFL在10种不同运行和24小时下检测到

  • 普通GF难点:目标函数T深深的隐藏在crashing trace中

    • 原因:GFs是覆盖率导向的,并不会花费精力在生成能到达T的种子
  • 现有DGF难点:可能会忽略所有的路径

    • 例子:即使有两条路径,AFLGo会只倾向于更短的路径
  • 现有DGF的挑战根植于

    • 目标函数出现在PUT中的几个位置,并有多条路径可以到达目标点
    • 需要精确构建Call Graph
      • 应该考虑间接调用
2.2 定向Fuzzing期望的属性
2.2.1 P1 鲁棒性路径机制
  • <a,e,T,Z> 和 <a,b,c,d,T,Z> 应该被平等对待,而<a,e,f,X>则应该被更少关注
2.2.2 静态分析实用性与负载的平衡
  • 1). 真实世界中C/C++有间接调用,这从源码或者二进制指令中很难分析出来
    • 例:如果a->T是一个间接调用,则需要被考虑
  • 2). 不是所有的关系都需要平等对待。(例如某些函数在运行时会被多次调用)
    • 如果被调用函数在调用函数中,多个分支中出现,应该给予更小的距离
2.2.3 种子应该根据可达性快速排序
  • 对于能量调度:距离越小的种子应该被分配更多的能量
    • 例子:<a,e,T,Z>和<a,b,c,d,T,Z>应该被分配同量的能量,而<a,e,f,Z>应该被分配更少能量
  • 对于种子优先级:距离更接近的应该放在前面
    • 例子:<a,e,T,Z>和<a,b,c,d,T,Z>应该在<a,e,f,Z>前
2.2.4 适应性的变异策略
  • 变异操作分类
    • 细粒度的突变:例如比特翻转
    • 粗粒度的突变:例如块替换
  • 当快靠近目标的时候,粗粒度的变异应该给予更小的能量
2.3 AFLGo的解决方案
  • 对于P1
    • ⟨a,e,T,Z⟩ > ⟨a,e, f ,Z⟩ > ⟨a,b,c,d,T,Z⟩
    • 选择了路径最短的,而没有触发crash
  • 对于P2
    • 只考虑了Call graph,而忽略了间接调用
    • callee 只在callers中统计了一次
  • 对于P3
    • 使用了模拟退火算法的能量调度,但是没有对新种子进行优先级排序
  • 对于P4
    • 变异来源于两个策略
      • havoc 纯粹是随机的,如比特翻转,块替换
      • splice 从两个现有种子中随机剪切部分种子
    • 但是没有进行适应性的选择匹配
改进建议
  • P1更准确定义距离
  • P2:考虑间接调用,考虑多条路径
  • P3:对能量调度进行调整,距离导向的种子优选策略
  • P4: 适应性的变异策略,适应性的选择粗粒度和细粒度的变异策略
3 APPROACH OVERVIEW

3.1 静态分析
  • 输入

    • 程序源码
    • 目标站点(例如代码的行数)
  • 输出

    • 带有基本块级距离信息的插桩二进制
  • 操作

    1. 首先构建包含指针分析的目标程序的call graph (CG) ;对于每个函数,构建控制流图**(CFG**)

    2. 基于CG和CFG计算几个效应

      1. 函数级别距离
      • 用于计算基本块距离
      • 在Loop时候计算覆盖函数相似度
      1. 基本块距离
        • 能够到达的基本块被静态插桩了距离
        • 在Fuzzing loop时候用于计算基本块追踪距离
      2. 目标函数追踪闭路
        • 用于在Fuzzing loop时候计算覆盖函数相似性
    3. 目标函数被插桩。以追踪边过渡,基本块距离和覆盖函数

3.2 Fuzzing循环
  • 输入
    • 插桩的二进制程序
    • 初始的测试种子
    • 目标站点及相关的函数级别距离与目标函数追踪闭合性
  • 输出
    • 造成非正常程序行为(crash或者timeout)的测试种子
  • 过程:
    • 种子选择:从优先队列中选择种子
    • 能量调度:给予更接近种子更多的能量
      • 详细来说,是根据一个结合了函数相似性和基本块追踪距离的能量函数
      • 对于一个新测试种子:在其运行追踪完之后,计算覆盖函数相似性和基本块追踪距离
        • 基本块追踪距离:对于每个输入执行,累计的基本块级距离除以执行的基本块的总数
        • 覆盖函数相似性:基于当前执行函数和目标函数跟踪闭合的重叠性,以及函数级别距离
    • 变异策略适应性变化:fuzzing自适应的在两种不同策略中分配突变预算
    • 种子评估:优先考虑那些具有更多能量或者已经到达目标地点的种子
4 METHODOLOGY
4.1 图构建
  • 先构建CG和CFG,之后结合起来构建最终的inter-procedural CFG
  • 识别间接调用
    • 基于包含的指针分析
    • 核心思想:
      • 将程序翻译为p:=q的表述
      • q的指向集合是p的一个子集
      • 指向集合四个规则
        • 地址
        • 复制
        • 分配
        • 取消引用
  • 基于LLVM’s IR
4.2 相邻函数距离增强

  • 基于CG实现了一个轻量级的静态分析,考虑了(立即)调用关系的模式
  • 例子:
    • 两个例子中,fa->fb的距离都应该小于fa->fc
    • 而(a)中的fa->fb应该小于(b)
  • 立即调用关系中测算距离的两个指标
    1. 某一被调用函数在给定调用者上出现的情况
      • 出现越多,距离越小
    2. 调用者中至少包含被调用者的一个调用点的基本块的数量
      • 分支中调用块越多,更多的执行情况将包含被调用者
  • 没有展示循环,但是幸运地是循环中的被调用点效果常常一样
  • 为了平衡效率,并没有考虑实时影响分支的参数情况
4.3 指向性效用计算
  • 函数级别距离
  • 基本块级别距离
  • 目标函数追踪闭合
4.4 能量调度
  • 基本块追踪距离
  • 覆盖函数相似性
  • 调度
4.5 适应性变异
4.6 种子优化
  • 三层队列,根据分数将新种子附加到不同的范围中
5 EVALUATION
  • 实现
    • 基于AFL的LLVM模式
    • SVF静态值流分析工具
    • Rust动态fuzzing模块
    • Fuzzing Orchestration Toolkit
5.1 评估准备

  • 测试数据集
    • (1) GNU Binutils
    • (2) MJS
    • (3) Oniguruma
    • (4) Fuzzer Test Suite
  • 评估工具
    • (1) AFL
    • (2) AFLGo
    • (3) HE-Go
5.2 静态分析统计
5.3 crash暴露能力

5.4 目标站点覆盖
5.5 回答研究问题
5.6 威胁性验证
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值