模糊测试(Fuzz Testing)是一种自动化的软件测试技术,最初是由威斯康辛大学的巴顿·米勒于1989年开发的,通常用于识别程序中的潜在漏洞。模糊测试的核心是自动或半自动的生成随机数据输入到应用程序中,同时监控程序的异常情况,如崩溃、代码断言失败,以此发现可能的程序错误,如内存泄漏。
模糊化是指自动生成和执行测试,模糊测试中输入的随机数据被称为“Fuzz”,随机数据的类型包括:超长字符串;随机数如负数,浮点数,超大数、特殊字符如~!@#$%等包含特殊含义的字符,作为输入可能会引发报错;unicode编码,因为有些程序是不支持unicode的。
模糊测试包括几个基本的测试步骤:确定被测系统->确定输入->生成模糊数据->使用模糊数据执行测试->监控分析系统的行为->输出日志。
目前有三种主要的模糊测试技术:
-
黑盒随机模糊,对正确格式的输入数据进行随机变异,然后用这些变异的输入运行程序,看是否能够触发异常。这是一种简单的hack,如果一个应用从未进行过模糊测试,可以用这种技术有效地发现应用中的漏洞。
-
基于语法的模糊,是模糊复杂格式输入的替代方法,需要指定输入格式的输入语法,还指定哪些输入部分要进行模糊化以及如何模糊化。基于语法的模糊生成器会生成许多新的输入,每个输入满足语法编码的约束。基于语法的fuzzing通过模糊生成器的用户的创造力和专业知识来指导fuzzing。
-
白盒模糊处理,由微软研究院于2008年首创,这种方法包括:动态地执行测试下的程序,并从执行过程中遇到的条件分支收集输入约束。然后,系统地逐个否定所有这些约束,并使用约束求解器求解,其解被映射到执行不同程序执行路径的新输入。使用系统搜索技术重复这个过程,试图扫描程序的所有可行的执行路径。与黑盒随机模糊相比,白盒模糊通常更精确,可以运行更多的代码,从而发现更多的bug。
模糊测试属于动态测试,是一种自动发现软件安全漏洞的经济有效的测试技术,常常会在软件安全开发生命周期中发现非常严重的安全故障或缺陷,例如:崩溃、内存泄漏,未处理的异常等。如果一个软件产品需要处理不可信的输入或者具有大型、复杂的数据解析功能,模糊测试是非常有效的。一旦一个模糊生成器启动并运行,它就可以开始自己寻找缺陷,不需要手动/人工干预。另外,模糊测试有助于发现传统测试方法或手动审计无法检测到的缺陷。
当然,模糊测试无法提供对于一个软件应用在安全威胁或漏洞方面的整体评估,在处理不会导致应用崩溃的安全威胁时效果较差,例如某些病毒、蠕虫、木马等,因此需要结合其它的安全测试手段来保障软件系统的安全。
模糊测试的核心在于一个有效的模糊生成器(Fuzzer),就像巴顿·米勒教授当初给学生布置的作业:
The goal of this project is to evaluate the robustness of various UNIX utility programs, given an unpredictable input stream. […] First, you will build a fuzz generator. This is a program that will output a random character stream. Second, you will take the fuzz generator and use it to attack as many UNIX utilities as possible, with the goal of trying to break them.
该项目的目标是在给定不可预测的输入流的情况下评估各种UNIX实用程序的健壮性。[…]首先,您将构建一个模糊发生器。这是一个将输出随机字符流的程序。其次,您将使用模糊发生器,并使用它来攻击尽可能多的UNIX实用程序,以试图破坏它们。
随机生成的输入大多数在语法上是不成立的,很快就会被被测试应用拒绝。为了能让模糊测试有效的进行下去,需要增加获得有效输入的几率。一个好的模糊生成器产生的数据,不会偏离预期输入太远,它们提供的数据被应用接受的概率很高,但又是非预期的,会触发应用的异常行为。
-
-
-
-
-
-
-
-
-
Microsoft Security Risk Detection
-
-
Synopsys Defensics Fuzz Testing
-
1. American Fuzzy Lop(AFL)
AFL是一款开源的模糊测试工具,是当今使用最广泛的Fuzzer,这个工具在程序执行前对程序源码进行插桩(instrumentation),以便在程序执行过程中实时获取程序的执行情况。AFL采用遗传算法对程序的输入进行变异能够在程序运行的时候注入自己的代码, 然后自动产生测试用例进行模糊测试。
代码覆盖率是模糊测试工具用来增加找到导致错误的代码路径的可能性的主要指标。在执行过程中,AFL向被测程序中输入input,然后获取程序的覆盖率,将覆盖率大的input保留下来进行变异,然后在下一轮测试中向被测程序中输出这些变异后的input,一直到程序的覆盖率在较长的一段时间不能继续增大为止。
AFL的优点是可以轻松部署,配置简单,而最大的优点在于测试效率。这个工具建立在对最佳模糊测试器运行机制和最有用结果的大量研究基础之上,旨在最小化编译查询返回结果的耗时,尽量降低对系统的影响。AFL目前已衍生出很多分支。
官网地址:https://lcamtuf.coredump.cx/afl/
WinAFL:Windows版本的AFL,使用DynamoRIO去插桩闭源程序以获取代码覆盖率信息,同时支持硬件PT获取覆盖率信息,但PT获取覆盖率其实并没有插桩获取得全,但速度可能会快一些。
地址:https://github.com/googleprojectzero/winafl
AFLFast:加速版的AFL,Fuzzing速度确实会比原版快一些。
地址:https://github.com/mboehme/aflfast
2. Radamsa
Radamsa是一个开源的模糊测试工具,通常用于测试程序对格式错误和潜在恶意输入的承受能力。Radamsa最大的卖点就是其准确性。GitLab上的开发者页面列出了这款模糊测试器在流行软件中发现的真实漏洞。它易于编写脚本,并且易于启动和运行。
https://github.com/Hwangtaewon/radamsa
Honggfuzz是由谷歌开发的,和AFL类似,采用遗传算法进行编译,是一个多进程和多线程的模糊生成器,所以用Honggfuzz进行fuzzing的速度非常快,在安全漏洞发现中的表现十分突出。根据该工具开发者的说法,它是唯一找到OpenSSL中导致发布全球安全补丁的关键漏洞的模糊测试工具。
Honggfuzz不仅仅适用于Windows。它可以测试在Linux、Mac甚至Android环境下运行的应用程序。由于它能够在多个平台下工作,Honggfuzz提供了一个完整的示例和测试用例目录,开发人员可以使用这些示例和测试用例,也可以根据自己的需要进行修改。
https://github.com/google/honggfuzz
LibFuzzer与被测试的库链接,并通过特定的模糊入口点(也称为“目标函数”)向被测试的库提供模糊输入。随后,模糊生成器跟踪触及的代码区域,并在输入数据的语料库中生成变异,以此来扩大代码覆盖率。
地址:https://llvm.org/docs/LibFuzzer.html
OSS-Fuzz 能够针对开源软件进行持续的模糊测试,它的目的是利用更新的模糊测试技术与可拓展的分布式执行相结合,提高一般软件基础架构的安全性与稳定性。OSS-Fuzz 结合了多种模糊测试技术/漏洞捕捉技术(即原来的libfuzzer)与清洗技术(即原来的 AddressSanitizer),并且通过 ClusterFuzz 为大规模可分布式执行提供了测试环境。
帮助开源社区使用创建更安全的应用,OSS-Fuzz在实现这一目标方面做得相当成功。OSS-Fuzz在200个开源程序中发现了超过14000个漏洞。
地址:https://github.com/google/oss-fuzz
boofuzz模糊测试框架是基于已经不再维护的Sulley开发的。该工具使用Sulley核心代码,但致力于不断改良。boofuzz是作为Python库安装的。开发人员增加了在线文档、对更多通信媒介的支持、可扩展故障检测和一个易于使用的界面。该工具还将串行模糊测试、以太网和UDP广播添加到了默认功能里。boofuzz还可将测试结果以CSV文件格式导出,以便在修复检出故障时可以先研究所有被触发问题的完整列表。
地址:https://github.com/jtpereyda/boofuzz
当红模糊测试工具之一,发现了逼出Epiphany Web补丁的漏洞和可致Mozilla Firefox触发缓冲区溢出的漏洞。
BFuzz是基于输入的模糊测试器,以URL和浏览器作为其输入方式。这个意义上讲,该工具很像DAST工具,适合重度依赖这些东西的公司企业,因为BFuzz使用类似的测试方法,但找寻不同类型的错误。
地址:https://github.com/RootUp/BFuzz
8. PeachTech Peach Fuzzer
PeachTech Peach Fuzzer是PeachTech公司出品的商业模糊测试工具,很多繁琐的事情都不需要测试人员亲力亲为了。测试人员只需要用该公司所谓的Peach Pit加载并配置该模糊测试引擎即可。
Peach Pit是预先编写好的测试定义,覆盖一系列不同平台。PeachTech表示,每个Pit包含适用特定目标的规范,比如目标摄入的数据结构,数据流入和流出被测设备或应用程序的方式等。这样测试人员就可以几乎不用设置,便能将精力集中在他们的模糊测试上了。用户使用PeachTech创建自己的Pit也很简单,令Peach Fuzzer还可用于专用系统。
由于Peach Fuzzer引擎可以Peach Pit编程的原因,几乎所有系统都在该工具的测试范围之内:Mac、Windows、Linux,也可以用于模糊测试网络协议、嵌入式系统、驱动、物联网设备,只要是能接受命令而易受模糊输入困扰的系统,就能用Peach Fuzzer进行测试。
地址:http://www.peach.tech/products/peach-fuzzer/
AI模糊测试采用机器学习及类似技术查找应用或系统中的漏洞。智能约束算法和遗传算法是两种主流的智能模糊测试算法,上面提到的AFL就是采用遗传算法。此外,还有一些AI模糊测试工具:
9. 微软开发的Security Risk Detection (MSRD)
MSRD是一个人工智能驱动的动态应用安全测试服务,可以优化web应用开发周期,以便在bug和安全风险被引入代码库时识别和纠正它们。
地址:https://www.microsoft.com/en-us/security-risk-detection/
10. ClusterFuzz
American Fuzzy Lop (AFL)使用遗传算法。该工具集是基于云的新工具Fuzzbuzz的核心,也是谷歌ClusterFuzz项目的一部分。ClusterFuzz是一个高度可伸缩的模糊测试基础设施,Google使用ClusterFuzz对所有Google产品进行模糊化,并将其作为OSS-fuzz的后端。
地址:https://security.googleblog.com/2019/02/open-sourcing-clusterfuzz.html
11. Synopsys Defensics Fuzz Testing
Synopsys提供的Defensics是一个全面、通用、自动化的模糊测试框架,能够帮助企业高效、有效地发现和修复软件中的安全弱点。这种基于格式生成的模糊器采用有针对性的智能方法进行负面测试;高级文件和协议模板模糊器使用户能够构建自己的测试用例。SDK 支持专业用户使用 Defensics Framework开发自己的测试用例。
地址:https://www.synopsys.com/software-integrity/security-testing/fuzz-testing.html
12. Fuzzbuzz
Fuzzbuzz是一个模糊测试平台,通过自动化的复杂的基础设施管理和设置以及与工具的连接,将模糊化集成到DevOps工作流中。该平台在发现缺陷时发出警报,消除重复数据,并对其进行分类,以消除噪音和误报。
地址:https://www.fuzzbuzz.io/
模糊测试的目的是发现软件安全漏洞,已经成为软件安全测试的主流测试技术,迄今为止,这项技术已经帮助人们在各种软件中发现了数千个安全漏洞。而且,随着“软件定义一切”和万物互联时代的到来,软件安全必将日益重要。因此,作为软件测试人员,有必要掌握模糊测试的技术和工具。
想了解更多模糊测试技术,可以点击“阅读原文”,参考微软研究员于2020年4月发表的文章“Fuzzing: Hack, Art, and Science”
特别声明:
本文来自"软件质量报道"。上述内容仅代表作者或发布者的观点,与中国电子信息工程与测试网的立场无关。如有任何疑问或了解更多,请与我们联系。电话:01-87660482 邮箱:ceietn@sina.com