论文阅读3:Smart Greybox Fuzzing 智能灰盒模糊测试

原文链接: Smart Greybox Fuzzing | IEEE Journals & Magazine | IEEE Xplore

Abstract

基于覆盖的灰盒模糊(CGF)是一种最成功的漏洞自动检测方法。给定一个种子文件(作为位序列),CGF随机翻转、删除或复制一些位来生成新文件。CGF通过保留那些生成的文件来迭代地构建(并模糊)种子语料库,以增强覆盖率。然而,对于处理复杂文件格式的应用程序来说,随机位翻转不太可能产生有效的文件(或文件中的有效块)。在这项工作中,我们引入了智能灰盒模糊(SGF),它利用种子文件的高级结构表示来生成新文件。我们定义了在虚拟文件结构上而不是在位级别上工作的创新变异操作符,这允许SGF在保持文件有效性的同时探索全新的输入域。我们引入了一种新的基于有效性的能量调度,使SGF能够花更多的时间生成更有可能通过程序解析阶段的文件,这可能会在处理逻辑中暴露更深层的漏洞。我们的评估证明了SGF的有效性。在几个解析复杂的基于块的文件的库上,我们的工具AFLSMART实现了更多的分支覆盖(高达87%的改进),并比基线AFL暴露了更多的漏洞。我们的工具AFLSMART在广泛使用、测试良好的工具和库中发现了42个零日漏洞;分配了22名cve。

Introduction

基于覆盖率引导的灰盒模糊(CGF)是一种流行而有效的漏洞发现方法。与缺乏应用程序知识的黑盒方法和由于程序分析和约束求解而产生高开销的白盒方法不同,灰盒方法使用轻量级代码插装。American Fuzzy Lop (AFL)及其变体以及Libfuzzer构成了CGF最广泛使用的实现。

CGF技术通过突变进行输入空间探索。从种子输入开始,它使用预定义的通用突变操作符集(如位翻转)对它们进行突变。然后检查变异输入执行的控制流,以确定它们是否足够“有趣”。轻量级的程序工具帮助模糊器对控制流的新颖性做出判断。随后,被认为足够新的突变输入被提交给进一步的调查,在这一点上它们被进一步突变,以探索更多的输入。目的是提高行为覆盖率,并在有限的预算时间内暴露更多的漏洞。

CGF的一个最重要和众所周知的限制是它缺乏对输入结构的感知。CGF的变异运算符处理种子文件的位级表示。从相同或不同的种子文件中翻转、删除、添加或复制随机位。然而,许多安全关键的应用程序和库将处理高度结构化的输入,如图像、音频、视频、数据库、文档或电子表格文件。迫切需要在 处理这些广泛使用的格式的应用程序 中有效地找到漏洞。位级文件表示的突变不太可能对文件产生任何结构更改,而这些结构更改对于有效探索庞大而稀疏的有效程序输入域是必要的。有效文件的任意位级突变很可能直接导致无效文件,这些文件在到达程序的数据处理部分之前就会被程序解析器拒绝。

为了解决这个问题,提出了基于字典和动态污染分析的两种主要方法。AFL的创建者Michal Zalewski引入了字典,这是一种轻量级的技术,在随机位置突变期间将有趣的字节序列或标记注入到种子文件中。Zalewski主要担心的是,对输入意识的全面支持可能会以效率或可用性为代价,而这两者都是AFL成功的秘诀。当AFL需要想出神奇的数字或块标识符来探索新路径时,字典会给它带来极大的好处。Rawat等人利用动态污染分析和控制流分析来推断输入数据的位置和类型,基于此,他们的工具(VUZZER)知道在哪里以及如何有效地改变输入。然而,字典和基于污点的方法都不能解决我们的主要问题:改变文件的高级结构表示,而不是它的位级表示。例如,字典和推断出的程序特性都不能帮助从文件中添加或删除完整的块。

与CGF相比,智能黑盒模糊器和peach模糊器已经能够感知输入结构,并利用文件格式的模型从现有的有效文件构造新的有效文件。例如,Peach使用一个输入模型来拆卸有效文件,并将它们重新组装为新的有效文件,删除块,修改重要的数据值。

LangFuzz利用JavaScript (JS)的上下文无关语法从JS文件中提取代码片段,并将它们重新组装到新的JS文件中。然而,仅仅意识到输入结构是不够的,灰盒模糊器的覆盖反馈是迫切需要的——正如我们用Peach做的实验所显示的那样。在我们的实验中,Peach的表现甚至比我们的基准线:灰盒模糊器AFL差得多。我们详细的调查显示,Peach并没有重用生成的输入来提高进一步测试输入生成的覆盖率。例如,如果Peach生成一个具有不同(有趣的)通道数量的wave-file该文件就不能用于 生成具有新发现的程序行为的进一步的wave-file没有覆盖反馈,有趣的文件将不会被保留以进一步模糊。另一方面,保留所有生成的文件几乎不经济。

WAVE是录音时用的标准的WINDOWS文件格式,文件的扩展名为“WAV”,数据本身的格式为PCM或压缩型。WAVE文件格式是一种由微软和IBM联合开发的用于音频数字存储的标准,它采用RIFF文件格式结构,非常接近于AIFF和IFF格式。

在本文中,我们引入了智能灰盒模糊(SGF)——它利用种子文件的高级结构表示来生成新文件——并研究了对模糊器效率和可用性的影响。我们定义了创新的变异操作符,它们作用于文件的虚拟结构,而不是位级。这些结构突变操作符允许SGF探索全新的输入域,同时保持生成文件的有效性我们解决了为部分有效的种子输入(即不完全遵守所提供的语法的文件)启用结构突变的挑战。提出了一种新的基于有效性的能量调度方法,将更多的能量分配给具有较高有效性的种子。这个时间表使SGF能够花更多的时间生成文件,这些文件更有可能通过程序的解析阶段,从而发现程序处理逻辑深处的漏洞。

我们实现了AFLSMART,这是一种基于AFL(一种流行且非常成功的CGF)的健壮但高效且易于使用的智能灰盒模糊器AFLSMART集成了Peach的输入结构组件和AFL的覆盖反馈组件AFLSMART适用于所有遵循树形结构的复杂文件格式,其中单个节点称为数据块。这种基于块的格式很普遍,也就是说,大多数常见的文件格式都是基于块的而且很重要,也就是说,由于基于块的文件格式被用作在机器之间交换数据的最流行的方法,它们形成了破坏软件系统的常见攻击向量。

我们的评估表明,在给定的24小时时间限制内,AFLSMART可以使发现的0 day bugs 翻倍。AFLSMART发现了33个bug(分配的13个cve),而基线(AFL及其扩展AFLFAST[4])只能检测到16个bug,在大型、广泛使用和模糊化良好的开源软件项目中,如FFmpeg、LibAV、LibPNG, WavPack, OpenJPEG和Binutils。与基线(AFL)相比,AFLSMART还显著提高了分支覆盖率,达到87%。AFLSMART在基准测试中的表现也优于VUZZER;AFLSMART发现了七(7)个bug, VUZZER在另一组流行的开源程序(如tcpdump、tcptrace和gif2png)中找不到这些bug。此外,在为期1周的FFmpeg bug搜索过程中,AFLSMART发现了9个额外的0-day bug(分配了9个cve)。它的有效性带来的开销可以忽略不计——通过我们对延迟破解的优化,AFLSMART实现了与AFL相似的执行速度。

根据我们使用AFLSMART的经验,编写文件格式规范所花费的时间 被 行为覆盖率和暴露的bug数量的巨大改进所抵消。我们中的一个人花了5个工作日开发了10个文件格式规范(如Peach Pits),用于模糊所有16个主题程序。因此,一旦开发出来,文件格式规范就可以跨程序重用,也可以用于同一程序的不同版本。

总之,我们工作的主要贡献是使灰盒模糊输入格式感知给定一个输入格式规范(例如,Peach Pit),我们的智能灰盒模糊器派生出种子文件的结构表示,称为虚拟结构,并利用我们的新智能突变操作符在生成新输入文件期间修改虚拟文件结构以及文件的位序列。我们提出了智能变异运算符,它很可能保持一个满意的w.r.t.文件格式规范。在灰盒模糊搜索过程中,我们的工具AFLSMART根据文件格式规范度量输入的有效性程度。它将有效输入优先于无效输入,使模糊器能够探索有效文件的更多突变,而不是无效文件。因此,我们的智能模糊器在很大程度上探索了根据文件格式规范有效的输入的受限空间,并试图通过在这个受限空间中运行输入来定位文件处理逻辑中的漏洞。我们对处理复杂的基于块的文件格式(如AVI和WAV)的测试对象进行了广泛的评估。我们的实验表明,我们引入的智能变异算子和基于有效性的功率调度,在24小时内的路径覆盖和发现的漏洞方面都提高了模糊处理的有效性。这些结果还表明,我们的智能模糊器AFLSMART的额外有效性并不是通过牺牲灰盒模糊和AFL的效率来实现的。

MOTIVATING EXAMPLE

2.1 The WAVE File Format

大多数文件系统将信息存储为由0和1组成的长字符串—文件程序的任务是理解这个位序列,即解析文件,并提取相关信息。这些信息通常以分层的方式构造,这要求文件包含额外的结构信息以文件格式定义相同类型文件的结构。坚持文件格式允许相同的文件由不同的程序处理。

图1:WAVE文件格式的摘录

WAVE文件(*.wav)包含音频信息,可以由各种媒体播放器和编辑器处理。一个WAVE文件由块(chunk)组成(见图1)。每个块由块标识符、块长度和块数据组成。

块以分层的方式进行结构。根块(RIFF)要求文件的前四个字节拼写RIFF(以unicode表示),后面四个字节指定子块的总大小n加上4。接下来的四个字节必须拼写(在unicode中)WAVE。WAVE文件的其余部分包含子块、强制的fmt块、几个可选块和数据块。数据块本身受到进一步的结构约束。

我们可以清楚地看到,WAVE文件将音频信息和元数据嵌入到一个分层块结构中。WAVE文件格式管理所有的WAVE文件,并允许对音频信息进行高效和系统的解析。

2.2 The Anatomy of a Vulnerability in a Popular Audio Compression Library

下面,我们将讨论我们的智能灰盒模糊器AFLSMART在WavPack中发现的一个漏洞。WavPack是一个流行的音频压缩库,许多知名的媒体播放器和编辑器都使用它,如Winamp、VLC media Player和Adobe Audition。在我们的实验中,传统的灰盒模糊器如AFL或AFLFAST无法发现相同的漏洞。

所发现的漏洞(CVE-2018-10536)是在WavPack的wave解析器组件中的缓冲区覆盖。要构造一个漏洞,需要制作一个具有多个格式块的WAVE文件,以满足几个复杂的结构条件。WAVE文件包含强制RIFF、fmt和数据块,加上位于第一个fmt块之后的附加fmt块。第一个fmt块指定IEEE 754 32位(单精度)浮点(IEEE浮点)作为波形数据格式(即fmt.wFormatTag=3)并通过所有健全检查。第二个fmt块指定PCM作为波形数据格式、一个通道、一个块对齐和一个采样位(即:fmt.wFormatTag = 1, fmt.nChannels = 1, fmt.nBlockAlign = 1,fmt.wBitsPerSample = 1)。

图2:草图 cli/riff.c @ revision 0a72951

代码解读: 检查块的头部,如果前四个字节是“fmt ”,则进入该else if分支:

                                读取数据数据以及数据的格式赋值为format,以及一个采样位的位数复制给config->bits_per_sample;

                                如果数据格式为3并且一个采样位的位数不是32位,则supported = FALSE;

                                如果 块对齐/通道数 < (采样位+7)/8,则supported = FALSE;

                                如果supported == FALSE,则退出exit();

                                如果数据格式为3,则相应地设置全局配置 config->float_norm_exp = CONFIG_FLOAT;

第一个fmt块配置WavPack以IEEE浮点格式读取数据,这需要满足一定的约束条件,例如,每个样本的比特数(图2中第6-10行)。第二个fmt块允许覆盖某些值,例如,每个样本的比特数,同时保持IEEE浮点格式配置。更具体地说,fmt处理代码如图2所示。第一个fmt块被解析为格式3 (IEEE浮点数),每个样本32位,1个通道,4块对齐(第2-4行)。配置通过了IEEE浮点格式的所有完整性检查(第6 - 10行),并相应地设置了全局配置(第11行)。第二个fmt块被解析为格式1 (PCM)、每个样本1位、1通道和1块对齐(第2-4行)。如果WavPack没有维护IEEE浮点作为波形数据并重置了float_norm_exp,则新的配置将有效。然而,它确实维护IEEE浮点数,因此允许一个无效的配置,否则将无法通过完整性检查,最终导致缓冲区覆盖,可以被攻击者控制。

当*.wav文件包含多个fmt块时,通过中止修补该漏洞。发现了类似漏洞(CVE-2018-10537),并对文件*进行了修补。w64 (WAVE64)文件。

2.3 Difficulties of Traditional Greybox Fuzzing

我们利用这些漏洞来说明传统灰盒模糊的缺点。算法1,给出了一般的灰盒模糊循环。该模糊器提供一组称为种子语料库的初始程序输入。在我们的示例中,这可能是一组我们知道是有效的WAVE文件。灰盒模糊器在一个连续的循环中对这些种子输入进行突变,以生成新的输入。任何增加覆盖率的新输入都被添加到种子语料库中。一个著名的和非常成功的覆盖灰盒模糊是American Fuzzy Lop(AFL)。

算法1

 种子语料库S,选择一个种子s,并对其分配能量p(理解为变异次数),对s使用某种变异策略得到输入s',如果执行输入s'造成了被测程序崩溃,或这发现了新的边(提高覆盖率)被认为是“有趣的”输入,那么我们将输入s'保留为一个新种子放入种子语料库S中;重复上述操作直到时间到或者人为打断测试。

Guidance.基于覆盖的灰盒模糊器(CGF)由搜索策略和能量调度所指导。搜索策略决定了从种子语料库中选择种子的顺序,在算法1的CHOOSENEXT(行2)中实现。能量调度决定了种子的能量,即通过模糊种子产生多少输入(变异多少次),并在ASSIGNENERGY(行3)中实现。例如,AFL在模糊执行速度快的小种子上花费更多的能量。

Bit-Level Mutation.传统的灰盒模糊器不知道输入结构。为了生成新的输入,根据预先定义的变异运算符对种子进行修改。变异运算符是一种转换规则。

例如,位翻转运算符将输入对应的二进制串中的0变为1,反之亦然。给定一个种子输入,在种子输入中随机选择一个突变位点,并应用一个突变算子生成一个新的测试输入。在算法1中,MUTATE_INPUT方法通过种子突变实现输入生成。这些变异操作符在位级上指定。例如,AFL有几个删除操作符,它们都删除种子文件中一个连续的、固定长度的位序列。AFL还有几个加法操作符,例如添加一个只有0或1的序列,一个随机的位序列,或者在文件中复制一个位序列。对于我们的示例,图3显示了规范WAVE文件的前72个字节。要暴漏漏洞CVE-201810536,必须在现有的fmt和数据块之间添加第二个有效的fmt块。显然,AFL不太可能通过这种位级突变操作 来导致向文件中 插入此类额外有效块

Dictionary.为了更好地促进结构化文件的模糊化,许多greybox模糊器(包括AFL)允许指定一个有趣的字节序列列表,称为字典。在我们的示例中,这样的字节序列可以是单词(如RIFF、fmt)和unicode中的数据,也可以是公共值(如十六进制中的22050和88200)。然而,对于构造插入在其他两个块之间的有效块这样的复杂任务,字典不会有太大贡献

图3:规范的WAVE文件

SMART GREYBOX FUZZING

智能灰盒模糊比智能黑盒模糊和传统灰盒模糊两者都更有效。与传统的灰盒模糊不同,SGF允许深入到接受高度结构化输入的程序中,而不会陷入程序解析器代码中。与智能黑盒模糊不同,SGF利用覆盖信息和能量调度来更有效地探索程序的行为。

3.1 Virtual Structure

SGF的有效性来自于其智能变异算子(操作)的精心设计。首先,这些操作符应该充分利用从种子输入中提取的结构信息在块级和位级应用高阶操作。其次,它们应该是统一的操作符,以支持所有基于块的文件格式(如MP3、ELF、PNG、JPEG、WAV、AVI、PCAP)。最后但并非最不重要的是,所有这些变异操作符都必须是轻量级的,这样我们才能保持灰盒模糊的效率。

为了实现这三个设计原则,我们引入了一种新的轻量级通用数据结构,即虚拟结构,它可以方便地进行结构变异操作。每个输入文件都可以表示为一个(解析)树。树的节点称为块(chunk)或属性(attribute),块是树的内部节点,属性是树的叶节点。

块是文件中连续的字节序列。有一个根块跨越整个文件。如图4所示,每个块都有一个开始索引和一个结束索引,表示文件中字节序列的开始和结束,以及表示与其他块的区别的类型(例如,fmt块不同于WAVE文件格式的数据块)。每个块可以有零个或多个块作为子块,以及零个或多个属性。属性表示文件中与结构无关的重要数据,例如WAVE文件的fmt块中的wFormatTag。

图4:AFLSMART使用的虚拟结构

 作为一个例子,图3中的规范WAVE文件具有以下虚拟结构。根块有开始和结束索引{0,2083}。根块(riff)有三个属性,即ckID、cksize和WAVEID,以及两个索引分别为{12,35}和{36,2083}的子块。第一个子块fmt有八个属性,分别是ckID, cksize, wFormatTag, nChannels, nSamplesPerSec, nAvgBytesPerSec, nBlockAlign和wBitsPerSample。

为了构造虚拟结构,需要一个文件格式规范和一个解析器给定规范和文件,解析器构造虚结构。例如,Peach有一个名为File Cracker的健壮的解析器组件。给定一个输入文件和文件格式规范Peach Pit,我们的File Cracker扩展精确地解析和分解文件块和属性,并提供边界索引和类型信息。清单1显示了WAV文件格式的Peach Pit代码片段。在这个规范中,我们可以指定有效的WAV文件中的块和属性的顺序、类型、结构。在第4节中,我们将解释如何构建此规范。

清单1

3.2 Smart Mutation Operators

基于该虚拟输入结构,定义了3种通用的结构变异算子——智能删除、智能添加和智能拼接。

 Smart Deletion.(删?)给定一个种子文件s,选择一个任意块c并删除它。SGF将所选要删除块c的结束索引后面的字节复制到c的开始索引,并相应地修改所有受影响块的索引。例如,要删除规范的WAVE文件中的fmt-chunk,存储在索引范围[36,2083]中的比特被复制到索引12。对新WAVE文件虚拟结构中的索引进行了修改。例如,riff-chunk的结束索引被修改为2048。

C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1.

 Smart Addition.(增?)给定种子文件s1,任意选择第二个种子文件s2,在s2中选择任意块c2,并将其添加到s1中任意现有块c1之后,该块c1的前驱块类型与c2相同(即c1.parent.type==c2.parent.type)。SGF将c1的结束索引后面的字节复制到一个新索引中,其中新块c2的长度被加到给定种子文件s1中c1的当前结束索引中。然后,SGF将第二个种子文件s2中c2的起始索引和结束索引之间的字节拷贝到给定种子文件s1中现有块c1的结束索引。最后,在表示生成的输入的虚拟结构中修改所有受影响的索引

 Smart Splicing.(改?)给定一个种子文件s1,在s1中任意选择一个块c1,在任意选择的第二个种子文件s2中任意选择一个块c2,使c1和c2的类型相同,用c2替换c1。SGF将c1的结束索引之后的字节复制到一个新索引中,新块c2的长度被加到给定种子文件s1中c1的当前结束索引中。然后,SGF将第二个种子文件s2中c2的起始和结束索引之间的字节复制到给定种子文件s1中现有块c1的结束索引中。最后,在表示生成的输入的虚拟结构中修改所有受影响的索引。

Maintaining Structural Integrity.(保持结构完整性)现有位级变异操作的一个关键挑战是保持生成输入的结构完整性。这主要通过结构变异操作来解决。然而,不能保证我们的结构变异操作保持结构的完整性。例如,在我们的示例中,Peach Pit格式规范可能允许添加或删除fmt块,而严格地说,正式的WAVE格式规范只允许一个fmt块。然而,它是我们宽松的规范,因为找到漏洞才是我们的首要目标(为了暴露漏洞,它需要两个fmt块存在)。此外,不可变属性的规定允许智能灰盒模糊器仅对可变属性的索引应用位级变异操作。严格执行结构完整性并不总是理想的,高度的有效性是解析器代码之外所必需的。案例研究表明,这种松弛是我们轻量级虚拟结构设计的关键优势。

Maintaining Semantic Integrity.(保持语义完整性)任何变异模糊器的第二个关键挑战是维护数据字段之间的隐式约束(语法问题?)。修改一个数据字段中的字节数可能需要智能地修改另一个字段的字节数,例如在该数据字段上计算的校验和。智能灰盒模糊测试可以通过几种方式解决这个问题首先,在插入的片段中维护这样的隐式约束。Holler等人在开发一种智能的突变黑盒模糊器LangFuzz时也做了类似的观察。其次,一些约束(如校验和)可以在后验修复(例如使用Peach fixups)。然而,没有通用的解决方案来修复由于数据字段之间的未知或破坏的隐式约束而损坏d 生成文件。

3.3 Region-Based Smart Mutation(基于区域的智能突变)

在智能变异过程中,通过对所选种子文件应用结构和简单变异运算符来生成新的输入(参见算法1中的MUTATE_INPUT)。下面我们讨论智能变异的挑战和机遇。

3.3.1 Stacking Mutations

为了生成有趣的测试输入,可能同时应用几个结构(高级别)和位级(低级别)突变操作符。在基于突变的模糊处理中,这种情况被称为叠加。位级突变操作符可以很容易地按任意顺序堆叠,只知道文件的开始和结束索引。当长度为x的数据被删除时,我们从结束索引中减去x。当添加长度为x的新数据时,我们将x增加到结束索引中作为新文件的新的结束索引。

然而,结构突变运算符的叠加并非易事。对于每个结构突变,文件本身和表示文件的虚拟结构都必须一致地更新。例如,删除一个块将影响它所有前驱块的结束索引,以及被删除块“右边”的每个后驱块的索引(例如,起始索引大于被删除块的结束索引的块)。我们的实现AFLSMART复制了种子的虚拟结构,并通过对虚拟结构和文件本身一致地应用它们来堆叠突变操作符。这允许我们堆叠结构(高级)突变操作符。此外,如果位级(低级)突变将跨越块边界,则不应用该突变

3.3.2 Fragment- and Region-Based Mutation(基于片段和区域的突变)

在实现堆叠突变之后,我们观察到许多输入被添加到种子语料库中,这些输入与格式规范相比是无效的。AFLSMART使用该规范将有效文件拆分成片段。这些片段是文件解析树中的一个子树。这些片段可以按照3.2节的描述进行添加、删除和替换。然而,大多数新添加的种子不能被成功解析。没有成功的解析,就没有解析树。基于片段的智能灰盒模糊测试很快退化为一个愚蠢的灰盒模糊测试器。 

我们使用通过解析器的解析表返回的区域来解决这个挑战区域是文件中与规范中的数据块或属性相关联的连续字节序列。如果文件损坏,解析器将在某一点上失败。在此之前,可以派生出遵循规范的区域。为了填充我们的虚拟结构,AFLSMART使用Peach Cracker组件中的parse表来为每个块和属性派生开始和结束索引以及类型。

3.3.3 Deferred Parsing(延迟解析)

在实验中,我们观察到为种子输入构建虚拟结构会产生大量成本。基于覆盖率的灰盒模糊测试的根本在于其效率。生成和执行一个输入只需几毫秒的时间。然而,我们观察到解析一个输入通常需要数秒的时间。例如,构建一个218字节的PNG文件的虚拟结构需要2到3秒。如果SGF为发现的每个种子输入构建虚拟结构,那么尽管SGF很“聪明”,但它可能很快落后于传统的灰盒模糊测试。

为了克服这一可扩展性的挑战,我们开发了一种称为延迟解析的方案,它极大地提高了我们的工具AFLSMART的可扩展性。我们以一定的概率p构建种子输入的虚拟结构,该概率p取决于发现新路径的当前时间。设t为自最后一次发现新路径以来的时间。设s是灰盒模糊测试算法1的第2行中CHOOSENEXT选择的当前种子,并假设s的虚拟结构尚未构建。给定阈值 \large \epsilon ,我们计算概率\large prob_{virtual}(s)来构建s的虚拟结构

\LARGE prob_{virtual}(s)=min(\frac{t}{\epsilon},1)

换句话说,为种子s构建虚拟结构的概率\large prob_{virtual}(s)随着距离最后一次发现新路径的时间t的增加而增加。一旦 \large t\geq \epsilon,则有\large prob_{virtual}(s)=100%

我们的延迟解析优化受到以下直觉的启发。如果没有AFLSMART中的输入感知灰盒模糊,AFL可能会生成许多无效输入,这些输入在应用程序中重复遍历几条短路径(通常是由于某些解析错误导致拒绝输入的程序路径)如果产生更多这样的无效输入,那么t的值(从最后一次发现新路径到现在的时间)将会增加。一旦增长超过阈值,我们允许AFLSMART构建虚拟结构。然而,如果正常的AFL正在设法生成仍然可以遍历新路径的输入,t将保持较小,我们将不会产生创建虚拟结构的开销。因此,延迟解析优化允许AFLSMART在不牺牲AFL效率的情况下实现输入格式感知

3.4 Validity-Based Power Schedule(基于有效性的能量调度)

能量调度决定了在基于覆盖率的灰盒模糊期间分配给给定种子的能量。一个种子的能量决定了当它下一次被选择时,模糊该种子所花费的时间(即种子的变异次数)(参见算法1中的ASSIGNENERGY)。在本文中,我们提出了几种能量调度。AFL的原始能量调度将更多的能量分配给后来发现的执行时间较短的较小种子。AFLFAST基于梯度下降的功率调度将更多的能量分配给运行低频路径的种子。

在下面,我们定义了一个简单的基于有效性的能量调度。按照惯例,有效性被认为是一个布尔变量:要么种子有效,要么无效。但是,我们建议将有效性作为一个比率来考虑:一个文件在一定程度上是有效的。种子s的有效程度\large v(s)由构造虚拟结构的解析器决定。如果所有的文件都能被成功解析,则有效程度为\large v(s)=100%。如果只有65%的s可以被成功解析,那么它的有效性是\large v(s)=65%部分有效的文件的虚拟结构也只是部分构造。对这个部分结构,添加了一个块,它跨越了文件不可解析的其余部分。

给定种子s,基于有效性的能量调度\large p_{v}(s)分配的能量如下所示:

 其中\large p(s)是传统灰盒模糊器(特别是AFL)的原始能量调度分配给种子s的能量,U是AFL可以分配的最大能量。这个能量调度实现了一个爬坡的元启发式算法,总是 为至少50%有效,且原始能量\large p(s)最多为最大能量U的一半 的种子分配两倍的能量。

基于有效度的能量调度将更多的能量分配给有效度较高的种子。首先,结构变异算子的效用随着有效性的增加而增加。第二,希望从已经有效的输入中生成更多有效的输入。基于有效性的能量调度实现了爬坡元启发式,其中搜索遵循梯度下降。有效度高的种子总是比有效度低的种子被分配到更高的能量

4  FILE FORMAT SPECIFICATION 文件格式规范

文件格式规范的质量对智能灰盒模糊测试的效果和效率至关重要然而,手工构建这种高质量的高结构和复杂的文件格式的规范是费时且容易出错的。该文分析了180种最常见的文件类型,重点分析了文档、视频、音频、图像、可执行文件和网络数据包文件。我们阅读了他们的规范(如果可用的话),或使用解析工具来识别这些文件的结构,并找到了关键的见解,用户可以根据这些见解以系统的方式编写规范。这些关键见解解释了文件格式的常见结构。另一方面,它们也揭示了数据模型的完整性和精确性与智能灰盒模糊测试的成功与否之间的关系

 4.1 Insight-1. Chunk Inheritance  见解1,块继承

大多数文件格式由数据块组成,数据块通常共享一个公共结构就像Java和其他面向对象编程语言(如c++和c#)中的抽象类一样,要编写输入规范,我们首先要建模一个通用块,其中包含文件格式中所有块 共享的属性 。然后,我们为具体块建模,这些具体块从通用块继承属性。因此,我们只需要插入/修改特定块的属性。

清单2和3展示了如何将块继承应用于WAVE音频文件格式的输入规范的示例清单2中的通用块模型指定每个块都有其块标识符、块大小和块数据,其中块大小限制了块数据的实际长度。此外,每个块可以在末尾填充字节,以使其字(2个字节)对齐清单3显示了格式块(WAVE文件中的一个特定数据块)的模型,它继承了通用块的块大小和填充属性。它只对特定块的属性建模,比如字符串标识符和存储在数据中的内容。

清单2
清单3

 人们通常很担心,他们需要花大量时间阅读文件格式的标准规范(可能长达数百页)来理解这种高级的分层块结构。然而,我们发现有一些十六进制编辑器工具,如010Editor,它可以检测文件格式,并快速将示例输入文件分解为具有所有属性的块。该工具目前支持114种最常见的文件格式(例如,PDF, MPEG4, AVI, ZIP, JPEG)[37]。

图5是显示WAVE文件的010Editor的截图。屏幕的顶部以十六进制和ASCII模式显示原始数据。底部是分解后的组件,包括块的头部和块的数据。

图5 使用010Editor分析文件结构

 4.2 Insight-2. Specification Completeness  规范的完整性

如第3节所述,智能灰盒模糊支持工作在块级别的结构突变操作符。因此,我们不需要指定块中的所有属性。我们可以从粗粒度的规范开始,然后逐渐使其更完整。清单4显示了格式块的简化定义,其中我们只指定块标识符,而不定义其数据中的子属性。块数据被认为是一个“blob”,它可以包含任何东西,只要它的大小与块大小一致。

清单4

 基于这一关键洞察和洞察-1,可以快速编写简短而精确的文件格式规范。如第5节所示,WAVE文件格式的规范可以用82行编写,而PCAP网络流量文件格式的规范可以只用24行编写。这两个规范帮助智能灰盒模糊发现了许多其他基线技术无法发现的漏洞。

4.3 Insight-3. Relaxed Constraints 宽松的限制

在数据块中可能有很多约束(例如,数据块标识符必须是一个常量字符串,数据块大小属性必须与实际大小匹配,或者数据块必须按顺序排列)。然而,由于模糊化或压力测试的主要目标通常是探索极端情况,所以我们应该放松一些约束,只要这些放松的约束不阻止解析器分解文件。清单5显示了WAVE文件格式的定义。当我们使用Choice元素来指定潜在块的列表(包括强制块和可选块)时,许多约束都被放宽了。首先,数据块可以以任何顺序出现。其次,某些块(包括强制块)可能会缺失。第三,可能会出现一些未知的块。最后,一些块可以出现多次。事实上,由于这个宽松的模型,像我们的论文(第2节)中的示例中的漏洞可能会暴露出来。

清单5

4.4 Insight-4. Reusability  可重用性

与特定于程序且很难重用的程序行为规范不同,文件格式规范可以用来模糊所有采用相同文件格式的程序。我们相信,发现新漏洞的好处远远超过编写输入规范的成本。在第5节和第6节中,我们展示了我们的智能灰盒模糊工具使用了10种流行的文件格式(PDF、AVI、MP3、WAV、JPEG、JPEG2000、PNG、GIF、PCAP、ELF)的规范,发现了严重模糊的现实世界软件包中的40多个漏洞。值得注意的是,基于我们提出的关键见解,我们中的一人只花了五(5)个工作日就完成了这10个规范。

5 EXPERIMENTAL SETUP  实验设置

为了评估智能灰盒模糊的有效性和效率,我们进行了一些实验。我们通过扩展现有的灰盒模糊器AFL来实现我们的技术,并将我们的智能灰盒模糊器称为AFLSMART。为了研究输入结构感知是否确实提高了灰盒模糊器的漏洞发现能力,我们将AFLSMART与两种传统灰盒模糊器AFL和AFLFAST进行了比较为了研究智能黑盒模糊器(给定相同的输入模型)是否能够实现类似的漏洞发现能力,我们将AFLSMART与智能黑盒模糊器Peach进行了比较。

我们还将AFLSMART与VUZZER进行了比较。VUZZER的目标类似于AFLSMART,它试图解决结构化文件格式的挑战,以进行灰盒模糊测试,但没有输入规范,使用污点分析和控制流分析

5.1 Research Questions

RQ-1:智能灰盒模糊是否比传统灰盒模糊更有效? 具体来说,我们研究AFLSMART是否比AFL/AFLFAST在24小时内发现更多的独特bug,以及在没有bug的情况下,AFLSMART在给定时间内是否比AFL/AFLFAST获得更高的分支覆盖率。

RQ-2:智能灰盒模糊是否比智能黑盒模糊更有效? 具体来说,我们将调查AFLSMART是否在24小时内发现比Peach更多的独特bug,以及在没有bug的情况下,在给定的时间预算中,AFLSMART是否比Peach获得了更高的分支覆盖率。

RQ-3:突变叠加有助于智能灰盒模糊的有效性吗? 具体来说,我们比较了AFLSMART在两种情况下实现的分支覆盖——有叠加突变和没有叠加突变。

RQ-4:智能灰盒模糊比基于污点分析的灰盒模糊更有效吗? 具体来说,我们调查了Vuzzer和AFLSMART各自和一起发现的独特bug的数量。

5.2 Implementation: AFLSMART  AFLSMART的实现

AFLSMART通过添加和修改四个组件来扩展AFL,文件破解器,结构收集器,能量计算器和模糊器本身。整体架构如图6所示。

图6  AFLSMART的结构

AFLSMART File Cracker解析输入文件并将其分解为数据块和数据属性它还根据可解析文件的多少计算输入文件的有效性(以确定为该种子分配的能量)。在这个原型中,我们通过修改智能黑盒模糊桃的Cracker组件来实现文件破解,它完全支持高度结构化的文件格式,如PNG, JPEG, GIF, MP3, WAV和AVI。值得注意的是,我们只使用和修改Peach的File Cracker组件来解析(即破解)种子语料库。AFLSMART没有集成Peach的模糊逻辑或变异运算符。我们的智能变异操作是在AFL的基础上设计和实现的。

AFLSMART结构收集器(collector)连接核心AFLSMART模糊器(fuzzer)和文件破解组件。当Fuzzer请求当前输入的结构信息以支持其操作(例如,智能突变)时,它将输入传递给结构收集器以收集有效性和分解的块和属性。该组件提供了一个通用接口来支持所有的文件破解程序——我们当前的基于Peach的文件破解程序和新的文件破解程序。还值得注意的是,AFLSMART Fuzzer只收集这些信息一次,并将它们保存起来供将来使用。

AFLSMART Energy Calculator 实现了在第3节中讨论的基于有效性的能量调度。因此,AFLSMART将更多的能量分配给语法更有效的输入。具体来说,我们对AFLSMART的calculate_score函数应用了一个新的公式。

AFLSMART Fuzzer包含最关键的变化,使AFLSMART有效。在该组件中,我们设计并实现了以层次结构表示输入格式的虚拟结构。基于这个核心数据结构,实现了所有工作在块级别的AFLSMART突变操作。我们还修改了AFL的fuzz_one函数,以支持我们的重要优化——延迟解析和堆叠突变(第3节)。

注意,我们的更改不会影响AFL的插桩组件。因此,我们可以使用AFLSMART来模糊化程序二进制文件,只要二进制文件是使用DynamoRio之类的工具进行插桩的,而且插桩的代码可以由AFL处理。针对Windows二进制文件的WinAFL工具实现了这种二进制模糊测试方法。AFLSMART可以很好地与这种二进制模糊工具一起工作。

..... 实验太多了 不想看了

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值