DGF论文阅读笔记

要点

  • 应用:补丁测试、崩溃重现、静态分析、信息流检测

  • 种子能量:一个种子s产生的模糊数量也被称为s的能量。

  • 图:函数级的调用图(CG)和基本块级的程序内控制流图(CFG)

  • 目标函数Tf和目标基本块Tb

  • 函数距离df (n,n′)定义为调用图CG中函数n和n′之间最短路径上的边的数量。我们把函数n和目标函数Tf之间的函数级目标距离df (n,Tf )定义为n和任何可达目标函数(tf ∈ Tf )之间的函数距离的调和平均数在这里插入图片描述

  • R(n,Tf )是CG中从n可到达的所有目标函数的集合

  • BB距离db(m1,m2)定义为函数i的控制流图Gi中基本块m1和m2之间最短路径的边数。N(m)为基本块m调用的函数集合「对于N(m)中任意基本块n,都有可到达的目标函数」

  • T是Gi中基本块的集合「任意T中的基本块m,m调用的函数集合都不为空」

  • ξ(s)为种子s的执行轨迹、种子距离d(s,Tb)、归一化的种子距离˜d(s,Tb)

  • 基于退火的功率表(APS)

  • 图7:结构。在图形提取器从源代码中生成调用和控制流图形后,距离计算器为每个基本块计算出基本块级的目标距离,在入侵过程中被仪器化器使用。仪器化的二进制文件不仅通知模糊器关于覆盖率,而且还通知种子距离。在这里插入图片描述

0摘要

  • 现有的灰盒模糊器(GF)不能有效地验证补丁的有效性,检测关键的系统调用或危险位置,或重现报告漏洞的堆栈轨迹中的函数。
  • 在本文中,我们介绍了定向灰盒模糊法(DGF),它产生的输入的目标是有效地达到一组目标程序的位置。我们开发并评估了一个基于模拟退火法的功率计划,该计划逐渐为离目标位置较近的种子分配更多的能量,同时减少对较远的种子的能量。
  • 我们展示了DFG在补丁测试和崩溃重现方面的应用,并讨论了将AFLGo整合到谷歌的连续模糊测试平台OSS-Fuzz中。

1介绍

  • 新的输入是通过改变所提供的种子输入而产生的,如果它们行使了新的、有趣的路径,就会被添加到摸索器的队列中。
  • 定向模糊器将其大部分时间预算用于到达特定的目标位置,而不会浪费资源去强调不相关的程序组件。定向模糊器的典型应用可能包括:
  • 补丁测试。通过将改变的语句「补丁」设置为目标,进行补丁测试。当一个关键组件被改变时,我们想检查这个补丁是否引入了任何漏洞。「目标为补丁语句」
  • ?「目标不明确」崩溃重现。通过将堆栈跟踪中的方法调用设置为目标来重现崩溃。当现场崩溃被报告时,只有堆栈跟踪和一些环境参数被发送到内部开发团队。「目标为堆栈方法」
  • ?「目标不明确」静态分析。通过将语句设置为静态分析工具报告为潜在危险的目标,进行报告验证。定向模糊器可以生成测试输入,如果该漏洞实际存在的话,就会显示出该漏洞。
  • ?信息流检测。通过设置敏感源和汇为目标,进行信息流检测。

3技术

3.1灰盒模糊

  • 我们开发了定向灰盒模糊法(DGF),这是一种专注于达到用户定义的目标位置的漏洞检测技术。DGF保留了灰盒模糊法的效率,因为它在运行时不进行任何程序分析,因为所有程序分析都是在编译时进行的。DGF很容易并行化,这样就可以在需要时分配更多的计算能力。DGF允许指定多个目标位置。
  • 我们定义了一个程序间的距离度量(即种子到目标位置),「距离在编译期间全部建立,在运行期间进行计算」该度量在仪器化时间「instrumentation-time」完全建立,并可在运行时有效计算。虽然我们的措施是程序间的,但我们的程序分析实际上是基于调用图(CG)和程序内控制流图(CFG)的程序内的。我们展示了与程序间分析相比,这如何产生了四倍的节约。CG和CFG在LLVM编译器基础设施中是现成的。「CG、CFG由LLVM自动生成」
  • 基于覆盖率的灰盒模糊器(CGF),如AFL[43]和LibFuzzer[53]使用轻量级的仪器来获得覆盖率信息。例如,AFL的工具捕获了基本的块转换,以及粗略的分支命中率计数。CGF使用覆盖率信息来决定哪些生成的输入需要保留进行模糊处理,哪些输入需要进行模糊处理以及需要多长时间。我们对这一工具进行了扩展,也考虑了所选种子与给定目标位置的距离。距离计算需要在调用图和程序内控制流图中找到通往目标节点的最短路径,这在LLVM中是现成的。「最短路径-距离的计算由LLVM自动在CG、CFG中自动生成」
  • Böhme等人[6]表明,基于覆盖的灰盒模糊处理可以被建模为马尔可夫链。一个状态i是程序中的一个特定路径。从状态i到状态j的过渡概率pij由模糊处理行使路径i的种子产生行使路径j的种子的概率给出。静态分布的密度正式描述了某个路径在一定数量的迭代后被模糊器行使的可能性。Böhme等人开发了一种技术,通过调整从种子产生的模糊数量,使模糊器倾向于低频路径,这取决于AFLFast(AFL的一个分叉)的邻域密度7。一个种子s产生的模糊数量也被称为s的能量。一个种子s的能量由所谓的功率表控制。请注意,能量是马尔科夫链中一个状态的局部属性,与模拟退火中的温度不同,它是全局的。

3.2衡量一个种子输入和多个目标地点之间的距离

  • 为了计算函数间的距离,我们给函数级的调用图(CG)和基本块级的程序内控制流图(CFG)中的每个节点分配了一个值。目标函数Tf和目标基本块Tb可以从给定的源代码引用中迅速识别出来(例如,d1_both.c:1480)。

  • 函数级目标距离决定了一个函数到调用图中所有目标函数的距离,而函数距离决定了调用图中任何两个函数之间的距离。更正式地说,我们把函数距离df (n,n′)定义为调用图CG中函数n和n′之间最短路径上的边的数量。我们把函数n和目标函数Tf之间的函数级目标距离df (n,Tf )定义为n和任何可达目标函数(tf ∈ Tf )之间的函数距离的调和平均数

  • 「R(n,Tf )函数n可到达的所有目标函数的集合为空:则函数级目标距离df (n,Tf )为undefined」「当函数n有到达的所有目标函数时 df为:n函数对所有可达目标函数tf的调和平均数」在这里插入图片描述

  • 其中,R(n,Tf )是CG中从n可到达的所有目标函数的集合。调和平均数可以区分 离一个目标较近的节点和离另一个目标较远的节点,以及离两个目标都等距离的节点「区别这三个点」。相比之下,算术平均数会给两个节点分配相同的目标距离。图4提供了一个例子。

    • 两图的三个点「区别这三个点」分别与两个目标的距离不一样在这里插入图片描述
  • 基本块级的目标距离 决定了一个基本块到所有其他调用函数的基本块的距离,此外还有被调用函数的函数级目标距离的倍数。直观地说,我们根据一个基本块到调用链中任何其他调用函数的基本块的平均距离,为其分配目标距离,以达到目标位置。此外,如果该调用链较短,则分配的目标距离较小。BB距离决定了CFG中任何两个基本块之间的距离。更正式地说,我们把BB距离db(m1,m2)定义为函数i的控制流图Gi中基本块m1和m2之间最短路径的边数。让N(m)为基本块m调用的函数集合,使得∀n∈N(m).R(n,Tf ) =/ ∅「对于N(m)中任意基本块n,都有可到达的目标函数」。让T是Gi中基本块的集合,使得∀m∈T .N (m) =/ ∅「任意T中的基本块m,m调用的函数集合都不为空」.我们定义基本块m和目标基本块Tb之间的基本块级目标距离db (m,Tb)为

  • 「目标基本块 的db=0」「函数i的控制流图Gi中的有调用函数的基本块 的db为:常数c * 基本块调用的最小的函数n和目标函数Tf之间的函数级目标距离df (n,Tf )」「其他基本块 的db:(m基本块到Gi中有调用函数的基本块的边数 + 该有调用函数的基本块的db)的调和平均数」在这里插入图片描述

  • 其中c = 10是一个常数,放大了函数级的距离。请注意,db(m,Tb )是为所有m∈Gi定义的。

  • 最后,我们有了定义归一化种子距离的所有要素,即种子s到目标位置集合Tb的距离。让ξ(s)为种子s的执行轨迹,该轨迹包含行使的基本块。我们定义种子距离d(s,Tb)为

  • 「种子距离d(s,Tb): 种子s的执行轨迹ξ(s)中的所有基本块的db / 种子s的执行轨迹ξ(s)中基本块的数量」在这里插入图片描述

  • 模糊器不断地维护一个种子集S来进行模糊处理。我们将归一化的种子距离˜d(s,Tb)定义为s到Tb的种子距离和之前任何种子s′∈S到Tb的最小种子距离之差除以任何种子s′∈S到Tb的最大和最小种子距离之差。在这里插入图片描述

  • 注意,归一化的种子距离 ˜d ∈ [0, 1]。还要注意的是,距离计算的重量级程序分析可以移到仪器化时间,以保持运行时的性能开销最小。首先,调用图和程序内控制流图被提取出来。这可以通过编译器本身来实现,或者当只有二进制代码可用时,可以使用位码翻译(或提升)。只有归一化的种子距离是在运行时通过收集这些预先计算的距离值计算出来的。「编译的时候先算df (n,n′)、df (n,Tf )、db(m1,m2)、df (n,Tf )等,运行的时候计算具体的种子距离d(s,Tb) 和 归一化的种子距离˜d(s,Tb)」

3.3 基于退火的能量调度

  • 我们开发了一种新的基于退火的功率表(APS)。我们的基于退火的功率表为 "更接近 "目标的种子分配更多的能量,而不是为 "更远 "的种子分配更多的能量,这种能量差异随着温度的降低(即随着时间的推移)而增加。「种子能量:一个种子s产生的模糊数量也被称为s的能量。」

  • 温度是SA算法的一个参数,用于调节对较差解决方案的接受程度,并根据冷却时间表递减。在开始时,当T=T0=1时,SA算法可能以高概率接受较差的解决方案。到了最后,当T接近0时,它就会退化为经典的梯度下降算法,只接受更好的解决方案。

  • 冷却时间表控制着收敛的速度,是初始温度T0=1和温度周期k∈N的函数。注意,虽然能量是一个种子的局部,但温度是所有种子的整体。最流行的是指数式冷却时间表。「温度Tk/冷却时间表 会根据温度周期地增大而不断减小」在这里插入图片描述

  • 其中α<1是一个常数,通常是0.8 ≤ α ≤ 0.99。

  • 基于退火的权力安排。在自动漏洞检测中,我们通常只有有限的时间预算。因此,我们希望指定一个时间tx,在经过足够长的 "探索 "之后,退火过程应该进入 "开发 "阶段。直观地说,在时间tx「tx是时间、Tk是温度」,模拟退火过程相当于一个经典的梯度下降算法(又称贪婪搜索)。当Tk≤0.05时,我们让冷却计划进入开发。对于0.05以外的值和不同的冷却时间表的调整是很简单的。因此,我们在时间t计算温度Texp如下「Tk=0.05相当于一个温度阈值,求解(8)得到(9):kx,将(9)代入(7)得到(10),缩写得到(11)Texp」在这里插入图片描述

  • 在下文中,我们使用指数冷却时间表来定义我们的基于退火的电源时间表(APS)。鉴于种子s和目标位置Tb,APS分配能量p为「种子能量:一个种子s产生的模糊数量也被称为s的能量。」

  • 「(1 - 归一化种子距离) * (1 - 周期温度) + 0.5*周期温度」「距离越近,能量越高。Texp用来调整距离对分配能量的比重,温度较高时先不管距离,先注重扩张,随着周期不断进行,距离对于分配能量的占比不断提高」

  • 图5说明了APS的行为,分别为当前时间t和归一化种子距离d以及能量变化的三个值。注意,能量p∈[0,1]。此外,当开始搜索时(t=0),APS为高种子距离的种子和低种子距离的种子分配相同的能量。随着时间的推移,一个只行使目标的种子(即˜d=0)「这里˜d=0不代表距离为0,而是距离是所有bb中最小的,˜d=1代表距离是所有bb中最大的」会被分配越来越多的能量。

  • 图5:种子距离 ˜d(s,Tb )和当前时间对 种子s的能量p(s,Tb)的影响(对于tx=40分钟)。「体现了能量、距离、时间三者之间的变化」在这里插入图片描述

  • 实际的整合。现有的计划是根据执行时间tx和s的输入大小(sizeof)、s被发现的时间(ts)以及s有多少个祖先(|ξ(s)|)来分配能量的。我们希望将AFL原有的能量计划与我们的基于退火的能量计划进行整合,并定义最终的整合的基于退火的能量计划。假设pafl(s)是AFL通常分配给种子s的能量。给定基本块Tb作为目标,我们计算种子s的综合APS pˆ(s,Tb )为

  • 「能量分配的综合APS 由 原始AFL的APS 与 AFL-GO的APS 进行一个加权的能量分配」在这里插入图片描述

  • 基于退火的功率因子f = 2^[10(p(s,Tb ) 0.5)] 控制AFL的功率计划分配的能量的增加或减少。图6显示了基于退火的功率因子在归一化种子距离˜d(s,Tb)的两个极端情况下的行为。让我们考虑第一个极端情况,即归一化种子距离是最大的(即˜d(s,Tb )=1;图6.a)。在开始时(t = 0),功率因子f = 1,这样,种子被分配的能量与AFL分配的能量相同(pˆ(s,Tb ) = pafl)。然而,只过了十分钟(t = 10min),同一粒种子只被分配了大约15%的原始能量。事实上,从方程(12)和(13)我们可以看到在这里插入图片描述

  • 图6:基于退火法的功率因数,它控制着AFL功率表最初分配的能量,该能量最初是由AFL的功率计划分配的。(tx = 40), (a) 与所有目标有最大距离的种子 ( ˜d = 1) 和 (b) 与所有目标的距离最小的种子 ( ˜d = 0). 注意Y轴上的不同刻度。在这里插入图片描述

  • 换句话说,一个离目标位置 "非常远 "的种子s,被分配的能量越来越少,直到只分配了原始能量pafl的三十分之一左右。现在让我们考虑第二种极端情况,即归一化种子距离最小(即˜d(s,Tb ) = 1;图6.b)。在开始时(t = 0),功率因子f = 1,就像最大距离的种子一样。然而,从公式(12)和(13)中我们可以看到在这里插入图片描述

  • 换句话说,一个 "非常接近 "到达目标位置的种子 位置,被分配到越来越多的能量,直到大约30倍的 越来越多的能量被分配,直到大约是原来能量帕夫尔的30倍。「最后d最大的趋近pafl/32,d最小的趋近pafl*32」

3.4定向灰盒模糊的可扩展性

  • 灰盒模糊法的核心优势在于其没有任何程序分析而产生的效率;它在短时间内生成并执行大量的输入。现在,定向灰盒模糊法(DGF)似乎增加了一些程序分析,特别是控制流和调用图。那么,DGF的规模如何?
  • 虽然我们的距离测量是程序间的,但程序分析实际上是程序内的。与程序间分析相比,这提供了大量的节约。我们自己在程序间分析方面的经验如下。在一个非常早期的实例中,AFLGo将首先构建程序间控制流图(iCFG),将一个函数的所有调用点与被调用函数的第一个基本块相连。这将花费几个小时。一旦iCFG可用,它将为每个基本块计算iCFG中的目标距离,作为到任何目标的最短路径的平均长度。由于iCFG中的节点数量巨大,这也可能需要几个小时。今天,AFLGo完全跳过了iCFG的计算,在计算完调用图中的函数级目标距离后,只计算基本块级目标距离到同一程序内控制流图中的调用站点。在调用点中,函数级目标距离被用作通往目标的剩余路径的近似值。BB级目标距离的核心是依靠Djikstra的最短路径算法,其最坏情况下的复杂度为O(V 2),其中V为节点数。假设,有n个程序内CFG,平均有m个节点。iCFG中最短距离计算的复杂度是O(n2-m2)。相比之下,我们在调用图和所有程序内控制流图中的最短距离计算的复杂性是O(n2 + nm2)。这就产生了对函数数量n的二次节约。
  • 此外,我们对DGF的设计是,大部分重量级的分析可以转移到编译时(即仪器化时间)。因此,DGF在运行时保留了大部分的效率。
    • 在编译时,为每个函数中的每个基本块计算出基本块级的目标距离。经典AFL蹦床的简单扩展为程序中的每个基本块增加了基本块目标距离。蹦床是一组实现工具化的指令。仪器化框架,LLVM可以相当有效地处理大型程序的静态分析。
    • 在运行时,AFLGo和AFL一样具有可扩展性,AFL可以扩展到大型程序,如Firefox、PHP和Acrobat Reader。AFLGo蹦床只聚合了基本块级的目标距离值和已执行的基本块的数量,并且只比原始AFL蹦床多了几条指令。基于退火法的功率计划在模糊器本身中实现。没有理由说AFLGo不能像AFL一样扩展。
  • 总之,我们把大部分的程序分析转移到仪器化时间,以保持运行时的效率。在工具化时间,我们试图通过轻量级的程序内分析来计算程序间措施,从而保持程序分析的轻量级。根据我们的经验,这可以节省大量的时间,将仪器分析的时间从几个小时减少到几分钟。「复杂的程序分析——编译时,简单的程序分析——运行时」
  • 图7:结构。在图形提取器从源代码中生成调用和控制流图形后,距离计算器为每个基本块计算出基本块级的目标距离,在入侵过程中被仪器化器使用。仪器化的二进制文件不仅通知模糊器关于覆盖率,而且还通知种子距离。在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值