在创建应用程序时,程序员会花费大量时间预测用户将如何使用他们的软件以及这些操作会产生什么样的效果。优秀的程序员不仅有着简洁、高效的编码质量,还要考虑到发生意外的情况。但没有人能够预测用户所有的可能操作,尤其是非常规性的操作(比如黑客攻击,安全人员尤其关注这一点),这时就需要模糊测试(fuzzing)。
什么是模糊测试?
模糊测试(以下简称模测)是一个自动化的过程,在这个过程中,测试引擎尝试向应用程序发送大量意外的、错误的或随机的输入,以观察程序的反应。然后,再根据情况编写合适的响应代码,尽可能的保证应用程序的稳定性和安全性。
例如,如果一个电子商务网站用户订购了200亿件紧腰夹克,会发生什么?网站会崩溃吗?会打折吗?或者拿它当正常订单处理吗?再比如,如果用户输入了有效的优惠券代码,但输错了地方会发生什么?回到网络安全上,如果恶意用户输入命令行功能、加密内容、操作系统命令或原始代码,应用程序将如何反应?
一个好的模测引擎可以回答所有这些问题,甚至更多。
模测工具如何工作?
由于模测的价值,有相当多的商业工具售卖,也有数百个优秀程序员在GitHub等平台上共享的免费工具。有不同类别的模测工具,如以发送大量随机信息为特色的,再比如,通过非常规输入来检测运行中的程序,还有专门用于测试可编程接口(API)的工具。
在大多数情况下,模测的目标是生成一些有效的意外数据,当然,至少是能够被测试软件解析器接受的数据。然后,提交应用程序对非正常输入所产生的结果,最为典型的,如程序崩溃。
模测工具可以支持各种编程语言进行测试,主流的如C、C++、Go、Rust、Python、Java、Kotlin、Scala和Swift。还有些测试工具只使用单一语言的应用程序测试。如,Python程序员的特定工具。但不管是哪种语言,合适的才是最好的。
本文尝试推荐一些顶级的模测工具。商业工具来自OWASP网站上的列表,免费工具则是在GitHub上搜索“fuzz”,按“打星”的人气数量排序,同时也兼顾另一个衡量受欢迎程度的指标,即该项目被分叉(fork)的次数。
四款商业模测
1. beSTORM
Beyond Security出品的beSTORM是商业市场上最通用的模测之一。无需访问源代码即可执行测试,几乎可与任何应用程序、协议、语言乃至硬件一起工作,甚至还可以测试为特定行业和特种应用设计的设备和程序。比如物联网、过程控制应用、与can总线兼容的汽车应用、航空工具和低耗能蓝牙设备。
多功能性是beSTORM的最为突出的价值所在,程序员只需学习使用单个界面,就可以针对几乎无限数量的设备或应用程序发起模测。beSTORM测试平台预置了250个测试模块,并且还能轻松地添加新的模块,以覆盖另类或专有的应用程序。
此外,beSTORM还可以作为云服务访问。通过这种方式,一个大型机构可以购买该平台,然后向不同地点的多个用户提供模测工具的使用。
2. CI Fuzz
该工具内置在一个Ubuntu虚拟机中,在本地或云端均可部署。将CI Fuzz集成到CI/CD(持续集成和持续交付)管道中,就可以在每次“pull Request”时自动运行。由于它是CI/CD过程的一部分,所以能够防止程序在有了新的更改时,无意中增加漏洞或破坏程序。如果发生问题也能很快被标记,从而很容易确定何时引入的程序错误。
每当CI Fuzz检测到错误时,它立即开始发送该输入的不同组合,以尝试映射问题的范围。然后生成一份详细的报告,以消除误报,并能够帮助程序员在修复代码时手动重现这些错误。
CI Fuzz引擎需要直接访问被测程序或应用程序的源代码,因此它只支持某些语言和框架,主要为C、C++、Java和Go。但该工具正在努力集成其他框架,如.Net Core和Python。
3. 新思模测套件(FTS)
与大多数产品相比,新思的模测产品有着不同的做法。FTS是一整套测试工具,每一个工具都针对于特定的语言、协议或用例,而不是一个测试工具去匹配尽可能对的应用程序。这种做法的好处在于,用户可以购买他们所需要模测工具,而无需购买他们可能永远不会需要的额外功能。
每个工具都有一组标准的功能,比如一组高度相关的现成测试用例、一个结果和报告分析组件、一个用于配置工具的图形界面,以及如何使用它的说明文档等。
FTS包括各种针对性的测试工具,从DNS服务器等常见组件,到CAN总线或IKEv2等很小众、专业的应用程序。用户购买工具时,还可配送一定程度的支持。
4. Mayhem for Code
ForAllSecure的这款模测具备大多数模测引擎的优点,并兼具额外的学习功能,因此可随着使用时间的延长变得更加高效。该平台可独立运行,尽量减少人工干预。
Mayhem for Code在持续运行期间,可学习环境并挖掘利用系统的深度信息。它甚至可以根据所学到的知识动态生成测试用例。简而言之,使用的次数越多、时间越长,它就能变得愈加高效和独立。
该平台目前可支持多种语言,如Java、Python、Ada、OCaml、Fortran、Jovial、C、C++、Go和Rust,且无需访问源代码。
六款免费/开源模测
1. PeachTech
PeachTech的模测在2020年之前一直都是商业付费产品,直到2020年被GitLab收购,并放出免费版本的PeachTech项目,但不再受支持或更新。
PeachTech投入了大量精力,具有高度可配置性,几乎可以用任何语言或在任何操作系统上运行。然而,其说明文档非常复杂,又取消了产品支持,用户需要了解很多模测试的知识,以及使用的语言或框架,才能获得该工具的益处。非专业人员不适用。
2. Google OSS-Fuzz
谷歌在为Chrome操作系统或浏览器开发新组件时,模测起到了很大的帮助作用,谷歌遂将其开源。
OSS-Fuzz适用于x86-64和i386版本,并利用了其他几种模测引擎,包括AFL++、libFuzzer和Hongfuzz,并支持多种语言,包括C、C++、Rust、Go、Python和Java/JVM代码。
OSS-Fuzz是目前GitHub上评价最高的项目之一,拥有一个很大的社区,并在开源社区中得到很多支持。
3. FuzzDB
FuzzDB本身并不是一个模测引擎,而是一个复杂的攻击载荷库和注入技术库(也许是世界上最大的库),用于破坏或入侵未得到恰当保护的程序和应用。这些攻击以各种方式进行分类,例如按平台类型、已知问题、潜在源暴露,以及许多其他的分类。
FuzzDB库的最佳利用方式,就是与可编程模测引擎结合。将FuzzDB中的攻击模式加载在模测引擎中,配合模测的随机输入,可覆盖很大范围,从已知攻击和漏洞到未知攻击和未发现的漏洞。
4. Ffuf (Fuzz Faster U Fool)
Ffuf是一个用Go语言编写的模测引擎。对于免费工具而言,它好用的出人意料。
它可以执行最常见的模测功能,如检查应用程序对未知的GET和POST请求的反应。Ffuf没有什么用户界面,主要使用命令行功能。但一旦学习了这些功能,就会了解它的强大之处。
Ffuf在GitHub上有许多如何部署的示例,开发人员还会定期发布新的功能和特性。虽然它是免费的,但属于赞助模式,新功能将优先发布给那些付费赞助该工具进一步开发的人。30天后,其他才可以使用新功能。
5. Google ClusterFuzz
Google ClusterFuzz是用来检查Chrome漏洞的模测引擎,它也是上述第二个免费工具OSS-Fuzz项目后端的一部分。但ClusterFuzz适用于任何程序或应用,而不仅仅是开源领域的程序或应用。
有了ClusterFuzz在后端的配合,OSS-Fuzz在谷歌产品中成功发现了超过2.9万个bug,在开源项目中成功发现了2.6万个bug。ClusterFuzz还设计成可在任何环境下运行,并具有高度可扩展性。该项目的GitHub页面列出了ClusterFuzz与10万台虚拟机一起工作的一个项目,可以说满足任何人所需要的可伸缩性。
6. go-fuzz
该平台是一个有着高分评级的模测工具,针对性地测试go语言中的包。它主要用于解析复杂文本和二进制输入的数据包。作者在Github的该项目页面中的说明,go-fuzz对于加固系统尤其有用,这些系统解析来自潜在恶意用户的输入,例如通过网页公开部署的任何内容。
go-fuzz的说明文档很好地描述了使用方法,同时,还附带了一个存储库,包含了大量测试函数和和初始输入设置的许多示例。
来源:数世咨询