28、IoT应用安全测试中两种模糊测试方法的评估与应用

IoT应用安全测试中两种模糊测试方法的评估与应用

1. 引言

如今,网络攻击几乎针对我们所有的数字基础设施和服务,涵盖银行、云计算、大数据分析平台,以及Windows和Mac机器、移动设备等。分布式拒绝服务攻击、恶意软件、勒索软件攻击和僵尸网络,加上不断增加的软硬件漏洞,使得安全成为包括物联网(IoT)在内的新技术广泛部署的重大障碍。

在物联网领域,软件漏洞和安全缺陷往往在软件发布后才被发现,这使运行此类易受攻击应用程序的设备面临安全威胁。物联网应用程序的漏洞可能会使整个网络暴露给攻击者,造成重大损失。虽然为保障物联网环境安全提出了一系列技术,但软件缺陷仍然是物联网安全问题的主要根源。

模糊测试是一种用于发现特定软件中漏洞的技术。通过向目标软件提供随机和无效输入,我们可以监测软件的行为异常,如崩溃或拒绝服务,并记录导致崩溃的输入数据,以调查程序堆栈中导致应用程序故障的确切数据位置。这种过程通常会使用不同的数据类型重复进行,以发现软件中的缺陷。

模糊测试作为一种在软件部署前快速且经济高效的方法,能够揭示软件中的漏洞和安全缺陷,因此非常适合在程序发布前发现潜在的漏洞。它是一个自动化过程,需要最少的监督,适合在没有访问源代码或不了解编写应用程序的高级编程语言的情况下测试软件。

本研究使用了FileFuzz和Peachfuzz这两种代表主要模糊测试方法的工具,以确定最有效的方法,并探讨如何改进模糊测试过程以提高效率。

2. 背景
2.1 模糊测试

模糊测试是一种软件测试技术,通过自动注入随机生成的输入来发现安全漏洞。模糊测试程序可用于测试计算机系统或设备上运行的应用程序,通过提供意外和经过处理的数据来监测目标的异常行为,以检测软件漏洞,从而提高软件安全性或利用系统漏洞。

由于模糊测试可以在不了解或访问底层源代码的情况下自动测试运行中的应用程序,因此它是渗透测试人员首选的黑盒测试方法之一。不过,该技术也常被恶意黑客用于测试应用程序的漏洞,并为已识别的漏洞编写利用程序。

模糊测试器主要分为两类:
- 基于变异的模糊测试器 :从用户提供的现有数据样本中获取有效数据输入,并对其进行某种类型的变异以构建测试用例,但不更新相应的循环冗余校验。
- 基于生成的模糊测试器 :从数据模型中从头创建随机数据输入,并生成正确的循环冗余校验。

2.2 模糊测试技术和策略

模糊测试可应用于不同类型的应用程序,如数据库、多媒体、文字处理、模拟软件和应用套件。

  • 基于变异的模糊测试 :也称为“笨模糊测试”或“协议无关模糊测试”。当使用包含无效输入的有效测试用例对目标进行模糊测试时,该方法会在不深入理解输入数据或目标软件格式的情况下,对测试用例进行更改和变异,以包含异常。像“File Fuzz”这样的模糊测试程序会自动从用户那里获取有效模板,并对其进行变异,以创建导致目标软件故障所需的测试用例。
  • 基于生成的模糊测试 :也称为“智能模糊测试”或“协议感知模糊测试”。这种方法需要对目标有先前的了解,因为测试用例应根据格式从头构建。例如,针对需要用户输入请求注释(RFC)的程序,我们需要通过查看软件文档或对软件进行逆向工程来了解软件的结构和格式,然后在此基础上构建包含异常的测试用例。手动调整测试用例非常困难,但有一些模糊测试工具可以使这个过程变得更容易。

目前所涵盖的方法都属于黑盒模糊测试。黑盒模糊测试需要发送格式错误的数据,而无需实际验证哪些代码路径被命中,哪些未被命中。在黑盒测试中,不需要了解目标源代码,这使其在开发者和攻击者中得到了广泛应用。然而,在测试具有复杂逻辑的软件时,测试效率可能无法满足开发者的期望,并且由于对目标的了解有限,黑盒测试的代码覆盖率较低,可能会遗漏安全漏洞。

白盒技术或智能模糊测试则将测试范围从黑盒测试的单元测试扩展到整个软件测试,搜索负路径,能够覆盖数百万条指令、执行跟踪和代码行。在白盒测试中使用符号执行,用符号值代替正常数据,这种方法可以让我们了解软件在输入无限数据时的行为,并探索随机测试时不可行的输入空间。当分支达到可满足性模理论(SMT2)求解器时,会给出一个新命令来变异输入。如果问题得到解决,软件将使用新输入再次运行。这种技术的机制侧重于发现新路径,以实现整个软件的安全测试。但白盒模糊测试需要大量的努力、技能和成本。

2.3 种子选择

在模糊测试过程中,用于模糊目标的有效样本非常重要。通常,模糊测试器需要大量样本才能覆盖目标上更多的路径。根据目标的不同,这些样本可能比预期的要大,并且可能需要大量时间和计算机处理能力才能完成。这可能会阻碍发现更多漏洞的机会。

因此,建议找到一种方法来最小化模糊测试程序所需的种子选择。通过去除使用相同路径或在目标代码上具有相同覆盖率的样本,而不降低目标代码的覆盖质量,可以减少模糊测试过程所需的时间和精力。

选择最佳的种子文件可以大大增加在模糊测试过程中发现的漏洞数量。为了最小化覆盖目标大部分代码块所需的样本数量,第一步是生成最佳样本集,并使用一种插桩工具保存和提取每个样本在目标中使用的代码覆盖率。然后,将提取的信息与从不同样本获得的其他覆盖率进行比较,选择覆盖率最佳的样本,直到覆盖目标的大部分路径,而其他样本将从数据集中排除。

在本文中,使用了一个名为(minset.py)的自动化Python脚本,它利用了微软研究的Phoenix项目来查找应用程序中的基本块。该脚本是基于生成的模糊测试工具(Peach)库的一部分,能够对目标应用程序进行代码覆盖分析。将原始样本的目录和这些样本应测试的软件路径输入该脚本,结果将包含更少的样本,但与原始样本具有相同的效率,并将保存到一个新文件夹中。这种脚本非常适合与基于生成的模糊测试器一起使用。

对于基于变异的模糊测试方法,这类模糊测试器只需要一个有效样本(模板)来生成种子/测试用例。在这种情况下,模糊测试器会添加、删除或替换模板输入的一部分,以生成模糊测试过程中所需的种子,生成的种子数量将根据所选范围而定。

2.4 插桩

不同类型的模糊测试器根据所测试的软件需要不同类型的监控方法。使用插桩工具进行模糊测试的主要目标是在运行时控制被模糊测试的软件,它能够在指令执行前修改或删除任何指令,并监控结果,有助于进一步分析研究目标的行为。这一阶段大致可以通过以下两种方式完成:
- 动态插桩 :当需要在程序运行时动态修改模拟过程时应用该技术。通过在两个单独的进程中,在分析目标代码之前执行新的插桩代码。动态插桩的强大之处在于它能够在现有二进制文件执行前操纵每条指令。

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    A(程序运行):::process --> B(执行新插桩代码):::process
    B --> C(分析目标代码):::process
  • 静态插桩 :在软件运行之前向其添加插桩代码的方法。本质上是将探针嵌入到二进制文件中。有两种实现方式:一种是让编译器插入探针,如Visual C++在实现“Profile Guided Optimizations (PGO)”时采用这种方法;另一种是对编译器生成的二进制文件进行处理,发现所有方法,进行插桩和修改,就像文件从未被触碰过一样。
3. 方法论
3.1 指标

为了衡量不同模糊测试工具在目标上的跟踪效果,由于模糊测试器本身不包含相关功能,因此必须使用不同的工具或方法来实现。主要通过以下两种方式进行:
- 代码覆盖率 :也称为模糊测试跟踪,是衡量模糊测试过程效率的重要指标。它允许检查在模糊测试期间哪些代码路径被执行,这对于验证测试有效性和提高样本覆盖率非常重要。代码覆盖率会收集被插桩的软件代码行,并比较哪些代码被模糊测试器触及,哪些未被触及,并给出相应的百分比。本项目将使用代码覆盖率来比较两种模糊测试工具的效果。主要使用前面提到的插桩工具来测量目标的代码覆盖率/跟踪,同时也用于减少选择的样本集。
- 时间 :仅使用代码覆盖率作为指标无法为最终用户提供有关测试质量的信息。因此,在实现研究目标时,还需要另一个测量指标。执行特定过程所需的时间将作为指标,它可以显示过程所需的时长,用于区分两种模糊测试器,并记录它们在特定模糊测试过程中消耗的最佳时间。对于基于变异的模糊测试器,通过查看模糊测试开始和结束的时间来测量;而基于生成的模糊测试器会自行记录时间。

3.2 模糊测试方法

在这部分,我们将详细解释两种模糊测试方法(基于变异和基于生成),以及两种模糊测试器和相关支持工具,以便对用于模糊测试研究目标程序的两种主要方法和工具进行有效比较。
- 基于变异的模糊测试 :也称为“笨模糊测试”,是一种模糊测试策略,在开始模糊测试的第一阶段需要一个测试用例(模板)。在这种模糊测试中,测试用例在不深入了解输入数据或目标软件格式的情况下进行变异,以包含异常。具体步骤如下:
1. 准备一个有效的测试用例模板。
2. 使用模糊测试程序(如“File Fuzz”)对模板进行变异,生成包含异常的测试用例。
3. 将变异后的测试用例输入目标软件进行模糊测试,观察软件的行为。
4. 记录导致软件异常(如崩溃、拒绝服务)的测试用例和相关数据。

IoT应用安全测试中两种模糊测试方法的评估与应用

3.2 模糊测试方法(续)
  • 基于生成的模糊测试 :也叫“智能模糊测试”,需要事先了解目标软件的结构和格式。具体操作步骤如下:
    1. 研究目标软件:通过查看软件文档、逆向工程等方式,了解软件的结构、所需输入格式以及相关协议要求。
    2. 构建数据模型:根据对目标软件的了解,创建一个数据模型,该模型将作为生成随机输入的基础。
    3. 生成测试用例:利用模糊测试工具(如Peachfuzz),依据数据模型从头生成随机数据输入,并确保生成正确的循环冗余校验。
    4. 执行模糊测试:将生成的测试用例输入目标软件,监测软件的行为,记录任何异常情况。
    5. 分析结果:对测试过程中记录的数据进行分析,找出可能存在的安全漏洞。
模糊测试方法 特点 所需知识 测试用例生成方式 适用场景
基于变异的模糊测试 简单直接,无需深入了解目标软件 无需了解目标软件格式 对现有有效样本进行变异 对目标软件了解较少的情况
基于生成的模糊测试 更智能,能生成符合特定格式的输入 需要了解目标软件结构和格式 从数据模型中从头生成 对目标软件有一定了解,需要测试复杂格式输入的情况
4. 实验与结果讨论

在实验中,使用FileFuzz和Peachfuzz这两个模糊测试工具分别对目标软件进行测试,通过代码覆盖率和时间这两个指标来评估它们的性能。
- 代码覆盖率 :使用插桩工具记录每个模糊测试工具在目标软件上的代码覆盖率。通过比较发现,基于生成的模糊测试工具Peachfuzz在代码覆盖率上表现较好,能够覆盖更多的代码路径。这是因为它在生成测试用例时考虑了目标软件的结构和格式,能够更有针对性地生成输入,从而触及更多的代码分支。
- 时间指标 :对于基于变异的模糊测试工具FileFuzz,通过记录模糊测试开始和结束的时间来计算测试所需时间;而Peachfuzz会自行记录测试时间。实验结果显示,FileFuzz在测试过程中花费的时间相对较少,因为它只需要对一个有效模板进行变异,生成测试用例的过程相对简单。而Peachfuzz由于需要事先了解目标软件并构建数据模型,前期准备工作较为复杂,所以整体测试时间较长。

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    A(选择模糊测试工具):::process --> B{基于变异还是基于生成?}:::process
    B -->|基于变异| C(FileFuzz):::process
    B -->|基于生成| D(Peachfuzz):::process
    C --> E(准备模板):::process
    D --> F(研究目标软件):::process
    E --> G(变异模板生成测试用例):::process
    F --> H(构建数据模型):::process
    G --> I(执行模糊测试):::process
    H --> J(生成测试用例):::process
    J --> I
    I --> K(记录结果):::process
    K --> L(分析结果):::process
5. 总结与未来工作

通过本次实验,我们对基于变异和基于生成的两种模糊测试方法进行了评估。基于变异的模糊测试方法简单快速,但代码覆盖率相对较低;基于生成的模糊测试方法代码覆盖率高,但前期准备工作复杂,测试时间较长。在实际应用中,可以根据对目标软件的了解程度和测试需求来选择合适的模糊测试方法。

未来,可以进一步研究如何优化模糊测试过程,提高测试效率和代码覆盖率。例如,可以探索更智能的种子选择方法,减少不必要的样本,提高模糊测试的针对性;还可以结合机器学习和深度学习技术,自动学习目标软件的特征,生成更有效的测试用例。此外,也可以研究如何将模糊测试与其他安全测试技术相结合,形成更全面的安全测试体系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值