Advertisement

2021 SoK: The Progress, Challenges, and Perspectives of Directed Greybox Fuzzing

阅读量:

摘要

灰盒模糊已经成为最具可扩展性和实用性的软件测试方法。大多数灰盒模糊工具都是基于覆盖率的,因为代码覆盖率与bug覆盖率是紧密相关的。然而,由于大多数覆盖的代码可能不包含错误,盲目扩展代码覆盖的效率较低,特别是在角落的情况下。不像基于覆盖的fuzzer以一种无方向的方式扩展代码覆盖,有方向的fuzzer将大部分的时间预算花在到达特定的目标位置(例如,bug倾向区)而不会浪费资源去强调不相关的部分。因此,直接灰盒模糊特别适合于补丁测试、bug复制和特殊bug查找等场景。本文首次对定向灰盒模糊进行了深入的研究。我们调查了28个与DGF密切相关的最先进的fuzzer(82%是在2019年之后发布的),这些fuzzer有各种定向类型和优化技术。基于DGF的特征,我们提取了15个度量指标,对收集到的工具进行全面评估,并将该领域的知识系统化。最后,总结了该领域面临的挑战,并提出了该领域的展望,旨在促进和推动未来的研究。

介绍

我们调查了28个与DGF密切相关的最先进的fuzzer(82%是在2019年之后发布的),这些fuzzer有各种定向类型和优化技术。我们根据DGF的特征提取15个指标 ,对收集到的工具进行全面评估,并将该领域的知识系统化。-在评价已有研究成果的基础上,总结了DGF研究面临的六个挑战,包括二进制代码支持、目标自动识别、权重区分、全局最优偏差、缺少间接调用和勘探开发协调 。我们揭示了这些挑战背后的深层原因,并提出了可能的解决方案。-我们对未来的发展方向进行展望,旨在促进和推动该领域的研究。

内容

CGF与DGF的区别 :种子优先级,目标的参与,勘探-开发。

DGF的应用

  • 补丁测试,
  • bug复现,
  • 知识提升。DGF可以通过集成人类分析师的知识或辅助技术来促进程序测试。人在回路通常用于软件测试,这有助于根据以前的经验识别关键系统调用或安全敏感程序站点(例如,内存分配函数malloc()、字符串操作函数strcpy()),从而将模糊化引导到容易出错的部分[35]。辅助技术,如符号执行[44]和tait分析[46]可以用来克服测试中的障碍。静态分析[12]和基于机器学习的检测方法[32]的初步结果可作为DGF的潜在易受攻击目标。
  • 节能。
  • 特殊的bug查找。最后,DGF可以用于根据定制的指标寻找特殊的bug。例如,在内存使用[31]的指导下找到不受控制的内存消耗错误,在类型状态违背[28]的指导下找到useafter-free错误。使用DGF可以大大提高发现行为复杂bug的效率。

为了进行全面的评估,我们根据DGF的特征提取了15个指标。我们进一步将指标分为三类,包括基本信息、实现细节和优化方法。接下来,我们将集中讨论与DGF关键技术相关的特性,包括定向类型、输入优化、种子优先级排序、功率分配、变异调度和数据流分析。详细评估见表一。
在这里插入图片描述
定向类型
G定向灰盒模糊,H定向混合模糊
对于定向型DGF, DGF最初是由PUT中手动标记的目标位点引导的,如AFLGo[21]和Hawkeye[42]。然后,研究人员注意到目标之间的关系也有帮助。例如,为了触发释放后再使用的漏洞,必须按照特定的顺序执行一系列操作(例如分配内存、使用内存和释放内存)。UAFuzz[22]和UAFL[28]利用目标序列而不是目标站点来寻找免费后使用的漏洞。LOLLY[23]还使用目标语句序列来指导greybox模糊处理,以触发由多个语句的连续执行导致的错误。Berry[24]使用符号执行来增强LOLLY沿着复杂路径到达深层目标时的方向性。除了目标序列,研究人员还提出了多种机制来指导模糊过程。Memlock[31]由内存使用情况指导,以发现不受控制的内存消耗错误。v - fuzzy[32]由脆弱性概率指导,通过深度学习模型预测脆弱性概率,将模糊过程引导到可能存在脆弱性的代码区域。SemFuzz[25]和DrillerGo[26]利用从CVE描述和git日志中获取的语义信息来直接模糊并生成PoC漏洞。1DVUL[44]由补丁相关分支直接更改原始数据流或控制流来发现1天内的漏洞。SAVIOR[30]和ParmeSan[29]的指导信息来自于消毒剂。IJON[35]利用人工分析师的注释来指导fuzzer克服重大障碍。RVFUZZER[34]由控制不稳定性指导,以发现机器人车辆的输入验证错误。PFUZZER[27]显式地指向输入解析器,以很好地覆盖可能的输入空间。DGF已经从到达目标位置发展到捕捉复杂的深层行为bug。
输入优化
标记目标之后,DGF需要生成种子输入来调用模糊过程。良好的种子输入可以使模糊过程更接近目标位置,提高后续突变过程的性能。根据Zonget al.,平均超过91.7%的AFLGo输入无法到达有bug的代码[54]。因此,优化输入生成对于提高DGF的方向性有很大的空间。seeddedfuzz[46]致力于改进初始种子的生成和选择,以实现定向模糊的目标。它利用动态污染分析来识别种子字节,这些种子字节可以影响对安全敏感的程序站点的值,并通过改变相对字节生成新的输入,并将它们提供给目标程序以触发错误。FuzzGuard[54]使用一种基于深度学习的方法,在练习之前过滤掉无法达到的输入。它将程序输入视为一种模式,并使用大量标记为目标代码可达性的输入来训练模型。然后,FuzzGuard利用模型来预测新生成的输入的可达性,而不运行它们,这节省了实际执行的时间。
如果fuzzer生成关于输入语法的输入,它可以执行得更好。TOFU[53]以protobuf[56]规范的形式利用程序输入的已知结构来生成有效的输入。通过将模糊过程划分为语法模糊和语义模糊,豆腐扩大了输入空间,以包含命令行标志。但是,即使用户熟悉输入语言[53],实现输入语言语法通常也需要一到两天的时间。SemFuzz[25]利用从CVE描述和git日志中检索到的信息(系统调用和参数)来构建设计好的种子输入,以增加命中脆弱函数的概率。TIFF[47]和ProFuzzer[48]识别输入类型,以帮助突变,最大限度地增加触发内存损坏错误的可能性。PFUZZER[27]是一种语法驱动的方法,它专门针对输入解析器,在不生成合理输入的情况下最大化输入空间覆盖率。
种子优先级
DGF的关键是选择和优先选择在特定指标下表现更好的种子。我们总结了被现代作品广泛采用的三个普遍的度量标准,包括距离、覆盖范围和概率。
1)距离:由表I可以看出,32%(9/28)的定向fuzzers基于距离对种子进行优先排序,并优先选择离目标较近的种子。作为一项开创性的工作,AFLGo[21]在编译时对源代码进行检测,并根据PUT的调用图和控制流图中的边数计算到目标基本块的距离。然后在运行时,它聚合每个执行过的基本块的距离值,以计算平均值来评估种子。许多后续随访继承了这种基于距离的方案,如ParmeSan[29]和1DVUL[44]。TOFU的距离度量定义为达到目标[53]所需的正确分支决策的数量。RDFuzz[52]结合距离和频率对种子进行优先排序。通过计算执行频率,将代码区域划分为高频区域和低频区域。输入分为高/低距离和高/低频四种类型。在探索阶段,优先考虑低频种子以提高覆盖率,在开发阶段,优先考虑低距离种子以实现目标代码区域。UAFuzz是一个定制的直接灰盒fuzzer复杂的行为使用后免费漏洞[22]。与基于控制流图的距离不同,它使用调用链的距离度量,指向更可能包括分配函数和自由函数的目标函数。Wüstholzet al[12]使用在线静态前向分析来确定所有后缀路径无法到达目标位置的路径前缀。通过强调可能到达目标位置的路径前缀,fuzzer的功率调度可以更有策略地分配资源。**基于距离的方法的一个缺点是它只关注最短距离。当有多条路径到达相同的目标时,较长的选项可能会被忽略,从而导致偏离。**我们将在第四- d节中用一个例子来说明它。
2)相似度和覆盖率:除了距离之外,相似度是另一个有用的度量标准,它表示某些目标形式的覆盖率,如功能、位置和bug痕迹。当有许多目标时,这个指标特别合适。Hawkeye[42]利用PUT的静态分析,并将基本块跟踪距离与覆盖函数相似性相结合,用于种子优先级排序和功率调度。LOLLY[23]使用用户指定的程序语句序列作为目标,并将种子覆盖目标序列的能力(即序列覆盖)作为评估种子的指标。UAFL[28]使用操作序列覆盖作为反馈,以指导测试用例生成,逐步覆盖可能触发自由后使用漏洞的操作序列。UAFuzz[22]还使用了一个序列感知的目标相似性度量来衡量种子的执行和目标UAF错误跟踪之间的相似性。序列感知的目标相似性度量具体评估种子执行跟踪在运行时覆盖的目标数量,并考虑目标的顺序。Berry[24]考虑了目标序列中节点的覆盖率及其执行上下文。它用必要的节点来增强目标序列,即所有路径到达目标序列中的节点所需的基本块。除了分支覆盖之外,Berry还考虑目标执行跟踪和增强的目标序列之间的相似性,以对种子进行优先级排序。SAVIOR[30]根据UBSan[57]预测的标签覆盖范围,对触发漏洞可能性较大的种子进行优先排序。基于内存破坏漏洞与敏感内存操作密切相关这一事实,TortoiseFuzz[51]区分了更有可能被攻击的边缘。它通过覆盖和安全影响的组合对输入进行优先级排序,这是由函数、循环和基本块上三种不同粒度的内存操作表示的。
3)概率:概率是另一个有用的指标,它根据实现目标的可能性来优先考虑种子。该算法通常将种子优先级度量与目标识别度量相结合,将模糊导向潜在的脆弱位置。v - fuzzy[32]和SUZZER[49]基于深度学习模型预测函数的脆弱概率,并给脆弱函数中的每个基本块一个静态评分。然后,对于每个输入,它计算其执行路径上所有基本块的静态得分之和,并优先考虑得分较高的输入。SAVIOR[30]利用UBSan来标记有bug的代码区域。TAFL[50]加强了对包含漏洞可能性较高的区域的模糊,该区域基于静态语义度量,包括敏感、复杂、深入和难以触及的区域。
能量分配
在对种子进行筛选和排序后,优先选择的种子被赋予更大的权力,即更多的机会进行模糊测试。虽然功率分配对DGF至关重要,但很少有工作,尝试优化这一步。AFLGo[21]使用基于模拟退火的功率计划,逐步将更多的能量分配给离目标位置较近的种子,同时减少离目标位置较远的种子的能量。与传统的随机漫步调度不同,总是接受更好的解决方案,可能会陷入局部最优,模拟退火接受不如当前的解决方案有一定的概率,所以可以跳出局部最优,达到全局最优解决方案[23]。Hawkeye[42]也采用了模拟退火,但增加了优先级。因此,先突变离目标较近的种子,进一步提高了定向性。LOLLY[23]采用基于优化模拟退火的功率计划,实现最大序列覆盖。在温度阈值的控制下,探索阶段的冷却计划随机突变提供的种子,产生许多新的投入,而在开发阶段,它从序列覆盖率更高的种子中产生更多的新投入。
Mutator调度
一些fuzzers(28个中的8个)优化突变策略来辅助定向模糊,这主要是通过将突变体分类到不同的粒度来实现的。Hawkeye[42]利用了一种自适应突变策略,将突变体分为粗粒度和细粒度。粗粒度的mutators用于在突变期间更改大量字节,而细粒度的mutators仅涉及少量字节级修改、插入或删除。当种子能够达到目标函数时,它提供了较少的粗粒度突变的机会。一旦种子达到目标,进行细粒突变的次数就会增加,而粗粒突变的次数就会减少。在实际应用中,可变子的调度是由经验值控制的。同样,V-Fuzz[32]将变异策略分为轻微变异和严重变异,并根据实际的模糊状态通过阈值动态调整变异策略。SemFuzz[25]执行类似的分类,只是它主要关注系统调用。SemFuzz对输入进行粗变异,以找到一个可以将执行移向“脆弱函数”的系统调用序列。然后,它切换到系统调用序列的细粒度突变,以监视“关键变量”。TAFL[50]还采用了基于经验观察的变粒感知调度方法,即(1)粗粒度的变粒在路径增长上优于细粒度的变粒;(2)组合多个变异子比单一变异子的性能更好。ProFuzzer[48]根据输入类型探测识别的输入字段类型需要不同的突变策略。
数据流分析
数据流分析,如污染分析,可以反映突变对生成输入的影响,有助于优化突变策略和输入生成。RDFuzz[52]利用干扰和检查方法来识别和保护距离敏感内容的输入,这对保持距离至关重要。在突变期间防止这种内容可以帮助更有效地接近目标代码位置。UAFL[28]采用信息流分析来识别条件语句中的输入与程序变量之间的关系,并对这些信息流强度高的输入字节赋较高的变异可能性,因为它们更有可能改变目标语句的值。SemFuzz[25]通过向后数据流分析跟踪关键变量所依赖的内核函数参数。SeededFuzz[46]利用动态污染分析来识别可能影响安全敏感程序站点的值的种子字节。PFUZZER[27]使用动态污染输入,将处理过的每个值与它所派生的输入字符关联起来。TIFF[47]通过内存数据结构识别和动态污染分析推断输入类型,增加了基于类型的突变触发内存损坏漏洞的概率。然而,数据流分析通常会增加运行时开销。

Challenges and Solutions

A.二进制代码支持
问题:运行时开销大,目标信息收集困难,难以确定目标。
解决:缓解性能限制的一个可行解决方案是硬件辅助。英特尔PT是最近英特尔处理器中的一个轻量级硬件特性。它捕获有关程序执行的跟踪数据,取代了对动态检测的需求。Intel PT可以动态跟踪程序的执行,开销可以忽略不计。使用Intel PT捕获的数据包跟踪以及PUT的相应二进制文件,安全分析师可以完全重构PUT的执行路径。平均而言,PT-based方法比QEMU-AFL[59]快4.3倍。以前的硬件特性如Intel Last Branch Record也执行程序跟踪,但是它的输出存储在特殊的寄存器而不是主存中,这限制了跟踪的大小。CGF与PT的尝试,如kAFL [6], PTfuzz [59], Ptrix [58], Honggfuzz[60]。然而,PT尚未用于DGF。对于二进制码级的目标识别和标记问题,我们可以利用基于机器学习的[32]方法或启发式二进制差分方法[30]自动识别脆弱代码。
B.目标自动识别
为了实现目标的自动识别,我们可以使用静态分析工具在PUT中发现潜在危险区域[46,61,62]。然而,这些工具通常针对[29]使用的错误类型和编程语言。另一个方向是利用编译器杀毒程序,如UBSan[57],来注释PUT中的潜在bug[29,30]。对于二进制代码,1DVUL[44]通过基于Bindiff的二进制级比较,提取不同的函数及其不同的基本块,识别与补丁相关的目标分支[63]。基于深度学习的方法也能有效预测漏洞,并利用预测信息引导模糊[32]。最后,攻击面识别分量[64]对DGF中脆弱目标的自动识别也很有用。
C.区分权重度量
以目前广泛使用的基于距离的度量方法为例,通过种子与目标之间的距离来度量达到目标的能力。然而,这种测量忽略了不同的分支跳跃有不同的概率。因此,这种不精确性限制了定向模糊的性能。因此,在计算距离时考虑权重差来指导种子的优先级也更为合理。其他种子优先级指标,如相似性和概率,也应该遵循同样的原理。
一个可能的解决方案是考虑分支跳跃概率。当基于概率评估目标的可达性时,每个种子的优先级是基于该种子产生达到目标的输入的可能性,即将该种子的当前执行路径转换为通过该目标的目标路径的概率。由于执行路径可以被看作是由连续分支[1]组成的马尔可夫链,因此路径的概率可以通过收集路径内所有分支的概率来计算。在蒙特卡罗方法的基础上,通过统计计算比率来估计分支概率。平稳分布的密度正式地描述了fuzzer在一定次数的迭代后执行一定路径的可能性。一种基于蒙特卡罗Monte Carlo的方法需要条件:1)抽样应是随机的;2)样本规模应大[3]。幸运的是,模糊过程本质上满足了这些要求。由随机变化的测试用例驱动的执行路径可以被视为满足第一个需求的随机样本。由fuzzers生成的测试用例的高吞吐量使得估计在统计上有意义,满足了第二个需求。因此,将模糊作为一个抽样过程,我们可以以一种轻量级的方式统计估计分支跳变概率。
这种基于概率的方法的一个可能缺点是潜在的运行时开销。统计跳跃计数和概率计算都引入了额外的计算。缓解性能递减的一个简单方法是区间采样。另一个可能的解决方案是加速计算,这涉及如何存储和访问元数据。通常,基于图的数据存储在邻接表中。然而,由于基于概率的方法更新跳转统计信息的频率较高,且可达性判断也需要快速的边缘跟踪,因此邻接表访问数据的效率较低,不适合使用。另一种选择是支持快速数据访问的邻接矩阵[51]。然而,由于跳转通常有两个分支,矩阵将是巨大的,但数据分布是相对稀疏的,这大大增加了空间消耗。因此,利用基于概率的方法的先决条件是设计一个自定义的数据结构,以平衡时间复杂性和空间复杂性。
D.全局最优偏差
当DGF测试中存在多个目标时,如何协调这些目标是另一个挑战。一种策略是基于Dijkstras算法寻找全局最短距离,就像AFLGo所做的那样。但是,这种全局最优可能会错过最接近某一目标的局部最优种子,导致偏差。
为了避免在评价种子时产生偏差,我们应该考虑到所有可能达到目标的途径。为了实现这一目标,Hawkeye使用了基于轻量级静态分析[42]的邻接函数距离增广,该分析基于生成的调用图考虑(立即)调用关系的模式。协调多目标的另一种策略是目标分离。对于每颗种子,只选择所有目标间最小的距离作为种子的距离,并根据这个最小距离[44]对种子进行优先级排序。这样可以避免局部最优偏差,但这可能会降低达到特定目标的速度。
E.间接呼叫缺失
在没有间接呼叫的情况下,基于呼叫图和控制流图的距离测量是不准确的,影响了DGF到达目标的能力。
对于静态方法,一个简单的解决方案是对函数指针执行Andersen的指向分析[30,42]。然而,这种基于包含的上下文不敏感指针分析导致间接调用有许多出边,可能会产生对给定输入不可能的执行路径。TOFU[53]使用函数类型签名来近似每个间接调用站点上的可调用集。但是,它不考虑强制类型转换,因为强制类型转换可能允许调用不同类型的函数,从而导致不精确。对于动态情况,ParmeSan[29]在实际执行过程中识别间接调用的缺失边,并逐步补偿调用图。最后,在执行了足够多的模糊操作后,图趋于完整。然而,这样的解决方案不可避免地会增加运行时开销,并且不能保证完整性。
F.Exploration-exploitation协调
在我们所调查的定向模糊推理中,只有一项工作试图提高探索-开发的协调性。RDFuzz[52]使用一个交织的调度来交替地进行探索和开发。它在执行期间计算分支级统计信息,将代码区域划分为高频和低频区域。根据频率和距离两种评价标准,将输入分为高/低距离和高/低频率类型。低频输入有助于提高覆盖率,这是勘探的需要;低距离输入有助于实现目标代码区域,这在开发过程中是有利的。最后,它使用一个交织的测试计划来交替进行探索和开发。
另一个可能的解决方案是利用动态策略来协调勘探阶段和开发阶段的划分,这可以在勘探阶段和开发阶段之间进行自适应的切换。为了实现这一方案,我们建议将模糊阶段的划分与种子的划分相结合,即将种子划分为两组:覆盖种子用于勘探和定向种子用于开发。每组种子的数量表示对应阶段的能量消耗。这两个阶段的协调是通过控制每组种子的数量来实现的。我们使用一个叫做ddp的变量来表示所有种子中定向种子的百分比,这也表示花费在种子上的能量的百分比开发阶段。在种子评估过程中对覆盖种子进行标记,在每个模糊周期后对定向种子进行标记,调整bydp。我们使用算法2来说明这个设计。具有自适应分裂的DGF应该从探索阶段(dp=0)开始,该阶段专注于发现新路径。然后,随着已知路径的增加,我们逐渐增加可达性,以调用开发阶段,在开发阶段,高价值的定向种子被选择和优先级,以增强基于dp的可达性。当fuzzer长时间找不到任何新路径时,勘探阶段就会出现瓶颈,我们应该通过大幅增加dp来快速进入开发阶段。类似地,我们偶尔也需要从开发阶段回到探索阶段。例如,我们已经处于开发阶段,dp非常大(例如,dp>0.9),但我们无法通过多次模糊循环来接近目标,我们应该大幅降低dp以回到勘探阶段。这是因为现有的定向种子表现较差,我们应该扩大路径覆盖,以发现更多潜在的定向种子。在该方案中,两个阶段可以共存,以达到最佳的性能和适应性。值得注意的是,算法中的阈值是用来说明原理的。合理的值应该基于启发式算法产生。

讨论

A.多目标关系开发
虽然86%(24/28)的定向fuzzer支持多目标,但只有4个关注目标之间的关系。当有多个靶标时,可以通过靶标之间的关系来优化DGF。如果它们不相关,我们可以给它们分配权重,以区分重要性或概率。否则,可以提取和利用隐藏的关系,以提高方向性。例如,UAFL[28]在利用目标序列查找自由后使用的漏洞时考虑了操作序列的顺序。这是因为,要触发这种行为复杂的漏洞,不仅需要覆盖单个边,还需要以特定的顺序遍历一些长序列边。这种方法可以扩展到检测语义错误,比如双自由和API误用。Berry[24]使用所有路径的执行上下文(即,到达目标序列中的节点所需的必要节点)增强了目标序列。在这里,我们建议可以进一步包括以下关系。
空间关系。目标在执行树中的相对位置。假设我们有两个目标,我们可以考虑它们之间的关系,包括它们是否在相同的执行路径上,它们共享多少执行路径,以及哪一个是另一个的祖先或继承者。
状态关系。对于包含程序状态的目标,我们可以考虑它们在状态空间中的位置。例如,两个目标是否共享相同的状态,以及两个状态是否可以在状态转换映射上相互转换。
交错关系。对于多线程程序,线程调度影响事件在不同线程中的执行顺序。同一线交织下可以达到的目标应是交织空间中关系密切的目标。
B .技术集成
在这里插入图片描述
在我们调查的工具中,75%依赖控制流分析来评估种子和确定目标的可达性;46%利用静态分析自动识别目标[30]并从PUT中提取信息[12,42];32%采用数据流分析(主要是污染分析)识别输入与关键程序变量之间的关系[27,44,47],优化变异策略调度[28,46];11%的人使用机器学习预测脆弱代码[32],并过滤掉不可达的输入[54];18%采用语义分析自动识别脆弱目标[25,26,50],并学习输入字段语义优化突变;最后,18%的人采用符号(concolic)执行来解决复杂的路径约束[24,26,30,44]。在个人看来,定向混合模糊是一个很有前途的方向,它可以利用符号执行的精确性和DGF的可伸缩性来减轻个体弱点。有向模糊可以对输入突变进行优先排序和调度,以便快速接近目标,而有向符号执行可以帮助到达更深入的代码,这些代码由从程序入口到目标的执行轨迹的复杂检查来保护。然而,我们应该意识到,反模糊技术[65,66]可以插入假路径,在错误处理代码中增加延迟,并混淆代码以减慢动态分析,如符号执行和污染分析[51]。
C.实现的限制
AFL的两个限制都可能导致控制流图的不精确性,最终影响基于控制流图分析的种子优先级排序,无论是基于距离还是其他度量。
D .效率改善
在评估中,研究人员通常关注达到目标的能力,使用诸如曝光时间(曝光时间,即在第一个测试用例暴露给定错误[21]之前的模糊活动的长度)这样的度量来衡量定向灰盒模糊器的性能,而忽略运行时开销。然而,对于给定的模糊时间预算,更高的效率意味着更多的模糊执行,因此,更有机会达到目标。因此,优化模糊效率是提高方向性的另一个方向
一种解决方案是将独立于执行的计算从运行时转移到编译时。例如,AFLGo通过解析PUT的调用图和过程内控制流图来度量每个基本块与目标位置之间的距离。由于解析图和计算距离都非常耗时,AFLGo将大部分程序分析转移到编译时的检测阶段,以换取运行时的效率。另一个优化是在实现级别。由于我们在分析期间使用的大部分数据都是基于图的,因此如何存储和访问这些元数据对效率至关重要。我们可以设计一个优化的数据结构来存储这些数据,根据图的拓扑结构,便于在搜索时频繁、快速地访问数据。例如,使用graph数据库模型[68]。最后,我们可以利用并行计算进一步提高效率。先前的研究[69,70]已经成功地将并行性应用于CGF,但还没有应用于DGF。对于DGF,我们可以使用一个中心节点来维护一个种子队列,该队列保存DGF的所有种子并对其进行优先级排序。然后,将种子分布到计算节点上的并行模糊实例中,测试PUT并收集反馈信息。
E.未来研究建议
-在我们评估的工具中,只有一个(SemFuzz[25])支持内核代码测试。因此,在内核代码中引入DGF并引导对关键站点的模糊处理,如系统调用[71]和错误处理代码[77,73],应该是一个富有成果的方向。
-虽然DGF一直在尝试发现新的bug类型,比如释放后使用bug和内存消耗bug,但许多常见的bug还没有包括在内。因此,另一个研究方向是将DGF应用于特定的bug类型,如信息泄漏bug[74]、并发bug[13-15]、语义bug (TOCTTOU[75]、double fetch[44,76])。
-关于种子优先级度量,大多数工作都是利用基于距离和覆盖率(相似度)的方法,这有助于定量的种子评估,而不会引入太多的开销。但是,由于权重差异原因(第四- c节讨论)和全球偏差原因(第四- d节讨论),距离较小或覆盖面更广并不一定意味着更接近目标。我们认为基于概率的指标 应该更加合理。
-最后,分阶段模糊[53,77]是一种可行的方法,可以进一步开发DGF。通过将到达目标的路径划分为顺序阶段,分段有向模糊可以通过到达每一阶段的子目标逐步到达目标。此外,我们可以利用不同的模糊策略来满足不同阶段的需求。例如,TOFU[53]对命令行标志使用语法模糊,对主输入文件使用语义模糊。因此,分级模糊可以降低每一阶模糊输入空间的维数,提高模糊效率

全部评论 (0)

还没有任何评论哟~