软件测试中的模糊测试的定义 软件测试
什么是模糊测试?
解释模糊测试(模糊化)的最好方法就是使用示例。最近以来,模糊化的最常见用处是验证两种类型的数据分析程序:文件和网络。
文件分析程序的一个例子是 Microsoft Word。对 Word 文件分析程序进行模糊测试需要什么?想象一下创建一百万个长度和所包含数据均为随机的 Word 文档。假设这些文档不是由 Word 自己创建,而实际上是通过将随机的二进制数据源输送到磁盘上的测试文件中创建的。在 Word 中打开其中任意一个文件,看看会发生什么。
这样做可能会出现三种结果。第一种,对于大多数测试文件,Word 会指出文件格式无法识别,或文件已破坏而无法打开等错误。第二种,一百万个文件中的少数文件可能实际上包含了某些可识别控件和可打印字符的组合。那些文件将会正常打开,没有任何问题。第三种,也是最有趣的情况是,可能有几个文件包含了文件分析程序没有预见到的数据。在这种情况下,程序可能会出故障。
对于安全性测试人员,第三类测试文档才是真正有意义的情况。如果文件分析程序出现故障,那意味着它存在 bug。如果有 bug,它可能是可利用的。例如,bug 可能会引起堆栈损坏或堆损坏,从而造成故障。一般情况下,此类 bug 在联网环境下属于严重问题,因为各种各样的文件类型都可作为电子邮件附件分发。经验表明,大多数用户都会打开附件,而不管其性质。
在网络分析程序领域中也存在相似的问题。考虑一下典型的 PC、服务器或嵌入式网络设备所能理解的协议数量之多:DHCP(动态主机配置协议)、DNS、HTTP、SMB(服务器消息块)和 SMTP 等等。每个协议实现都包括一个针对来源于网络的数据包的分析程序,而每个分析程序都可能需要一些复杂的逻辑。此类代码也往往会有许多边界情况,从而使之难以验证。
测试网络协议代码的一个方法是通过模糊化。但是,在这种情况下,我建议使用一种“向其提供随机数据即可”方法(在上面的 Word 分析程序上下文中说明)的变体。
假设我需要测试一个 DHCP 客户端。再进一步假设 DHCP 客户端代码的某一特定部分特别糟糕,但是该段代码在某种程度上得到了分析程序另一部分(被认为较为可靠)的网络保护。
在这种情况下,用纯随机数据模糊化 DHCP 客户端不可能有效地使用时间,因为我预见代码的可靠部分会筛选出大多数不正确的数据。我改为采用一种更具针对性的方法。
实际上,根据我的经验,在采用这种方式时模糊化最有效。继续该 DHCP 示例,我将模糊测试(模糊处理程序)配置成使用已知有效数据、故意错误数据和随机数据的组合,而不是用大量纯随机数据来测试该客户端。使用已知有效数据的目的是跳过我不感兴趣的分析程序组件。使用故意错误数据的目的是利用已知或我怀疑将成为代码中缺陷的情况。最后,使用随机数据的目的就是看看会发生什么。
在模糊化的过程中,我的方法会随着我对可疑行为的进一步了解而得到完善。例如,我的测试 DHCP 包的某些部分最初包含了随机数据,我随后可能会在该处使用已知的有效数据来进一步深入了解该分析程序。如果发现了错误,我会发送故意错误数据以试图利用它。这种启发式方法是两个领域的最佳方案:人类直觉和计算机自动化。
模糊化确实是功能强大的工具,但是它在测试覆盖率方面仍处于相对未知的领域。因此我发出以下行动呼吁(当然要在读完本文其余部分之后实现):选择您熟悉的技术,或至少您感兴趣的技术,为之编写一个模糊处理程序。您多半可能会发现 bug。