两种模糊测试方法在安全测试中的评估与应用
1. 模糊测试方法概述
模糊测试是一种软件安全测试技术,主要有突变模糊测试(Mutational Fuzzing)和生成式模糊测试(Generational Fuzzing)两种方法。
1.1 突变模糊测试
突变模糊测试分为三个阶段:
1. 构建有效输入集:通过操作一组有效输入来构建测试基础。
2. 输入变异与种子测试用例生成:对输入进行变异,自动构建一组种子测试用例,每个用例用于模糊测试。
3. 运行与监控:研究目标运行新的变异数据,并监控是否发生崩溃。
选择了由Michael Sutton编写的FileFuzz作为突变模糊测试工具。该工具分三个阶段独立工作,便于对模糊测试过程进行适当的测试和分析,尤其在生成和使用测试用例时。此外,它还有图形用户界面,方便监控模糊测试进度,观察内存位置、注册表值和崩溃时出现的错误类型。
graph LR
A[有效输入格式] --> B[生成模糊数据]
B --> C[自动化模糊过程]
C --> D[模糊测试]
D --> E[崩溃监控]
1.2 生成式模糊测试
生成式模糊测试需要事先了解目标结构、输入格式或文件定义。研究人员需先进行研究以理解文件定义,编写说明目标工作方式的语法。模糊器分析这些信息,生成智能测试用例,并将新的模糊数据发送到目标进行测试。该方法可分为五个阶段:
1. 提取初始测试用例。
2. 识别目标结构后的自动化过程。
3. 模糊器分析用户信息并生成新测试用例。
4. 根据新的模糊数据进行新的自动化过程。
5. 监控崩溃情况。
选用Peach Fuzzing Framework作为生成式模糊测试工具。它是用Python编写的先进安全测试平台,可对程序、ActiveX、网络应用、SQL等进行模糊测试。该工具根据目标的格式方法快速生成模糊器,需要Peach Pit Packs来满足目标要求,这些包存储在文件中,Peach根据用户选择的目标调用所需的Pit,通过定义数据格式和数据结构之间的关系,智能地向收集的数据中添加异常。
graph LR
A[提取初始测试用例] --> B[识别目标结构后的自动化过程]
B --> C[模糊器分析用户信息并生成新测试用例]
C --> D[根据新的模糊数据进行新的自动化过程]
D --> E[监控崩溃情况]
2. 实验工具
2.1 动态二进制插桩(Dynamic Binary Instrumentation)
选择PIN3.2进行动态二进制插桩,用于记录和深入监控对目标“Sumatra PDF”进行模糊测试时的活动。该工具由Intel生产,是便携式版本,支持包括Linux在内的几乎所有平台。与调试器需要暂停跟踪不同,动态二进制插桩可在不中断的情况下进行跟踪,Pintools提供丰富的应用程序编程接口(API),可按块或按函数进行插桩。测试环境使用Windows操作系统,需要Microsoft Visual Studio支持工具和相关文件的运行。
2.2 !exploitable 1.6.0
模糊测试目标时可能会在一个或不同位置多次崩溃,模糊器会将这些崩溃记录在一个包中以便进一步分析。!exploitable是与Peach模糊器关联的Windows调试扩展工具,可根据崩溃的可利用性对漏洞进行优先级排序和分类,如可利用、可能不可利用或未知。
2.3 交互式反汇编器IDA Pro 5.0
用于反汇编目标代码,生成并记录反汇编数据库(.idb),包含目标软件应用的所有结构和功能,便于测试人员在调查过程中参考。其输出可通过其他工具进一步分析,如BinDiff可支持导出IDA输出文件,用于发现运行不同变异样本时目标执行的指令。
3. 测试环境
3.1 虚拟机配置
在两台分别安装Windows 7和Windows XP的虚拟机上进行实际工作,以避免主主机(Mac OS X)带来的问题。两台虚拟机的配置如下:
| 系统配置 | 值 |
| ---- | ---- |
| 操作系统 | Windows XP, Windows 7 |
| CPU | 每个2核 |
| 内存 | 每个4GB |
| 虚拟硬盘容量 | 40GB |
主主机的配置如下:
| 系统配置 | 值 |
| ---- | ---- |
| 操作系统 | MacOS 10.12.6 |
| CPU | 2.9 GHz Intel Core i7 |
| 内存 | 16 GB 2133 MHz LPDDR3 |
| 硬盘容量 | 500 GB |
在模糊测试期间,两台虚拟机需长时间连续工作。为避免中断,笔记本电脑配置为不睡眠,风扇转速提高到4500 rpm,屏幕不关闭。此外,两台虚拟机与主主机有共享文件夹,方便文件共享和协作。
3.2 目标软件
目标软件是Sumatra PDF,它是一个开源的PDF查看器,可在Windows和Linux平台上运行。其图形用户界面增加了一定复杂性,且需要PDF文件格式作为输入,易于收集。选择较早版本Sumatra1.5.1作为目标,因为较新的成熟版本可能存在较少漏洞。目标仅包含一个可执行文件,无需库即可执行。
4. 实验与结果
4.1 生成所选模板的最小集合
由于目标要求,两个模糊器都需要PDF文件格式作为输入流。为提高覆盖目标每个代码块的可能性,从不同资源下载PDF文件,如www.malwr.com/analysis/search/ “type:pdf”和通过Google搜索“test +.pdf”。为生成式模糊器Peachfuzz下载了2000个PDF初始样本,用于进一步研究以生成最小样本集。为突变模糊测试的FileFuzz选择一个样本,该样本从脚本生成的新数据集中选取。
使用“minset.py”脚本减少下载的2000个PDF样本,该脚本可分析每个样本对目标代码的覆盖情况,排除具有相似/重复覆盖的样本,生成新的数据集。经过两天多在4核/10GB RAM上的不间断运行,新数据集仅包含132个PDF文件,相当于原数据集的80%样本被排除。
4.2 模糊测试
4.2.1 FileFuzz策略
FileFuzz策略的优点是无需事先了解目标,仅基于目标软件的文件格式(PDF)进行测试。选择一个PDF文件作为初始测试用例,FileFuzz将其拆分为10,360个PDF文件。将时间限制从默认的2秒略微增加到5秒,以便模糊器有足够时间对每个生成的样本进行测试。如果软件未崩溃,模糊器将停止当前测试样本并继续下一个。
4.2.2 Peachfuzz策略
从Python脚本生成的新数据集中选取样本,结合使用IDA Pro和PIN了解目标软件的内部结构。Peach需要pit文件(.xml)开始模糊测试,该文件根据Sumatra PDF的功能生成和修改,并将支持的输入流与最小数据集关联。
Peach引擎根据每个PDF样本的定义生成数据模型,每个数据模型部分作为前导,使Peach在添加无效输入操作测试用例之前识别目标结构。与FileFuzz策略相比,Peach的模糊测试过程需要更多处理时间,每个样本在1500次迭代后终止,以获得目标功能的合理覆盖。
4.3 测试结果
使用两个模糊器的测试结果都出现了故障和异常。FileFuzz在不受控环境下对Sumatra PDF软件进行测试,结果记录在模糊器主界面。其结果总结如下表:
| 异常类型 | 数量 |
| ---- | ---- |
| 访问违规 | 19 |
| 溢出 | 3 |
| 除零错误 | 1 |
Peachfuzz的崩溃情况通过内置调试器(!exploitable)进行分类,结果总结如下表:
| 可利用性分类 | 数量 |
| ---- | ---- |
| 可利用 | 15 |
| 可能可利用 | 8 |
| 未知 | 47 |
4.4 两种模糊测试结果分析
4.4.1 崩溃分析
从测试结果可以看出,FileFuzz测试存在不足。其临时记录异常的方法在出现失败时会导致结果丢失,需要重新测试所有样本。此外,FileFuzz产生的总异常数量少于Peachfuzz。但需注意,FileFuzz的结果仅对目标进行了一次测试,这种模糊测试需要不同轮次和不同样本才能获得更好、更一致的结果。
分析FileFuzz产生的结果发现,少数故障共享相同地址。例如,地址779e5705在四个不同样本触发的四个不同故障中被报告。使用Pin工具重新测试和分析这些样本,发现四个不同的指令导致了四个独特的访问违规异常,但都在同一函数“779e5705”内。
突变模糊测试需要模板启动,这意味着模糊器不会产生母样本中不存在的代码。例如,PDF文件格式有十种类型的块,但所选主模板仅使用了五种,FileFuzz无法生成缺失的五种块,只能修改现有块。
相比之下,Peachfuzz表现更好。它记录漏洞的方法更完善,会创建包含测试日期和时间的新文件夹,其中“status.txt”文件列出所有发现的故障及所在迭代,“faults”子文件夹根据!exploitable调试器的分类列出每个故障。这表明以Peach为代表的生成式模糊测试方法在发现和记录软件缺陷方面更优。
使用PIN工具、十六进制编辑器和Minset脚本对Peachfuzz产生的多个故障进行分析,比较结果发现,一些变异样本产生的跟踪与正常样本相同。
综上所述,生成式模糊测试在发现软件漏洞方面具有一定优势,但突变模糊测试也有其适用场景。在实际应用中,可根据具体需求选择合适的模糊测试方法。
5. 深入剖析两种模糊测试方法
5.1 突变模糊测试的局限性与优势
突变模糊测试虽然在某些方面存在不足,但也有其独特的优势。
5.1.1 局限性
- 依赖模板 :如前文所述,突变模糊测试依赖于初始模板,只能对模板中已有的代码进行修改,无法生成模板中不存在的代码。这就限制了其对目标软件的覆盖范围,可能会遗漏一些潜在的漏洞。例如,PDF文件格式有多种类型的块,但模板中只包含了部分类型,模糊器就无法对其他类型的块进行测试。
- 结果记录不完善 :FileFuzz采用的临时记录异常的方法,在出现失败时容易导致结果丢失,需要重新测试所有样本,浪费了大量的时间和精力。这使得测试过程的效率较低,不利于大规模的安全测试。
5.1.2 优势
- 无需先验知识 :突变模糊测试不需要对目标软件有深入的了解,只需要基于目标的文件格式即可进行测试。这使得它在测试一些复杂或未知的软件时具有一定的优势,降低了测试的门槛。
- 简单易操作 :FileFuzz的操作相对简单,只需要选择一个合适的模板,即可开始生成测试用例进行模糊测试。对于一些初学者或资源有限的测试人员来说,是一种较为容易上手的测试方法。
5.2 生成式模糊测试的特点与挑战
5.2.1 特点
- 高代码覆盖率 :生成式模糊测试通过事先了解目标软件的结构和输入格式,能够生成更具针对性的测试用例,从而提高对目标软件的代码覆盖率。这使得它在发现软件漏洞方面具有更高的效率和准确性。
- 完善的结果记录 :Peachfuzz采用的记录漏洞的方法更加完善,能够详细记录每个故障的信息,包括故障发生的迭代次数、可利用性分类等。这为后续的漏洞分析和修复提供了有力的支持。
5.2.2 挑战
- 需要先验知识 :生成式模糊测试需要对目标软件的内部结构和输入格式有深入的了解,这就要求测试人员具备较高的技术水平和专业知识。对于一些复杂的软件,获取这些信息可能需要花费大量的时间和精力。
- 测试时间长 :与突变模糊测试相比,生成式模糊测试的过程需要更多的处理时间。这是因为它需要对目标软件的结构进行分析,生成更复杂的测试用例,并且需要进行更多的迭代。在实际应用中,这可能会影响测试的效率。
6. 模糊测试方法的实际应用建议
6.1 根据目标软件选择合适的方法
在选择模糊测试方法时,需要根据目标软件的特点和测试需求来进行选择。
-
对于简单或未知的软件
:如果目标软件结构简单,或者对其内部结构了解较少,可以选择突变模糊测试。这种方法无需先验知识,操作简单,能够快速发现一些常见的漏洞。
-
对于复杂或关键的软件
:如果目标软件结构复杂,或者是关键的业务系统,建议选择生成式模糊测试。这种方法能够提高代码覆盖率,发现更多潜在的漏洞,并且能够对漏洞进行更详细的分类和记录。
6.2 结合多种测试方法
为了提高测试的准确性和效率,可以结合使用突变模糊测试和生成式模糊测试。
-
先用突变模糊测试进行初步筛选
:使用突变模糊测试对目标软件进行初步测试,快速发现一些明显的漏洞。这可以帮助测试人员了解目标软件的大致情况,为后续的测试提供参考。
-
再用生成式模糊测试进行深入挖掘
:在突变模糊测试的基础上,使用生成式模糊测试对目标软件进行更深入的测试。结合对目标软件的了解,生成更具针对性的测试用例,发现更多潜在的漏洞。
6.3 优化测试过程
在进行模糊测试时,还可以采取一些措施来优化测试过程,提高测试效率。
-
合理选择测试样本
:选择具有代表性的测试样本,能够提高测试的覆盖率。可以从不同的来源获取样本,并且对样本进行筛选和优化,排除一些无效或重复的样本。
-
调整测试参数
:根据目标软件的特点和测试需求,合理调整测试参数,如时间限制、迭代次数等。这可以使模糊测试更加高效,避免不必要的时间浪费。
7. 总结与展望
7.1 总结
本文介绍了两种模糊测试方法:突变模糊测试和生成式模糊测试,并对它们在安全测试中的应用进行了评估。通过对Sumatra PDF软件的测试实验,发现突变模糊测试具有无需先验知识、操作简单的优点,但存在依赖模板、结果记录不完善等局限性;生成式模糊测试能够提高代码覆盖率,完善结果记录,但需要先验知识,测试时间长。在实际应用中,应根据目标软件的特点和测试需求选择合适的方法,并结合多种测试方法,优化测试过程,以提高测试的准确性和效率。
7.2 展望
随着软件系统的不断发展和复杂化,安全测试的重要性日益凸显。模糊测试作为一种有效的安全测试方法,也将不断发展和完善。未来,模糊测试可能会在以下几个方面取得进展:
-
智能化
:引入人工智能和机器学习技术,使模糊测试能够自动学习目标软件的结构和行为,生成更智能的测试用例,提高测试的效率和准确性。
-
多平台支持
:随着软件平台的多样化,模糊测试工具需要支持更多的平台,包括移动设备、云计算等,以满足不同场景的测试需求。
-
与其他安全技术结合
:将模糊测试与其他安全技术,如静态分析、动态分析等相结合,形成更加全面的安全测试体系,提高软件系统的安全性。
总之,模糊测试在软件安全测试中具有重要的作用,未来的发展前景广阔。通过不断地研究和创新,模糊测试将为软件系统的安全保驾护航。
以下是一个简单的mermaid流程图,展示了选择模糊测试方法的流程:
graph LR
A[开始] --> B{目标软件特点?}
B -->|简单或未知| C[选择突变模糊测试]
B -->|复杂或关键| D[选择生成式模糊测试]
C --> E[进行初步测试]
D --> F[进行深入测试]
E --> G{是否发现漏洞?}
F --> G
G -->|是| H[分析漏洞并修复]
G -->|否| I[结束]
H --> I
通过这个流程图,可以清晰地看到根据目标软件的特点选择合适的模糊测试方法,并进行相应测试和漏洞修复的过程。
在实际的软件安全测试中,我们可以根据这个流程来指导我们的测试工作,提高测试的效率和准确性。同时,不断总结经验,优化测试方法,以更好地应对日益复杂的软件安全挑战。
超级会员免费看

被折叠的 条评论
为什么被折叠?



