Smart Greybox Fuzzing

摘要

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

亮点:AFLSMART将Peach的输入结构组件与AFL的覆盖反馈组件集成在一起。

背景

与CGF相比,智能黑盒模糊器[19]、[47]已经能够感知输入结构,并利用文件格式的模型从现有有效文件构建新的有效文件。例如,Peach[47]使用一个输入模型来分解有效文件,并将它们重新组装为新的有效文件,删除块,并修改重要的数据值。LangFuzz[19]利用上下文无关的JavaScript (JS)语法从JS文件中提取代码片段,并将它们重新组装成新的JS文件。然而,仅对输入结构的认识是不够的,而且我们迫切需要灰盒模糊器的覆盖反馈——正如我们在Peach上的实验所显示的那样。在我们的实验中,Peach的表现甚至比AFL(我们的基线灰盒模糊器)还要差。我们的详细调查显示,Peach并没有重用生成的输入,而这些输入可以提高进一步测试输入生成的覆盖率。例如,如果Peach生成了一个带有不同(有趣的)通道数量的wave文件,这个文件不能被用来生成带有新发现的程序行为的进一步的wave文件。没有覆盖-反馈,有趣的文件将不会被保留以作进一步的模糊处理。另一方面,保留所有生成的文件并不经济。
在本文中,我们引入了智能灰盒模糊(SGF)——它利用种子文件的高级结构表示来生成新文件——并研究了它对模糊器效率和可用性的影响。我们定义了创新的突变操作符,它们在文件的虚拟结构上工作,而不是在位级别上工作。这些结构突变操作允许SGF探索全新的输入域,同时保持生成文件的有效性。我们解决了为部分有效的种子输入(即不完全遵守所提供的语法的文件)启用结构突变的挑战。我们引入了一种基于新颖度的功率调度,该调度将更多的能量分配给具有更高效度的种子。这种安排使SGF能够花费更多的时间生成更有可能通过程序解析阶段的文件,从而发现程序处理逻辑中更深层次的漏洞。
我们实现了AFLSMART,一个基于AFL(一个流行且非常成功的CGF)的强大而高效且易于使用的智能灰盒模糊器。aflsmart将Peach的输入结构组件与AFL的覆盖反馈组件集成在一起。aflsmart适用于所有遵循树结构的复杂文件格式,其中单个节点称为数据块。这种基于块的格式是很普遍的,即,最常见的文件格式是基于块的1和重要的,即,因为基于块的文件格式被用作机器之间交换数据的最流行的手段,它们形成了一个常见的攻击向量来危害软件系统。
我们的评估表明,在给定的24小时内,AFLSMART可以将零日发现的bug翻倍。aflsmart发现33个错误(13个cve分配),而基线(AFL及其扩展AFLFAST[4])只能检测16个错误,在大型、广泛使用和模糊的开源软件项目中,如FFmpeg、LibA V、LibPNG、WavPack、OpenJPEG和Binutils。与基线相比,aflsmart还显著提高了分支覆盖率高达87%。aflsmart在基准上也优于VUZZER[32];AFLSMART发现了vuzzer在另一组流行的开源程序(如tcpdump,tcptraceandgif2png)中找不到的7个bug。此外,在为期一周的FFmpeg bug搜索活动中,aflsmart发现了9个零日bug(分配了9个cve)。它的有效性带来了微不足道的开销——通过我们对延迟破解的优化,aflsmart实现了与AFL类似的执行速度。
在我们使用AFLSMART的经验中,编写文件格式规范所花费的时间被行为覆盖率和暴露的bug数量的巨大改进所抵消。我们中的一个人花了5个工作日来开发10个文件格式规范(如Peach Pits[47]),用于模糊所有16个主题程序。因此,一旦开发出来,文件格式规范就可以重用跨程序以及同一程序的不同版本。
总之,我们工作的主要贡献是使灰盒模糊化输入格式可感知。给定一个输入格式规范(例如,一个Peach Pit [47]),我们的智能灰盒模糊器派生出种子文件的结构重复,称为虚拟结构,并利用我们新颖的智能突变运算符在生成新输入文件期间修改虚拟文件结构以及文件的位序列。我们提出了智能突变运算符,这些运算符可能会保留对文件格式规范的满意度。在灰盒模糊搜索期间,我们的工具 AFLSMART 会测量相对于文件格式规范生成的输入的有效性程度。它使模糊测试器能够探索有效文件的更多突变,而不是无效文件的更多突变,从而将有效输入优先于无效输入。因此,我们的智能模糊测试器在很大程度上探索了根据文件格式规范有效的输入的受限空间,并尝试通过在此受限空间中运行输入来定位文件处理逻辑中的漏洞。我们对处理复杂的基于块的文件格式(如AVI和WAV)的经过充分测试的主题进行了广泛的评估。我们的实验表明,智能突变算子和我们引入的基于有效性的功率调度,在路径覆盖和24小时内发现的漏洞方面提高了模糊测试的有效性。这些结果还表明,我们的智能模糊测试器AFLSMART的额外有效性不是通过牺牲灰盒模糊测试和AFL的效率来实现的。

智能灰盒模糊测试

虚拟结构

在这里插入图片描述
图 4:AFLSMART使用的虚拟结构
为了实现这三个设计原则,我们引入了一种新的轻量级但通用的数据结构,即 虚拟结构 ,它可以促进结构突变运算符。每个输入文件都可以 表示为一个(解析)树。此树的节点称为块或属性, 块 是树的内部节点, 属性 是树的叶节点。
块是文件中连续的字节序列。有一个跨越整个文件的根块。如图 4 所示,每个块都有一个开始和结束索引,表示文件中字节序列的开始和结束,以及一个表示对其他块的分歧的类型(例如,fmt 块不同于WAVE文件格式的数据块)。每个块可以有零个或多个块作为子块,以及零个或多个属性。属性表示文件中不相关的重要数据,
图 3 中的规范 WAVE 文件具有以下虚拟结构。根块具有开始和结束索引 {0,2083}。根块(riff)有三个属性,即ckID、cksize和WAVEID,以及两个索引分别为{12,35}和{36,2083}的子区块。第一个子fmt 有八个属性,分别是 ckID 、cksize 、wFormatTag、n 通道、nSamplesPerSec、nAvgBytesPerSec、nBlockAlign 和 wBitsPer Sample。
在这里插入图片描述
File Cracker组件的代码可见于peach-3.0.202.patch。根据在smart-chunks.h中的声明,块内数据域包含id、类型、起始字节偏移、末尾字节偏移、修改标志位,指针域包含同级块、后继块指针:

struct chunk {
   
  unsigned long
      id; /* The id of the chunk, which either equals its pointer value or, when
             loaded from chunks file, equals to the hashcode of its chunk
             identifer string casted to unsigned long. */
  int type;                /* The hashcode of the chunk type. */
  int start_byte;          /* The start byte, negative if unknown. */
  int end_byte;            /* The last byte, negative if unknown. */
  char modifiable;         /* The modifiable flag. */
  struct chunk *next;      /* The next sibling child. */
  struct chunk *children;  /* The children chunks linked list. */
};

由上可知,chunk在数据结构的层面上其实就是一个二叉树的节点。
要构造虚拟结构,需要文件格式规范和解析器。给定规范和文件,解析器构造虚拟结构。例如,Peach [47]有一个名为File Cracker的强大解析器组件。给定一个名为Peach Pit的输入文件和文件格式规范,我们的文件破解程序扩展名精确地解析文件并将其分解为块和属性,并提供边界索引和类型信息。清

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值