VUzzer:Application-aware Evolutionary Fuzzing

摘要

Fuzzing是一种有效的软件测试技术,用于查找漏洞。

考虑到实际应用程序的大小和复杂性,现代模糊器往往是可扩展的,但在探索执行更深层次的错误或者能够在应用程序中深入渗透方面不具有可扩展性。

在本文中,我们提出了一种应用程序感知的进化模糊测试策略,它不需要任何有关应用程序或输入格式的先验知识。为了最大化覆盖范围并探索更深入的路径,我们利用基于静态和动态分析的控制和数据流特征来推断应用程序的基本属性。与应用程序无关的方法相比,这可以更快地生成有趣的输入。

我们在VUzzer中实现我们的模糊测试策略并在三个不同的数据集上进行评估:DARPA Grand Challenge二进制文件(CGC),一组实际应用程序(二进制输入解析器)和最近发布的LAVA数据集。在所有这些数据集中,通过快速查找几个现有和新的错误,VUzzer产生的结果明显优于最先进的模糊器。

1.简介

fuzzer会盲目地改变值以生成新的输入常常是无效输入。

AFL使用基于覆盖率引导的进化算法来操作有效的输入生成。虽

  • 无法有效地从发现的路径中选择最有希望的输入进行变异。
  • 对输入进行变异还需要回答两个问题:在哪里进行变异(输入中的偏移量)和使用什么值进行变异?
  • AFL采用盲变异策略,通过生成大量的变异输入,凭运气探索新的覆盖。慢

作者提出了VUzzer工具,使用了静态分析和动态污点分析的方法改进输入生成,在一定程度上解决了上述问题的同时尽可能少地引入额外开销。

贡献:

  • 提出应用感知变异策略改进了最新模糊器(如AFL)的输入生成过程。
  • 提出了几个应用特性来支持有意义的输入变异。
  • 在三个不同的数据集上评估了VUzzer,一个实现了我们的方法的全功能模糊器,并表明它是非常有效的。
  • 开源

2.背景

2.1 fuzzing

在输入变异方面,fuzzer可分为白盒、黑盒和灰盒。白盒fuzzer假定可以访问应用程序的源代码,使其能够执行高级程序分析,以便更好地了解输入对执行的影响。黑盒fuzzer无法访问应用程序的内部。灰盒fuzzer基于访问应用程序二进制代码的轻量级程序分析(主要是监视)。

输入增益(IG)被定义为输入通过执行新的基本块或增加先前执行的基本块的频率(例如,循环执行)来发现新路径的能力。

生成非零IG输入需要在第一节中解决我们的两个问题(在哪里和什么地方进行变异)。

VUzzer是一种基于覆盖的灰盒模糊器。

2.2 问题

在这里插入图片描述

传统fuzzer例如AFL由于对程序了解不够,经常会面临以下几个问题:

  1. magic bytes比较问题:

如上图第11行,由于AFL对程序缺乏了解,在遇到magic bytes比较时只能通过随机的方式进行爆破,大大降低了效率。进一步地,由于AFL是基于basic block覆盖进行反馈,如果AFL遇到了strcmp magic bytes比较,即使在随机突变过程中输入中的一个或多个bytes匹配上了magic bytes,但是只要没有全部匹配就不会覆盖到新的basic block。对于长度为4的magic bytes,AFL理论上需要随机突变256^4次才能匹配上,才能进一步触发更深的逻辑。

例如第11行需要正确的字节+正确的值,即使都生成对了,也有可能被之后的随机变异破坏。

  1. 难以触发深层逻辑

AFL的输入选择策略不能非常好地保留到达了更深层次逻辑的输入,使得生成的输入较难到达比较深的代码逻辑。

嵌套条件语句

  1. 错误处理代码的解决

如上图的14行,20-22行,25-27行。程序中的错误处理是非常常见的,但这部分代码往往没有太多的fuzz价值。另一方面,AFL随机生成的输入往往有非常大的概率触发错误处理分支,使得后续的fuzz都在这里面进行,因此在输入选择时最好能避免掉这部分输入。

3.方法

为了解决这部分问题,作者使用了动态污点分析的方法,来找出输入中与magic bytes比较相关的部分,同时给basic block分配权重,从而能够保留触发深层逻辑的输入和避免触发错误处理代码。

VUzzer工具的工作流程图如下,与AFL相比主要区别在于fuzz前的静态分析阶段、输入选择时的加入的权重和fuzz时的动态污点分析,其中污点分析阶段中得到的信息会反馈给输入选择阶段,以改善输入选择和突变策略:

在这里插入图片描述

3.1 特征

数据流特征

数据流特征提供有关应用程序中输入数据和计算之间关系的信息。 VUzzer使用诸如污点分析之类的众所周知的技术来提取它们,并使用它们根据输入中某些偏移处的数据类型来推断输入的结构。例如,它通过检测x86 ISA的cmp系列的每个指令来确定分支的字节(“分支约束”),以确定它使用哪些输入字节(偏移)以及它与哪些值进行比较。通过这种方式,VUzzer可以确定哪些偏移对于变异感兴趣以及在这些偏移处使用哪些值(在第I部分中提供问题的部分答案)。 VUzzer现在能够通过更频繁地定位此类偏移并通过在这些偏移处使用预期值来满足分支约束来更明智地进行变异。这样做可以解决魔术字节的问题,而无需使用符号执行。

同样,VUzzer监视lea指令以检查索引操作数是否被污染。如果是这样,它可以确定相应偏移处的值是int类型并相应地改变输入。除了这两个简单但功能强大的特征外,还有许多其他功能。

控制流特征

控制流特征允许VUzzer推断某些执行路径的重要性。例如,图2显示了清单3中代码的简化CFG。执行错误块的输入通常是不感兴趣。因此,识别这样的错误处理块可以加速感兴趣输入的生成。我们将在以下部分中展示如何检测错误处理代码。目前,我们假设我们可以启发式地识别包含错误处理程序的基本块。

另一个例子涉及嵌套块的可达性。到达块F的任何输入更有可能比到达块H的输入更深入到代码中,因为后者不是嵌套的。我们使用控制流特征来对路径进行去优先级和优先级排序。由于枚举应用程序中的所有可能路径是不可行的,我们通过为各个基本块分配权重来实现此度量。具体而言,作为错误处理代码一部分的基本块获得负权重,而难以到达的代码区域中的基本块获得更高权重。

在这里插入图片描述

3.2 静态分析阶段

静态分析阶段中,VUzzer首先构造程序的控制流图以拿到每个basic block的深度信息供输入选择阶段中为basic block分配权重。另一方面,VUzzer静态地找出所有的cmp和lea指令,以便动态运行时进行插桩。cmp指令用来找出magic bytes,lea指令用来判断输入的类型信息。

权重:计算到达函数中每个基本块b的概率$p_b$。然后我们计算每个基本块b的权重$w_b$$1 /p_b$

3.3 输入选择阶段

为了能够保留优质输入,VUzzer为每个basic block分配了权重,并将一个输入的权重近似地定义为其经过的basic block的总权重。

首先,basic block的权重要体现到达它的难易程度。通过静态分析得到的深度信息,VUzzer计算了到达其的概率:以图3为例(与图1中的代码相对应),VUzzer认为经过每个分支的两个basic block都有50%的概率到达,以此类推一直向下计算,每个basic block的权重即为1/到达它的概率。

另外,VUzzer需要尽可能地过滤掉那些触发了错误处理分支的输入,因此需要给那些错误处理的basic block负权重。为了找出错误处理分支的basic block,如果VUzzer随机生成的输入的每次执行中存在并且它不存在于正常输入覆盖的basic block中,则假定这样的基本块是错误处理基本块(即,属于错误处理代码)。这个过程是增量进行的,从而能够覆盖到更多的error handling block。

最后,在选择输入进行fuzz时,权重更高的输入会被优先考虑。

3.4 突变阶段

VUzzer根据一组合法的输入,通过Crossover和Mutation两种策略对其进行突变。其中,Crossover交叉:交叉是一种简单的操作,其中从前一代中选择两个父输入,并生成两个新的子输入。

而Mutation则分为4步,

  1. 是随机修改非magic bytes的位置(magic bytes位置的判断在动态污点分析阶段),
  2. 是对于确定了类型为数字的位置(确定的过程在fuzz阶段)将其修改为一些特殊数字,例如0、MAX_UINT、负数等,
  3. 对于父输入的所有受污染的cmp指令,如果op1 ≠ op2的值,则将步骤2中字符串中受污染偏移的值替换为op2的值,否则将以固定概率替换受污染的值字节由随机字节序列组成。
  4. 将magic bytes放置在由我们的magic bytes检测器确定的相应偏移处。

3.5 Fuzz阶段

VUzzer在fuzz时对输入进行了污点分析,在插桩的cmp指令处就可以拿到比较的位置和比较的内容,从而能够在突变时解决magic bytes的比较问题。对于lea指令,如果index操作数被污点分析,说明对应位置值的类型是int,就可以在突变阶段进行特殊处理。

4.实验

  1. 对Darpa Cyber Grand Challenge进行了测试,并与AFL进行了对比,结果上能够通过生成更少的输入来触发更多的崩溃
  2. 对LAVA测试集进行了测试,结果上对于其他fuzzer均能在同样的时间能得到更多的崩溃
  3. 对真实程序进行了测试,并与AFL进行了对比,能够在更短的时间内生成更多崩溃

5.讨论

总体而言,VUzzer通过静态分析和动态污点分析技术增强了fuzzer的效率,更快的生成有趣的输入,是一个较早解决了magic bytes比较等问题的fuzzer,并且overhead比之前的工作都要小。在不足之处上,动态污点分析技术还是会给fuzzer带来一些效率上的降低,因此后面的一些工作都针对这个问题做出了改进。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值