写点什么

Fuzzing(模糊测试) 的前世今生(中)

作者:云起无垠
  • 2022-12-02
    北京
  • 本文字数:2187 字

    阅读完需:约 7 分钟

在上一篇《Fuzzing(模糊测试)的前世今生(上)》中,我们讲解了模糊测试技术的由来,本篇我们重点为大家阐述一下模糊测试的技术原理和底层算法。

1.模糊测试的技术原理

模糊测试是一种发现软件漏洞非常有效的技术,通过它可以提高软件的安全性和健壮性,也是软件开发生命周期 SDLC 框架的重要组成部分。它的工作原理是通过提供大量畸形数据输入给被测程序,触发程序的崩溃或异常执行状态。通常情况下,它的工作流程包含如下 6 步:

步骤一:识别目标系统

在对模糊测试工具或技术做出选择时,我们需要先确定被测对象,了解被测对象的类型,比如被测目标是客户端程序还是服务端程序,二进制还是源代码,被测对象是否出现过漏洞等,了解清楚之后我们才可以有效地给出准确的测试计划。

步骤二:识别输入

大部分可被利用的安全漏洞都是由于应用程序没有对用户的输入进行校验或没有对非法输入进行处理而造成的。是否能找到所有的输入向量 (Input vector) 是模糊测试能否成功的关键。寻找输入向量的原则是:向目标应用发送的任何东西,例如头 (Headers)、文件名 (File Name)、环境变量 (Environment variables),注册表键 (Registry keys),以及其他信息,都可能是潜在的模糊测试变量。

步骤三:生成模糊数据

一旦识别出输入向量,就可以生成模糊测试数据。可依据测试对象的特征,制定相应的模糊测试数据生成策略。通常,可通过生成或变异己有的数据,利用程序动态运行时产生的临时数据,动态生成数据。

步骤四:使用模糊数据执行测试

执行过程可能包括发送数据包给目标应用程序、打开一个文件或发起一个目标进程。同样,这个过程中的自动化也是至关重要的。没有自动化,便无法执行真正的模糊测试。

步骤五:监控系统行为

在模糊测试的过程中,我们要实时监控故障或异常,及时发现问题,这是模糊测试过程中一个至关重要的环节。试想一下,对程序进行模糊测试的过程中,当执行某个测试用例目标程序发生异常时,倘若没有异常监视模块,测试人员或许根本不知道目标程序发生了异常,更无法找出触发异常的样本及相关信息,整个测试过程将会毫无意义。由于模糊测试过程周期较长,当测试用例的数目较多时,通过人工的方式监视目标软件是非常低效的,所以目前异常监视往往采用自动化的方式来实现,其中常用的异常监视技术依据原理分为两种:基于调试的方法和基于插桩的方法

基于调试的方法意在调试模式下启动目标软件,通过操作系统平台提供的调试 API,开发有针对性的异常监测模块。此方法实现异常监视难度虽大,但更高效。相较于基于调试的方法,基于插桩的方法虽性能有所降低,但功能却异常强大。插桩技术是指在保证原有程序逻辑完整性的基础上,在程序中插入探针,通过探针采集代码中的信息(方法本身、方法参数值、返回值等)并在特定的位置插入代码段,从而收集程序运行时的动态上下文信息。目前常用的插桩方法分为静态代码插桩(源代码、中间码、二进制)和二进制代码动态插桩。

步骤六:记录缺陷,确定可利用性

一旦确定被测目标存在故障,则需要确定所发现的 bug 是否可复现,重现故障最常用的手段就是重放检测,即调用数据包重放工具将转储的网络数据包进行重放。重现成功后,还需进一步判断该 bug 是否可被利用。

2.模糊测试生成种子方法

现阶段模糊测试用例的生成一般分为两类:基于生成基于变异,总体可涵盖为诸如符号执行、污点分析、覆盖引导、语法树变异、遗传变异等。

  • 基于符号执行的方法

该方法的核心思想是以测试用例为符号值,在处理过程中搜索测试路径上的核心约束信息。通过约束求解生成一个新的测试用例,以覆盖不同的程序执行路径。这种方法适用于测试结构简单、执行路径少的程序。但是,程序的复杂性随着功能的多样化而增加,导致路径数量的爆炸式增长。由于复杂的约束求解问题,符号执行很难应用于构建复杂的程序测试用例。

  • 基于污点分析的方法

该方法的核心思想是利用动态污点分析技术标记输入数据的污染源,关注污点的传播过程,从中提取关键污点信息,并利用污点信息指导生成种子变异和相关测试用例。它是为程序中的一些关键执行路径构建测试样本的有效方法,并且具有良好的代码覆盖率,例如 Angora。然而,随着遗传算法和神经网络在模糊测试中的应用,污点分析技术逐渐显露出低效这一弱点。

  • 基于遗传变异的方法

遗传变异算法利用生物进化的一些核心规则来指导模糊测试样本的生成。目前,遗传算法是应用最广泛、性能最好的进化算法,其核心思想是对测试用例进行多轮迭代变异,剔除不符合要求的测试用例或从中选出性能最好的样本作为下一轮变异的种子。遗传算法不仅可以生成新的测试用例,还可以简化样本集,从而进一步提高模糊测试的效率。

  • 基于覆盖引导的方法

覆盖引导的模糊测试是一种有效的测试技术,它已从各种软件应用程序中检测到了十万个缺陷。它专注于最大化代码覆盖率,以在模糊测试期间发现更多缺陷。AFL 工具就采用了该技术。

图 覆盖引导的模糊测试

  • 基于语法树变异的方法

语法树是源代码语法结构的一种表示,它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。而语法树变异是基于变异生成种子文件相应的语法树,然后以其子树为对象进行替换操作。替换的材料可能由用户指定,也可能由系统按照一定规则自动生成。

如上技术都是在模糊测试中得到广泛应用的技术,众多技术的应用使得模糊测试技术有了更强的安全检测能力。

更多关于模糊测试应用实践的文章在下一篇中为大家讲解,敬请期待!


发布于: 刚刚阅读数: 5
用户头像

云起无垠

关注

还未添加个人签名 2022-10-14 加入

还未添加个人简介

评论

发布
暂无评论
Fuzzing(模糊测试)的前世今生(中)_云起无垠_InfoQ写作社区