什么是模糊测试?

2021-04-08 06:35:29

Fuzz测试检测开发人员&amp的难以找到的错误;其他安全工具,如SAST(静态分析)和SCA(软件成分分析)通常会错过。

代替用由单位测试或Sast等开发人员手写的小型预定义的测试用例进行测试,而是使用新生成的输入,使用反馈和结果来持续测试代码,而不是将代码与新生成的输入进行测试,以生成其他测试用例努力锻炼所有应用程序的代码路径。此反馈循环每秒运行数千次,使其具有非常彻底测试应用程序的有效方法。

在其核心,模糊测试是一种先进的随机测试类型。想象一百万只键盘上的百万只猴子,这一切都可以有所帮助,所有这些都是挂钩的。这些输入是随机的,通常由您的程序完全无效和意外。

模糊测试是如此强大,因为开发人员倾向于仅测试其代码中的快乐路径(即,用户应该发送的输入),因此将恶意输入未经测试。您可以看到释放所有这些“猴子”到应用程序上的所有内容,您将最终揭示您的应用程序无法使用恩典处理的所有边缘案例。更常见的是,您的用户最终播放了“猴子”的角色,在您的实例中导致各种意外和未处理的行为。模糊允许您在曾经生成之前发现这些错误。

您可以根据开发商知道并不知道的方式思考它。

已知已知的:开发人员期望和写测试的错误:通常由手动写入单位和集成测试的检查

已知未知数:开发人员知道的错误,但并不完全确定它们可能表现出来的地方或如何显示:通常由SAST和SCA工具找到,如拼写检查正在寻找常见错误

未知未知数:开发人员不指望的错误,因此也不确定他们可能呈现自己的地方。真正的新错误和漏洞,如令人毛骨悚然的,紧急/ 11和数万个Chrome漏洞,这些漏洞是由生产中的用户发现的。

模糊测试的错误类型可以在语言之间变化,但最终,模糊器用于使您的代码的假设无效。如果您可以定义必须为任何给定的输入(也称为不变量)必须保持的属性(也称为不变量),则模糊将查找打破您不变的输入。每个应用程序都有一些不变性。例如,您的代码永远不应该产生:

这些是错误测试可以在任何代码中轻松发现的错误:您的应用程序不应该崩溃,损坏的内存或超时。它也是如此恰好,这些类型的错误也占所有CVES的50%以上(最大的公开披露漏洞数据库 - 149,000人)。

开发人员可以通过定义必须始终为true的属性来编写自己的不变性,以发现所特有的错误。如果Fuzzer检测到某些输入对属性不正确,它知道它已找到逻辑错误。具有复杂业务逻辑的应用程序通常只有很多底层错误,只能使用utzzz测试找到。

希望到现在,你相信伪装测试是在代码中找到错误的有效方法,并开始考虑其应用程序。在我们看来,如果您正在编写复杂,关键任务软件,Fuzz测试是减轻意外错误的最有效方法。您在信任边界上消耗数据的软件的任何部分都是模糊的完美候选者。

虽然这不是一个详尽的列表,但它为您提供了应该模糊的软件类型的感觉。如果您不控制数据流程的来源,则该软件应彻底欺骗。

另一方面,如果您已编写了用于使用自定义或不太众所周知的协议的解析器或框架,那么符号对该协议实现绝对有意义。这在使用具有自定义框架实现(如DICOM或BACnet等行业特定协​​议的软件中非常常见。

覆盖引导的模糊测试(有时称为突变模糊)是模糊空间中最重要的突破之一,这使得它在过去5年中成为了De-Facto的模糊技术。从上面拍摄我们的猴子示例,这是一种使“猴子”更智能的方法 - 让他们在一小部分时间内覆盖更多的代码。

覆盖引导模糊背后的想法是,模糊发动机监视应用程序的代码覆盖输出,因为它处理输入,然后引导下一组输入集。虽然Fuzzer首先可以生成“随机”的输入,但它可以节省触发应用程序中的新覆盖的输入到语料库(一组有趣的输入),允许它通过每组新输入将其更深入地进入您的代码。

当您每秒运行此反馈循环千次循环时,模糊发动机很快就会在程序中很快拾取结构和模式,基本上学习如何生成专门针对您的应用程序量身定制的输入。

一个很好的例子是Michal Zalewski的博客帖子在拉出薄空气中拉出JPEG(扰流器警报:在短短6小时内,Fuzzer自身从头开始生成有效的JPEG图像)。

覆盖引导的模糊测试是开发人员最普遍适用的模糊技术 - 如果您可以编写单元测试,可以编写模糊测试。它还可以无缝地融入持续的集成工作流程,使其成为许多开发团队的最佳选择。

协议模糊(偶尔称为世代模糊)用作覆盖引导模糊的低摩擦替代品。而不是在应用程序的情况下毫无了解它的应用程序,而是通过对代码预期的协议进行深入了解,而不是深入了解,并发送大多数符合规范的输入 - 有一些例外 - 测试是很重要的 - 重要的是测试解析器的鲁棒性以及底层业务逻辑。

这对模糊和复杂的协议非常有效,这些方案通常具有专有实施或协议无法手动测试。 Protocol Fuzzing可以为您的应用程序预期的协议专门用于协议的工艺输入,使模糊不仅可以测试Parser层,而且可以对应用程序的核心业务逻辑。

协议模糊的另一个好处是能够模仿大型预编译应用和复杂系统。协议模糊通常只需要将薄代理部署在被测软件旁边,以便监视崩溃,系统错误,路径遍历和意外行为。

我们建议在测试复杂,模糊或自定义协议时作为一个很好的解决方案,以及覆盖引导模糊的替代方案,当您必须努力乐于仪器或修改时覆盖引导的模糊。

模糊声像是一个魔法子弹,并且在正确使用时非常强大,但实际上它很难正确 - 特别是当涉及到您的CI / CD管道并说服开发人员作为工作流程的一部分采用它时,这很难。

目前的模糊工具(开源或其他方式),不是很友好的,通常强迫用户学习完全新的测试范式,与低级结构一起工作,他们不明白,并显着修改其应用程序得到任何结果。添加了自定义基础架构代码,以保持模糊测试应用程序24/7,并且对于大多数团队甚至考虑的建议时间变得过于禁止。

FuzzBuzz完全摘要模糊的复杂性,因此您不必是测试代码的安全或基础设施专家。 FuzzBuzz不需要代码即可开始(虽然我们确实支持所有开源模糊),直接集成到现有的开发人员工作流程中,并确保所有错误是可重复和可操作的,因此开发人员不会浪费他们的时间摆弄基础设施或追逐虚假积极的。

FuzzBuzz使用自动化和智能,使您可以尽可能友好地制作模糊测试,但您不必通过单击右上方的“获得早期访问”来注册与创始人的演示(或拍摄)我是电子邮件[电子邮件保护])。我们每周都在登上新用户!