模糊测试--提升测试的非用例覆盖面

自动化测试技术18:模糊测试,正在逐渐改变软件测试的生态

什么是模糊测试?

模糊测试(又称应用程序模糊测试),可帮助团队发现软件应用程序源代码中的安全漏洞和错误。

有别于静态应用安全测试(SAST)等传统软件测试方法,模糊测试采用了一种独特的方法。

它基本上是用随机输入对代码进行轰炸,目的是引发崩溃,从而揭示隐藏的缺陷,否则这些缺陷可能会一直未被发现。这些代码缺陷(包括与业务逻辑相关的问题)标志着容易受到安全威胁的潜在高风险区域。

当出现故障或漏洞时,fuzzer(一种专门用于找出这些崩溃潜在原因的工具)就会介入,针对源代码中的特定弱点进行攻击。模糊器(fuzzer)擅长于暴露可被 SQL 注入和跨站脚本等攻击利用的漏洞,这些攻击是恶意行为者用来破坏安全、窃取信息或破坏系统的手段。

一个简单的用例示例

假设用户需要在网络表单上输入电子邮件地址。

在传统测试中,通常会验证输入的正确性,确保符合预期格式(例如,包含"@"和域)。

下面是一些经典测试案例:

1、输入一个有效的电子邮件地址(如 "user@example.com")。测试通过,因为它符合预期格式。

2、输入无效的电子邮件地址(如 "user@")。由于格式出乎意料,测试失败。

在某些情况下,甚至可以添加一个额外的测试用例来覆盖空状态,仅此而已。

现在,我们来引入模糊测试。

模糊测试包括注入各种意外的、通常是恶意的输入,以识别漏洞或意外行为。

在这种情况下,模糊测试可能包括以下输入:

  • 很长的电子邮件地址

  • 带有特殊字符的电子邮件地址

  • 域名不完整的电子邮件地址(如 "user@")

  • 带有非标准字符的电子邮件地址(如 "user@ex@mple.com")

  • 非标准编码或编码组合(如URL编码、HTML实体)

模糊测试的目标是确定系统如何处理这些意外输入。模糊测试将揭示传统测试可能忽略的潜在问题,例如:

1.系统无法处理过长的输入,导致潜在的缓冲区溢出。

2.因特殊字符导致注入攻击而产生的安全漏洞。

3.遇到不完整或畸形的电子邮件地址时,系统崩溃或出现意外行为。

4.可能导致跨站脚本 (XSS) 或其他安全漏洞的编码相关漏洞。

在这个例子中,模糊测试有助于发现传统测试可能忽略的漏洞和薄弱环节,最终提高系统的整体稳健性和安全性。在处理现实世界中可能出现的意外输入时,模糊测试尤为重要。

如果你觉得这个例子很有用,那么想象一下,把接受不同输入数据类型的多个输入字段的测试用例结合起来...... 

模糊测试仅仅是随机吗?

看到这里,有人会问这不就是随机数自动化测试吗?怎么就叫模糊测试了呢?

随机测试中最著名的例子就是Android的Monkey Test(猴子测试)。其思想就是模拟猴子毫无逻辑的操作,以此来测试手机软件的健壮性。但它只是测试用户界面上的随机操作,有些深层次、底层的问题是很难发现的,如通讯协议的缺陷。

比较起来,模糊测试用例的变异,是建立在一定的规则上的随机,用例生成有如下两种算法:

基于生成:根据协议或接口规范进行建模,由模型直接生成新的测试用例。我们知道某些程序是无法接收非结构化的输入的,因为它对输入有严格的规则,例如协议规范、SQL语句。因此测试引擎在测试前需要预先学习相应的语法、语义规则,对其进行建模,并在此基础上才能变异出有效的测试用例。

基于变异:在已知数据样本的基础上通过变异的方法生成新的测试用例。例如要对一个图片文件进行变异,用户就需要提供一个相应格式的图片文件,变异生成器会基于这张图片进行变异。目前这种技术主流是灰盒模糊测试,在对样本进行变异的时候,能够获取代码逻辑信息,基于路径反馈进行变异,所以可达到一个很好的测试效果。

因此可以说,模糊测试与纯随机自动化测试,是完全不同的。模糊测试构造出的测试用例其针对性、有效性更强,测试效率更高。并且随着人工智能技术的发展,模糊测试技术结合更多种的智能分析方法,测试覆盖率会更高,测试用例的构造也会更快、更准确地发现程序深层次的缺陷。

模糊器如何生成输入数据?

模糊器(fuzzer)旨在测试不同数据类型的各种攻击组合,包括:

  • 数字:包括有符号和无符号整数、浮点数和其他数字数据类型。

  • 字符:模糊测试涉及操作字符数据,如URL、命令行输入和元数据(如用户输入文本,包括ID3标签)。

  • 纯二进制序列:模糊器也可对原始二进制数据进行操作。

通常采用的模糊处理方法是为每种数据类型定义一组 "已知危险值 "或模糊向量,然后注入或组合这些值。例如:

  • 对于整数,可能需要使用零、潜在的负值或极大的数字。

  • 在处理字符数据时,模糊器可能会引入转义或可解释字符和指令。例如,在 SQL 请求中,模糊测试可能涉及测试引号、命令和其他敏感字符。

  • 在二进制数据领域,模糊器经常使用随机二进制序列来发现漏洞和弱点。

模糊测试能发现真正的缺陷吗?

模糊测试技术已经是软件测试、漏洞挖掘领域中最有效的手段之一,可发现程序中那些引起系统运行异常的缺陷。

近几年许多国际知名的大型公司也在开发自己的模糊测试工具,如FAANG(Facebook、Apple、Amazon、Netflix和Google)已经广泛使用模糊测试来检测未知/0-day漏洞,以确保其产品的健壮性和安全性。Google对模糊测试尤为重视,Chrome在最近几年利用模糊测试找到16000个bug,占所有bug总量的80%以上。而微软也将模糊测试应用在Windows内核、Office等产品的测试中,据报告Windows发现的安全漏洞约1/3是通过模糊测试技术发现的。此外,根据公开资料统计模糊测试也是黑客们发现软件漏洞的首选技术。因此可以说模糊测试技术是目前世界范围内热门的动态挖掘软件深层次缺陷的有力工具。

模糊测试,它的能与不能

世界上没有任何一种测试技术或工具是完美的,也没有任何一种测试技术或工具,可以保证软件0缺陷。模糊测试技术也是如此,它善于发现某些类型缺陷的同时,也存在着一定的局限性。

这些缺陷,“我可以”

由于模糊测试的特性,模糊测试工具更擅长发现那些会引起系统运行异常的缺陷,其缺陷类型如下图所列。

图片

这些缺陷,“Say sorry”

模糊测试是发现那些引起系统运行异常的缺陷、未知漏洞的利器。但对逻辑上的缺陷却无能为力,例如访问控制漏洞、代码逻辑错误漏洞、后门、多点触发的漏洞(当前的模糊测试技术只能挖掘出由单个因素引起的漏洞)等,这些类型缺陷就无法通过模糊测试发现。

模糊测试的工作流程

结合模糊测试的特点来看,它对被测程序是有要求的,一是可以动态运行,二是一定要有输入入口。

对于一个模糊测试通用的测试流程,其描述如下:

01首先被测系统要动态运行,被测工具要与被测系统建立联系;

02测试工具根据变异算法对原始测试用例进行变异;

03测试工具将生成的测试用用例发送给被测系统的入口;

04测试工具监控被测系统的运行状态(是否可以正常响应,是否可以正常运行);

05测试工具如果发现缺陷,进行记录;

06重复上述操作,直至测试结束。

图片

模糊测试的应用场景,那些正在被fuzzing的程序

目前模糊测试技术的应用十分广泛, 可以测试的对象种类繁多, 比如源代码、API接口、通讯协议、数据库系统等。

源代码模糊测试,是一种灰盒模糊测试。可通过特定的编译器对源码进行编译,在其编译的过程中对源代码进行插桩,取得代码的逻辑结构,并基于路径反馈进行变异。然后通过程序入口输入大量的非预期输入,观察该程序是否能够正常响应。这种类型的模糊测试工具,可以作为单元测试在开发阶段进行,比如安般科技的拳头产品——易恒智能模糊测试系统。

Web 应用程序容易受到各种类型的漏洞攻击, 如拒绝服务、跨站点编写脚本等。通过对Web API的接口函数进行模糊测试,可保证Web应用程序的安全性和稳定性,安般科技旗下的易察WEB/API 模糊测试系统正是该类型产品。

通讯协议的模糊测试可能是最广泛被利用的模糊测试类别。主要是因为它能够发现很多高风险漏洞,其测试对象包括工控设备、智能驾驶设备、物联网设备等。安般科技的易侦协议模糊测试系统就在被大范围的商业化应用中。

针对数据库系统的模糊测试,是通过对数据库访问操作语句进行变异,然后将测试用例输入到数据库系统中,但其变异算法较为复杂,因此目前成熟的数据库系统模糊测试工具较少,但该类型的模糊测试工具对推进国产软件自主化的发展价值巨大,安般科技相关产品也将推出上市。

模糊测试工具有哪些?

一些免费的开源模糊测试工具,为识别和缓解软件应用程序中的漏洞提供了重要资源:

1.Google OSS-Fuzz

Google的OSS-Fuzz项目是一项开源计划,源于他们在开发Chrome OS和 Chrome浏览器时对模糊测试的广泛使用。

它利用各种模糊引擎,包括AFL++、libFuzzer和Honggfuzz。

兼容C、C++、Rust、Go、Python、Java/JVM等语言,还可能兼容其他语言。

支持x86-64和i386版本,拥有强大的社区支持。

图片

2.FuzzDB

FuzzDB是一个广泛的攻击有效载荷和注入技术库,旨在暴露应用程序中的漏洞。

按平台类型、潜在问题、源暴露等进行分类。

非常适合与可编程模糊引擎一起使用,结合已知和未知的攻击模式。

3.Ffuf(Fuzz Faster U Fool)

Ffuf 是一个用Go编写的模糊引擎,是一个功能强大、基于命令行的工具。

它功能强大,基于命令行,适用于常见的模糊任务,如测试应用程序对未知 GET和POST请求的响应。

定期更新新功能;支持赞助模式,可立即获得更新。

图片

4.Google ClusterFuzz

谷歌的ClusterFuzz用于发现Chrome浏览器中的漏洞,它与OSS-Fuzz项目集成,可以对任何程序或应用程序进行模糊测试。

值得注意的是它的扩展能力,甚至可以运行在10万台虚拟机上进行大规模测试。

图片

5.go-fuzz

备受推崇的模糊平台,用于测试Go语言包,尤其是解析复杂输入的语言包。

对于加强解析来自潜在恶意源(如基于网络的应用程序)的输入的系统而言,该平台非常有价值。

图片

6.Jazzer.js

Jazzer.js是Code Intelligence开发的一款专为Node.js平台定制的覆盖引导型进程内模糊器。

它以libFuzzer为基础,为JavaScript生态系统引入了仪器驱动的突变功能。

它是通过系统识别漏洞来增强Node.js应用程序安全性的理想工具。

模糊测试的优点和局限性

作为当今世界极具创新的测试技术,模糊测试一定有其特殊性,我们可以从如下几个方面进行总结:

  • 自动化:模糊测试是一种自动化的测试方式,测试用例是由测试工具自动产生的,其测试效率高,且不依赖于测试人员的经验;

  • 测试更全面:目前普遍使用的测试方式,大部分集中在功能测试,并结合一些非功能测试,如压力测试。但这些测试都是正面测试,很少有工具专注于负面测试(即验证软件不执行其不应该完成的工作)。而模糊测试的出现,正弥补了其他测试方法的不足,它专注于负面测试,与其他测试技术联合使用可全面保障软件的安全性和稳定性;目前市面上的自动化测试工具更注重已知漏洞的发现,忽视了未知漏洞的危害,模糊测试工具正是发现未知漏洞的利器;

  • 无误报:模糊测试是动态测试技术,因此查找到的缺陷几乎没有误报。而目前市面上流行的基本都是静态分析工具,其误报率远远高于模糊测试工具;

  • 更高效:模糊测试变异的测试用例,是有一定规则的随机,相较于随机自动化测试工具,模糊测试的测试用例能达到更好的效果。

但是,模糊测试也存在一些局限性:

  • 遗漏某些攻击类型:模糊测试无法有效识别不会导致程序崩溃的安全威胁,如间谍软件、病毒、蠕虫、木马和键盘记录程序。

  • 设置复杂:管理和监控模糊测试需要专业的编码知识和有效的错误处理。

  • 范围有限:模糊测试仅提供错误检测,但不能对安全性、质量和有效性进行全面评估。在软件开发过程中,有必要采用功能测试和 beta 测试等其他测试方法。

模糊测试的发展方向

模糊测试通过其特定的测试方法可以发现程序代码中隐藏的、很难通过常规测试方法发现的缺陷和漏洞,所以在现实中的意义巨大。

未来,模糊测试会逐步深入到开发流程中,在开发的各阶段对程序进行模糊测试。例如在软件设计阶段,针对软件架构设计好模糊测试方案,引入模糊测试工具进行单元测试,实现测试左移;在测试验证阶段,基于设计好的模糊测试方案,进行大规模的模糊测试,同时可将模糊测试工具集成到CICD流程中进行全自动化的模糊测试。

在模糊测试应用场景方面,由于嵌入式技术的迅猛发展以及多个领域的广泛使用,针对嵌入式设备的模糊测试也是一个发展方向,但模糊测试要求被测程序动态运行,因此与固件仿真技术相结合,可使模糊测试技术更广泛地应用到嵌入式领域中。目前将两者成功结合的成熟经验在世界范围内都比较欠缺,但安般科技在该领域已经取得了阶段性的成果,并开始逐步商用,填补了国内外的空白。

另外,随着对模糊测试技术的重视,各国也纷纷将模糊测试技术纳入软件测试标准中,未来模糊测试工具将会进一步集成到各大测试平台,形成统一的测试规范。

简而言之,模糊测试正在逐渐改变软件测试的整个生态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值