没有合适的资源?快使用搜索试试~ 我知道了~
1051本作品采用知识共享署名-相同方式共享国际4.0许可协议进行许可。LibAFL:一个构建模块化可重用模糊器的框架摘要安德烈·菲奥拉尔迪EURECOMfioraldi@eurecom.fr张东佳东京大学toka@aflplus.plus多米尼克·迈尔谷歌公司dmnk@google.com达维德·巴尔扎罗蒂EURECOMbalzarot@eurecom.fr应用程序:AFL [76]、AFL++ [27]、Hongg FU zz [69]和LIB FU zzerAFL的发布标志着软件安全测试领域的一个重要里程碑,使模糊测试重新成为一个主要的研究课题,并刺激了大量的研究,试图改进和评估模糊测试管道的不同方面。这些研究中的许多都通过分叉AFL代码库来实现他们的技术。虽然这种选择一开始看起来是合适的,但将多个分叉组合成单个模糊器需要很高的工程开销,这阻碍了该领域的进展,并妨碍了对不同技术的公平和客观评估模糊生态系统的高度分散的景观也阻止了研究人员将正交技术结合起来,最终用户很难采用新的原型解决方案。为了解决这个问题,在本文中,我们提出了L IB AFL,一个框架,工作建立模块化和可重用的模糊。 我们讨论了不同的组件通常用于模糊和映射到一个可扩展的框架。LIBAFL允许研究人员和工程师扩展核心模糊器管道,并共享他们的新组件以进行进一步评估。作为LIB AFL的一部分,我们整合了20多个以前的作品中的技术,并进行了广泛的实验,以显示我们的框架在结合和评估不同方法方面的优势 我们希望这可以有助于阐明目前的进展模糊,并提供了一个坚实的基础,在未来的比较和可扩展的研究。ACM参考格式:Andrea Fioraldi , Dominik Maier , Dongjia Zhang , and DavideBalzarotti.2022. LibAFL:一个构建模块化和可重用模糊器的框架。 在2022年ACM SIGSAC计算机和通信安全会议(CCS '22)的会议记录中,2022年11月7日至11日,美国加利福尼亚州洛杉矶。ACM,纽约州纽约市,美国,15页。https://doi.org/10.1145/3548606.35606021引言模糊器是设计用于执行具有大量自动生成的输入的目标应用程序的工具 他们的目标是发现有问题的状态,通常与安全漏洞的存在相关联。由于其有效性,模糊器已成为开发人员和安全研究人员的重要资产。许多现成的模糊器可供公众使用,其中一些现在被认为是通用的事实标准CCS©2022版权归所有者/作者所有。ACM ISBN978-1-4503-9450-5/22/11。https://doi.org/10.1145/3548606.3560602[47 ]第47段。这些模糊器在安全测试人员中非常受欢迎,例如,经常发现OSS-Fuzz上的数千个错误[2],这是一种针对开源软件的广泛模糊工作。不幸的是,虽然现成的模糊器是很好的工具,对于非专家来说很容易设置和使用,但对于有经验的用户来说,它们往往存在局限性。事实上,为了测试复杂的应用程序或适应不同类型的目标,如操作系统内核、设备驱动程序或嵌入式设备,专家们经常求助于创建新的模糊器,或修改现有的模糊器以满足他们的需求。例如,学术研究人员经常在小型原型中实现算法改进和新想法,这些原型通常建立在AFL或AFL++之上。虽然这满足了评审人员在结果可重复性方面的需求,但它也导致了大量不兼容的分叉。这是因为所有现有的模糊框架都没有被设计为可扩展的。因此,研究人员在实现他们的原型时被迫一遍又一遍地重新发明轮子,经常错过其他分叉中存在的功能,这些功能过于复杂,无法移植或重新实现。 一些项目,特别是AFL ++[27],提出了高度可配置的模糊架构。然而,它们不够通用(例如,所有的输入都被表示为字节数组,因此需要黑客和变通方法来集成结构化和语法模糊技术),也不需要适当地划分(因此需要分叉项目以使其适应新技术)。这个问题不仅是一个工程问题,但它也突出了缺乏一个标准定义的实体,定义一个现代模糊。Manes等人[52]发表了一项学术调查,涵盖了2019年之前的所有模糊测试工作作者强调了大量的公共模糊,并在一个通用的模糊算法中对一些常见的高级概念进行虽然这种高级分类对于系统化来说已经足够了,但是实体及其关系的粒度太粗,无法开发模糊器根据这个定义。模糊景观的破碎化对该领域的研究产生了三个关键后果(1) 正交贡献很难合并。在过去的十年中,已经提出了数百种(如果不是数千种)不同的改进来提高模糊测试的有效性然而,在AFL上实现的新语料库调度器不能容易地与在自定义模糊器中实现的新变应器组合。正如我们之前提到的,这阻碍了整个模糊化的进程。每个工具都专注于一些先进的技术,但不能利用其他研究人员提出的其他正交方法1052CCS(2) 个人捐款难以评估。许多关于模糊化的论文的一个共同缺点是,作者将他们在某个模糊器上实现的技术(例如,调度器)与以前提出的在不同工具中实现的解决方案进行比较。因此,通常很难理解更好的结果是否仅仅是由于新算法而不是模糊器的其他组件的结果。(3) 不同的解决方案很难比较。虽然模糊化的每个方面都有几十种不同的技术,但第三方比较需要相当大的重新实现工作,通常用于调查和知识论文的系统化。因此,只有选定数量的解决方案在相同的数据集上进行了适当的测试和比较。我们认为,由于大量的重复工作,这三个问题是重要的障碍,大大减缓了模糊化的进展,新技术从学术界向工业界的过渡,以及新解决方案因此,我们提出了LIB AFL,这是一个在Rust中从头开始编写的新模糊框架LIBAFL由一系列库组成,这些库可用于通过组合基于可扩展实体的组件来构建自定义模糊器 它实现了这一目标,这要归功于几个因素:(a)它易于扩展;(b)它基于现代模糊器组件的分类;(c)它旨在利用Rust的功能,例如在编译时轻松快速地序列化对象和组件插槽;(d)它已经实现了广泛的模糊算法,功能和该领域最近的工作提出的工具选项。LIBAFL由于可扩展的设计,研究人员可以将模块和实验与有益的技术组合在一起。 在本文中,我们使用了一系列的构建块实现的LIB AFL相结合,并测试引人注目的模糊方法,以前从未评估过,和其他从未在同一基线上进行评估。据我们所知,我们是第一个通过使用相同的基线进行如此广泛的重新实施(我们集成了20个以前作品的技术)和评估(15种不同的技术)的工作。此外,我们评估这些技术的组合,并提供这些组合的有效性的见解。我们还展示了如何LIB AFL是一个强大的基础,开发标准和更异国情调的模糊。 在第一类中,我们建立了一个通用的比特级模糊器,使用已知技术的最佳组合,并显示结果如何优于所有国家的最先进的通用模糊器,如AFL ++,LIB F U zzer和HonggF U zz。然后,我们通过使用基于VM状态的自定义反馈,为以太坊虚拟机重新实现了差分模糊器[50]。 我们将此模糊器与其原始实现进行比较,并展示我们的版本在两个测试虚拟机中未发现的差异方面如何优于它。1.1捐款简而言之,在本文中,我们提出以下贡献:我们识别和模型的共同构建模块使用的现代模糊;我们介绍了LIB AFL,一个用Rust从头开始编写的我们实现了最先进的构建块和技术;基于这些构建块,我们评估了在以前的工作中提出的15种技术,以及一系列新颖的组合;我们提出了一个案例研究,使用自定义反馈重新实现了差分模糊器• 我们的通用模糊优于所有现成的模糊;2背景Fuzz Testing或Fuzzing在安全测试领域有着悠久的历史它最幼稚的实施方式,包括通过反复向程序提供随机输入数据来寻找崩溃,已经超过30年了[55]。从这个最初的想法,模糊在过去的三十年里已经在多个方向发展。这些包括有效地和有效地探索目标程序的新技术,但也包括模糊新系统(如整个操作系统[41,51,65]或管理程序[64])的能力或模糊超出其在软件测试中的原始用途的应用(例如,用于漏洞生成[35]或根本原因分析[11,66])。在他们的调查中,Maneset al. [52]定义了一种算法,该算法将模糊测试泛化以适应许多模糊器,但它们的定义仍然与错误的概念相联系,而最近的模糊器则发展到涵盖其他领域的应用程序因此,我们认为,今天更适合将模糊化视为一系列测试技术,这些技术反复向目标系统提供机器生成的输入,目的是找到满足某些目标的输入。在同一项工作中,作者根据模糊器每次运行所需的目标系统的内省量来巩固常用的分类法[29]。该分类提出了以下三个系列:黑盒模糊器不需要来自目标的任何反馈。在这种情况下,模糊测试与传统的随机测试密切相关,甚至可能等同[34]。请注意,缺乏实际实现的信息并不意味着缺乏有关规范部分的信息例如,像Peach [22]这样的黑盒模糊器需要输入格式的模型来生成测试用例;白盒模糊器使用目标特定的内部信息来系统地检查目标的状态空间一个例子是SAGE [30],它试图通过使用执行期间收集的约束灰盒模糊器站在前面两种方法的中间。它们收集最少的信息以更好地探索输入空间,同时保持低性能开销。传统上,信息是在目标执行期间使用轻量级插装(如AFL[76])收集的;用于描述模糊器的另一种常见分类(与前一种分类正交)是基于模糊器如何为目标的每次运行生成输入:(1)基于模型的生成使用输入格式的模型从头开始生成测试用例。 这可以是由人指定的语法(例如, [38]),通过使用学习技术(例如, [31]),或者在模糊算法中硬编码的一组生成规则(例如, [74]);(2)基于突变的生成使用存储在语料库中的先前测试用例来导出新的输入。 它通常用于灰盒方法,其中语料库由于从目标收集的信息而演变;········1053LibAFL:构建模块化和可重用模糊器的框架CCS这两种方法并不相互排斥。例如,变异技术可以使用输入格式的模型,如基于模型的生成[4,59]。在这种情况下,区别在于新的测试用例不是从头开始生成的。灰盒或白盒方法的一个普遍体现是进化模糊。 它通过观察一些运行时特征来跟踪目标的执行,然后通过使用基于这些观察的反馈来演化内部状态。例如,通常使用反馈来评估执行的新颖性,并决定是否应将新输入添加到语料库中以用于未来的突变。最常见的反馈形式是基于代码覆盖率[17,27,47,65,69,76]。此外,采用不同类型的反馈来扩展简单的覆盖引导,例如比较指令[45,58]的两个值之间的汉明距离的最小化或程序状态数据[24,53]中的新颖性搜索。2.1AFL+在现有的解决方案中,与我们的工作最接近的是AFL ++,这是美国Fuzzy Lop模糊器的社区驱动分支。 它集成了多种技术,并提供了一定程度的可扩展性。Fioraldi等人 [27]在AFL ++中重新实现了作者认为有趣的几种技术,如MOpt [48]和AFLF A st [14],并进行了一些比较实验。 此外,他们还定义了一个名为自定义突变器的插件接口,该接口可用于通过自定义突变和测试用例最小化来扩展AFL ++。 它还提供了在fuzzer生命周期中触发的各种钩子,例如,当从语料库中提取测试用例时。虽然这提供了一个与LIBAFL相同方向的初始步骤它遭受了来自AFL设计的内在限制事实上,AFL ++仍然是一个单一的C代码库,用于大多数与编写mutator无关的任务,并且不同的组件没有被任何软件工程标准分开。近年来,事实上,AFL ++[24,49,68,72]的几个分支已经开发出来,延续了AFL的不兼容分支实现正交技术的传统。此外,自学术论文发表以来,AFL ++代码库包含了越来越多的技术,规模和范围也越来越大,这使得维护软件的难度越来越大。为了避免继承这些问题,我们决定从头开始实现LIB AFL,而不是扩展AFL++,即使它是一个坚实的基础。3现代模糊中的实体为了支持我们框架的设计,我们首先确定了一组9个基本实体,这些实体通常存在于大多数现代模糊器中。在本节中,我们将介绍这些实体,并使用最先进的模糊器提供一些示例。输入-正式地说,程序或一般系统的输入是从影响其行为的外部来源获取的数据。在我们的抽象模糊器模型中,我们将输入定义为程序输入(或其一部分)的内部表示在最简单的情况下,程序的输入是一个单字节数组。模糊器(如AFL)直接存储和操作此字节数组,并在执行时将结果传递给目标。然而,存在字节数组不是输入的理想表示的情况,例如,当目标期望系统调用序列时[70]。在这种情况下,模糊器内部表示Input的方式与程序使用Input的方式不同另一个例子是语法模糊器的输入,如Ascher-mann等人的NAUTILUS。al. [4]的文件。这里,模糊器在内部将输入存储为抽象树,这是一种可以轻松操作的数据结构,同时根据语法保持有效性由于目标期望一个字节数组作为输入,因此树在执行之前被序列化为一个字节序列。 其他模糊器也可以使用其他输入表示,例如编码为整数的令牌序列[63],或编程语言的中间表示[33]。语料库-语料库是输入及其相关元数据的存储。不同类型的存储会影响模糊器的性能,例如,完全存储在内存中的语料库使模糊器更快,但在模糊大目标时会很快耗尽可用内存,而存储在磁盘上的语料库允许用户检查模糊器的状态,但会在磁盘操作上引入瓶颈。大多数主流模糊器[14,47,76]将语料库存储在磁盘上,但这种选择会影响并行模糊的可扩展性,并且需要标准库来执行文件IO操作。在我们的模型中,模糊器需要至少两个单独的语料库:一个用于存储有趣的测试用例(3),这些测试用例用作模糊器的进化算法的组成部分,另一个用于存储解决方案,即,满足模糊器目标的测试用例(例如,程序崩溃)。-这是模糊器要求下一个测试用例进行模糊的方式,通常是从语料库中选择一个条目。例如,天真的排队者实现简单的FIFO策略或随机选择。 更复杂的分类器可以使用基于关于模糊器的内省统计的概率算法[12],或者将其他分类器应用于语料库的子集,就像AFL在计算“偏好”最小集时所做的那样。其他例子包括尝试减轻由过于敏感的反馈引起的语料库爆炸的测试者[72]或优先考虑具有有趣属性的测试用例[73]。Stage--Stage是一个组件,它定义了要在语料库中的单个测试用例上执行的操作。通常,调度器选择一个测试用例,然后模糊器在给定的输入上执行每个阶段。舞台是一个非常广泛的实体,在现有的模糊器中,它通常是一个组件,在输入上调用一次或多次修改器(例如,AFL中随机破坏阶段)或分析阶段,例如,执行污点跟踪以在白盒模糊器中收集信息[17]。许多模糊器采用的另一个广为人知的阶段是AFL中引入的最小化阶段在保持触发覆盖点的同时减小从语料库获得的测试用例的大小。Observer 为了对输入的执行进行推理,模糊器执行它,然后查看观察者。执行后观察者状态的快照在对模糊器状态的影响方面等同于执行本身当分布式模糊器可以发送CCSAndrea Fioraldi、Dominik Maier、Dongjia Zhang和Davide Balzarotti1054观察者状态跨越多个节点。这避免了在模糊一个非常慢的目标时使用相同的输入重新执行的需要一个示例观测器是覆盖图,由常见的覆盖引导模糊器(诸如AFL或HonggF U ZZ)使用。在执行期间填充映射以报告执行的边。此信息不会在运行中保留,它是对动态程序的属性其他模糊器,如Ijon [5]或FuzzFA ctory [58],使用不同形式的观察器,但总是依赖于地图来跟踪代码覆盖范围之外的其他指标执行器-执行器是负责执行目标系统的组件,给定来自模糊器的输入。在不同的模糊器中,这个实体的体现可能会有很大的变化。例如,对于像L IB F U zzer这样的内存模糊器,执行是对harness函数的调用,而对于像Nyx[64]这样的基于管理程序的模糊器,它需要整个操作系统在每次运行时从快照重新启动。在我们的模型中,Executor是一个实体,它不仅定义了如何执行目标,还定义了与目标的单次运行相关的所有volatile操作因此,例如,执行器负责通知程序模糊器想要在运行中使用的输入,例如,通过写入存储器位置或通过将其作为参数传递给线束函数。Executor还维护一组与每次执行相关联的Observer。反馈--反馈是一个实体,它将被测程序的执行结果分类为感兴趣或不感兴趣。典型地,该信息用于决定是否将对应的输入添加到语料库。大多数情况下,反馈的概念与观察者有很深的联系,但两者是不同的概念。事实上,反馈通常处理一个或多个观察者报告的信息,以决定执行是否有趣。虽然“感兴趣”的概念是抽象的,但它通常与新颖性搜索有关(即,感兴趣的输入是到达控制流图中先前未看到的边缘的那些输入在另一个例子中[58],观察者可以用来报告所有内存分配的大小,最大化反馈可以用来最大化这些值,以发现内存消耗方面的病态输入。识别感兴趣的输入的过程在模糊化中还有第二个重要的目标:找到满足特定目标的解决方案,例如,目标程序中可观察到的崩溃这种类型的反馈,目标,作为描述模糊活动的预期结果的预言,例如,一组具有独特堆栈跟踪的崩溃测试用例,如HonggFUzz或输入触发沿着指定路径的崩溃,如AFLGo [13]。Mutator-Mutator是一个接受一个或多个输入并生成新的派生输入的实体。 Mutator可以由其他mutator组成,它们通常链接到特定的Input类型。 在传统的模糊器中,变异器由许多位级变异组成,如位翻转或块交换。 mutator也可以被告知输入格式,并改变输入的内部表示,例如,在语法模糊器的情况下,通过交换抽象树中的节点。突变器通常是模糊器的一部分,在创建自定义模糊器时会经常更改。Generator-Generator是一个设计用于从头开始生成新Input的组件。例如,可以使用随机生成器来生成随机输入。虽然在反馈驱动的模糊中不太流行,但也有一些值得注意的例外采用生成器。例如,N AU t I l U s [4]使用基于语法的生成器来创建初始语料库,并使用子树生成器作为其语法变元的变异。4框架架构Lib AFL的目标是通过基于可重用组件的模块化设计以及可靠、快速和可扩展的最新技术实现,提供构建新一代模糊器所需的基本模块。为了实现这一目标,我们决定将框架的设计绑定到我们使用的实际编程语言Rust上,从设计阶段就利用它的特性。 在本节中,我们介绍并讨论了作为一个系统的L IB AFL的设计及其各个组件。4.1原则和高级设计LIB AFL框架围绕三个关键原则设计可扩展性,允许用户交换第2节中解释的实体的不同实现3进或出,不接触其他部分。这允许正交技术的无缝组合,但也简化了新组件的设计和开发;可移植性,大多数现有的模糊器都是特定于操作系统的,在 *nix或Microsoft Windows下运行。 为了避免这个缺陷,我们选择了以一种独立于系统的方式来设计我们的核心库. 此外,为了最大限度地提高可移植性,我们实现了一个包含所有核心组件的LIB AFL子集,而不依赖于任何标准库,从而允许用户为嵌入式系统和内核等裸金属目标编写模糊器;可扩展性,没有设计选择必须与在多个内核和/或机器上扩展模糊器的能力相冲突。 基于此,我们设计了一个基于事件的接口,使模糊器之间的通信变得容易;正如我们已经讨论过的,现有的模糊框架都不是完全可扩展的。有些可以在不同的操作系统上移植,比如LIBFuzzer [46],但是没有一个可以在没有标准库的系统上编译最后但并非最不重要的是,可扩展性是现有模糊器的一个已知弱点AFL的设计,以及它的许多衍生物,都是基于磁盘IO通信和昂贵的系统调用,如fork(2)[75]。当模糊器跨多个内核扩展时,这会导致糟糕的性能[23]。 其他更具可伸缩性的解决方案,如HONGGFUZZ,仍然基于系统调用来控制目标并在所有并行线程之间维护共享状态,从而导致锁争用。另一方面,LIBFUZZER实现了更大的可扩展性,因为不同的节点在模糊化时不能通信,在定义的时间跨度后合并语料库,并且重新启动模糊器。为了创建一个遵循上述三个目标的框架,我们围绕三个核心库设计了我们的系统LibAFLCore是主库,包含模糊组件及其实现。其中很大一部分····LibAFL:一个构建模块化可重用模糊器的框架CCS1055反馈反馈TestcasesTestcases反馈反馈反馈反馈观察员观察员LibAFL核心状态Fuzzer阶段解决方案语料库阶段突变体示踪剂执行人线束事件管理器Fuzz One输入评估观察员目标输入消息传递…ShMemTCP…火灾事件处理待定反馈目标Testcases调度器元数据反馈状态图1:LIBAFL核心架构。链接是交互的非全面画面的表示1使用libafl_sugar::在内存中调用Sugar ;2使用libafl_targets::libfuzzer_test_one_input;34在内存中调用Sugar::builder()5. input_dirs(输入方向)6.输出目录(output_dir)7. 核心(核心)8//为多节点同步9. broker_port(broker_port)10. (|buf |{1}11libfuzzer_test_one_input(buf);12})13岁构建()十四岁return();清单1:一个带有LIBAFLSugar的前端示例库仅依赖于Rustcore+alloc,因此可以在没有任何标准库的情况下运行;LibAFL Targets包含目标程序中的代码,如用于覆盖跟踪的运行时库;LibAFL CC通过向用户提供一组对插装有用的编译器扩展,提供为L ib AFL编写编译器包装器除了这三个核心库之外,L IB AFL还包含几个工具后端,这些后端提供API将L IB AFL连接到不同的执行引擎,例如QEMU用户模式和Frida。在我们的命名约定中,所有这些库都是用于创建模糊器的工具包的一部分,称为Fuzzer Frontends。一些现成的前端已经可以在框架中的一个附加库中使用,LIB AFL Sugar,它提供了一个高级胶水API,可以在几行代码中快速设置前端 我们还提供了到Sugar crate的Python绑定,用于快速原型化而无需重新编译。例如,清单1显示了一个简单的fuzzer,它将LIBFuzzer风格的线束连接到一个fuzzer,fuzzer使用通用的位级变化并执行使用LIBAFL Sugar的高级API编写的目标进程内在撰写本文时,整个LIB AFL框架(包括测试)由53 k行Rust和15.4k行C/C++组成4.2核心库图1从组件之间的链接的角度展示了核心库的体系结构。大多数组件都是一对一的映射与我们在第3节中讨论的实体一起,增加了三个额外的宏组件:状态,模糊和事件管理器。每个组件都被映射到Rust的通用trait,允许它与任何其他正交组件结合使用 这种架构配置是LibAFL中提出的前端的标准架构,但也可以定义自定义架构。一个替代的架构,已经实现在LIBAFL,包括一个没有任何执行器的管道,其中没有传统的模糊器循环,但模糊器是一个服务,可以从其中请求输入。通过这种方式,L IB AFL可以例如嵌入到仿真循环中,用于Panda等仿真器的钩子中[20]。4.2.1零成本抽象可扩展性伴随着引入抽象的代价,这通常会在性能方面付出代价。 由于速度是模糊的一个重要指标,我们设计了一个设计,允许灵活的抽象,而无需在运行时支付显着的成本。从一开始,在开发的早期阶段,由微基准驱动,我们避免了传统的面向对象模式,而倾向于通用特性。通过这种方式,我们利用Rust编程语言的设计来允许编译器执行强大的优化。在LIBAFL中,每个类属性状都以其他相关成分作为类属参数。然后通过组合定义子组件。通过这种方式,我们在编译时支付了链接但独立的实体的组合的成本,例如Executors和不同类型的Inputs。作为第二种设计模式,受Haskell的启发,我们采用类似于hlist的编译时列表[56]来指定多个对象,例如可组合的mutator中的突变集的观察者集。 这些列表具有检索存储在数据结构中的单个对象的匹配功能。例如,反馈可以访问观察者,这些观察者对于通过名称或类型来确定执行的兴趣度是有用的。通过利用Rust提供的强大的编译时工具,我们的代码是编译器优化友好的。4.2.2该州 状态是所有非易失性数据所在的位置。作为进化算法数据的一部分的所有内容都必须包括在状态中,以及执行的数量,··CCSAndrea Fioraldi、Dominik Maier、Dongjia Zhang和Davide Balzarotti1056伪随机数生成器状态和语料库(主语料库和解决方案语料库两者)。由于某些类型的反馈也需要维护一个状态,例如,到目前为止,在覆盖率引导的模糊化中观察到的覆盖率,我们引入了FeedbackState组件,该组件与状态和反馈相关联。反馈状态的实例包含在State中,并且最初在模糊化过程开始时生成。为fuzzer的数据提供一个位置的主要目的是利用Rust的序列化功能。串行化和反串行化状态允许任何基于LIBAFL的模糊器停止并且稍后从完全相同的内部状态重新启动。 对于进程内模糊化,这种新颖的方法允许L IB AFL通过在崩溃处理程序中重新加载序列化状态来从崩溃中恢复实例,而不需要像以前的解决方案那样重新执行整个语料库。4.2.3Fuzzer。模糊器是定义模糊器可以执行的操作的接收者。它包含反馈,对象,和模糊,所有独立的操作,可能会改变模糊状态。 这些阶段与fuzzer分离,以遵守Rust 1的借用规则,因为它们可能会调用一些同时更改Fuzzer和State的操作。此外,模糊器还提供了如何处理单个测试用例以及如何评估新输入的定义默认情况下,它的标准实现(由反馈驱动的模糊化组成)定义了FuzzOne,负责处理单个测试用例的操作,作为调度程序的调用,以使测试用例模糊化,并调用测试用例的每个阶段。InputEvalu-ation,评估是否必须将输入添加到语料库的操作,默认情况下是目标程序的执行,并使用反馈决定它是否有趣或解决方案。实现其自己的Fuzzer和State实体的自定义体系结构可以用于重新创建像Vuzzer [ 62 ]这样的概念,其在LIBAFL中将输入生成与即时评估4.2.4事件经理。 事件管理器是一个用于生成和处理事件的接口,可用于在并行模糊器中实现多节点同步或仅用于日志记录。 事件管理器旨在最大限度地提高可伸缩性。事实上,如果我们假设一个线性扩展的通信通道(例如共享内存消息传递[67]),管理器不会引入任何进一步的瓶颈,因为每个模糊器都对完全分离的数据进行处理,并且未决事件的过程被推迟到模糊器循环中的特定协调点,在模糊器从调度器请求新的测试用例之前触发。我们的框架包括一组丰富的事件。例如,当一个模糊器向其语料库添加新的测试用例时,可以通知组件,接收包含输入的序列化版本和被反馈认为感兴趣的观察者集合4.2.5元数据系统。 模糊算法通常需要对与给定测试用例或模糊器的整体状态相关的信息进行推理。因此,L IB AFL必须提供一种方法来扩展语料库的测试用例中的数据和状态中维护的数据。一个简单但有效的解决方案是通过组合重新定义新类型,但在这种情况下,开发人员需要1https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html了解所有雇用的出租人所需的每一个元数据。因此,为了在保持简单性和性能的同时提供这种功能,我们为State和Testcase组件设计了一个专用的元数据系统。特别是,在L IB AFL 中,任何实现SerdeAny trait的结构都可以用作元数据,SerdeAny trait是我们创建的一个trait,允许trait对象2的序列化,而不需要标准库。这个trait需要序列化能力和静态生命周期3,因为实例必须能够转换为trait对象。然后,LIBAFL提供了可序列化的映射,该映射可以存储可以转换为SerdeAnytrait对象的任何实例 Testcase和State都持有这种类型的映射,作为Meta数据的可扩展容器。 通过这种方式,不同但相关的组件可以通过对相同的元数据进行操作来进行协作,而完全忽略其他组件对自己的元数据所做的事情。然而,这是LIB AFL中唯一一个由于映射查找(当前实现为散列表)而引入小的运行时开销的模式。4.2.6可组合的反馈。模糊器可能需要组合多个反馈来评估给定输入的“有趣程度”或支持不同的目标。 在LIB AFL中,为了避免从头开始创建新的聚合反馈的需要,可以通过使用逻辑运算符来组合反馈。例如,模糊器可能不想保存每个崩溃输入,而是执行某种崩溃重复数据删除。 在LIB AFL中,这可以例如通过使用将崩溃输入视为感兴趣的反馈以及当输入触发之前从未观察到的新堆栈跟踪时将输入视为感兴趣的反馈来实现。在这种情况下,可以通过将上述两个反馈与逻辑AND组合来实现崩溃重复数据删除目标。4.2.7监视器基于LIB AFL的模糊器中的最后一个组件是监视器。 它是维护从触发事件中收集的统计信息并将其显示给用户的组件。虽然该组件对于工作的模糊器不是必需的,但是缺乏人的内省降低了模糊凸轮的有效性它允许开发人员报告和显示自定义统计数据,并实现各种报告界面,例如在终端中打印状态屏幕,或使用statsd4将数据转发到Grafana Web界面。4.3仪器后端LIB AFL可以很容易地插入到任何插装后端,比如二进制翻译器或简单的编译器插装通道。 当然,我们提供了额外的库,将L IB AFL与一些流行的仪器后端绑定在一起:LLVM [42],SanitizerCoverage[44],QEMU用户模式[9]和Frida [1]。Lib AFL目标中的运行时可以链接到任何Sanitizer-Coverage目标,使用编译器标志将覆盖和比较跟踪添加到模糊器。SanCov支持允许用户创建与非C/C++ SanCov支持的目标兼容的前端,例如Python的Atheris [40]和Rust的cargo-fuzz [8]。LIBAFL CC提供了一组LLVM通道来扩展Clang和其他基于LLVM的编译器来跟踪覆盖,上下文敏感2https://doc.rust-lang.org/book/ch17-02-trait-objects.html3 https://doc.rust-lang.org/rust-by-example/scope/lifetime/static_lifetime.html第https://github.com/statsd/statsd1057LibAFL:构建模块化和可重用模糊器的框架CCS和K-上下文敏感的[7]边缘覆盖,N-gram覆盖[71],覆盖会计[73],与CmpLog的比较[6,27]和具有autotoken的dictionary令牌,以及AFL++的dict 2file传递的增强版本LIB AFL QEMU在不久的将来将QEMU用户模式和整个系统与Rust连接起来,使用一种新颖的模拟器API,具有挂钩功能,可以对目标的执行进行编程控制围绕QEMU的这个接口,库公开了执行器和助手等结构,以安装常见模糊任务的默认钩子,例如边缘覆盖跟踪,访客快照恢复和仅二进制ASan [26]。LIB AFL Frida提供与QEMU桥类似的功能,但具有DBI的功能,没有明确的主机-客户端分离。 它包括一个仅二进制的ASan,与QEMU用户模式不同,它可以在Linux以外的各种操作系统上工作,如Windows,macOS和Android。通过LIB AFL Concolic及其到SymCC [60]和SymQEMU [61]的Rust桥,还为Concolic执行提供了L ib AFL中的仪器功能。我们的API允许用户在Rust中编写自定义约束集合过滤。在目标运行时,约束,然后报告回一个LIBAFL的模糊在一个易于操作的格式。 这些约束然后可以在变应器中使用,例如,生成调用求解器的输入,或者用于模糊化,类似于Borzacchiello等人。建议[15]。除了这些稳定的后端,LIB AFL已经部分支持TinyInst [28]在Windows和macOS上检测二进制文件,并支持Nyx[64]用于管理程序级别的快照模糊。5应用和实验在本节中,我们将讨论在LIB AFL中实现的一些技术以及它们与前几节中介绍的实体的关系。虽然LIB AFL已经有了许多实现的技术,但在本节的第一部分中,我们重点讨论了模糊中的四个流行问题,这些问题是文献中许多已发表作品的焦点:路障绕过(例如,[6,17,57,62]),结构感知模糊(例如,[4,10,25,59])、语料库调度(例如,[18、21、72、73])以及能量分配(例如,[12-14,43])。表1中列出了在编写时集成在L IB AFL中的技术的非全面列表,以及该技术是否需要在模糊器侧中附加组件实现或在目标侧中附加插装代码的信息。在讨论了这些技术是如何实现的之后,我们评估了-在三组不同的实验中评估它们(1) 我们衡量的性能方面的代码覆盖率和错误检测的几种方法的实施和准备使用的LIB AFL;(2) 我们展示了如何结合正交方法在我们的框架中实现,以构建新的和从未评估过的模糊器并衡量其性能;(3) 最后,为了显示我们的框架在传统上下文中的效率,我们使用先前提出的技术比较和评估基于Lib AFL的新的通用位级模糊器与其他最先进的模糊器,如FUzzBench上的AFL++和HongFU zz[54];表1:L IB AFL中集成的技术列表,第一部分仅包含第5节中评价的技术。技术新组件其他仪器红皇后[6]自动代币[27]价值概况[47,58]块覆盖会计[73]函数覆盖会计[73]循环覆盖会计[73]语料库剔除调度器[76]加权调度器[27]FAST功率计划[14,27]COE电力计划[14,27][14,27]第十七话MOpt[48][4]第四届全国政协委员GrI moI re[10]GrA mA tron[68]代币级[63]NeoDiff[50]✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓LIN电源计划[14][14]第60话:我的世界,我的世界[14]SymQEMU[61]点击数[76][71]第七十一话[17]第十七话[26]第二十六话Atheris(兼容性)[40]cargo-fuzz(兼容性)[8]✓✓✓✓✓✓✓✓✓✓✓✓✓✓我们在配备英特尔®至强®Platinum 8260 CPU的x86_64计算机上运行了前两组实验,2.40千兆赫。该数据集是FU zzBench套件的一个子集,选择该套件以包括具有不同功能的程序我们运行每个会话24小时,每个实验重复五次,以减轻模糊随机性的影响。为了与其他模糊器进行比较,我们在Google提供的服务上运行了完整的FU zzBench套件每次运行23小时,重复20次。基准测试套件为每个基准测试提供了初始语料库,我们使用了默认设置。我们讨论的总体排名是基于FuzzBench计算的平均归一化分数,它表示给定基准上最高达到的中值代码或错误覆盖率的百分比。最后,在本节的最后一部分,我们介绍了一个案例研究,关于如何简单,我们可以用LIB AFL实现一个模糊器,它不同于第一部分中所示的传统设置,一个差分模糊器,可以根据虚拟机的状态而不是代码覆盖率来发现以太坊虚拟机中的逻辑错误。最后,为了时间和简洁起见,我们讨论了其他实现的方法及其关系,而没有提供评估。CCSAndrea Fioraldi、Dominik Maier、Dongjia Zhang和Davide Balzarotti1058value_profilevalue_profile_cmplog表2:未覆盖的代码覆盖率随着路障绕过实验的时间(24小时)在流水线的开始处的跟踪阶段,并且记录的值被存储为元数据。稍后,自定义赋值器匹配输入中的模式,并将它们替换为85008000750070006500600040003500300025002000150032000膨胀绒毛靶15m4小时:15分钟8小时:15分钟12小时:15分钟16小时:15分钟20小时:15分钟libpcap_fuzz_both15m4小时:15分钟8小时:15分钟1
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 5
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 新代数控API接口实现CNC数据采集技术解析
- Java版Window任务管理器的设计与实现
- 响应式网页模板及前端源码合集:HTML、CSS、JS与H5
- 可爱贪吃蛇动画特效的Canvas实现教程
- 微信小程序婚礼邀请函教程
- SOCR UCLA WebGis修改:整合世界银行数据
- BUPT计网课程设计:实现具有中继转发功能的DNS服务器
- C# Winform记事本工具开发教程与功能介绍
- 移动端自适应H5网页模板与前端源码包
- Logadm日志管理工具:创建与删除日志条目的详细指南
- 双日记微信小程序开源项目-百度地图集成
- ThreeJS天空盒素材集锦 35+ 优质效果
- 百度地图Java源码深度解析:GoogleDapper中文翻译与应用
- Linux系统调查工具:BashScripts脚本集合
- Kubernetes v1.20 完整二进制安装指南与脚本
- 百度地图开发java源码-KSYMediaPlayerKit_Android库更新与使用说明
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功