Fuzzing技术简介

一、什么是Fuzzing?

Fuzz本意是“羽毛、细小的毛发、使模糊、变得模糊”,后来用在软件测试领域,中文一般指“模糊测试”,英文有的叫“Fuzzing”,有的叫“Fuzz Testing”。本文用fuzzing表示模糊测试。

Fuzzing技术可以追溯到1950年,当时计算机的数据主要保存在打孔卡片上,计算机程序读取这些卡片的数据进行计算和输出。如果碰到一些垃圾卡片或一些废弃不适配的卡片,对应的计算机程序就可能产生错误和异常甚至崩溃,这样,Bug就产生了。所以,Fuzzing技术并不是什么新鲜技术,而是随着计算机的产生一起产生的古老的测试技术。

随着计算机的发展,Fuzzing技术也在不断发展。

1988年,在威斯康星大学的一个教学项目中,正式使用“Fuzzing”这个词。该项目主要研究对UNIX的模糊测试。

1995年,第一个基于图形化界面的Fuzzing软件诞生,主要测试系统API、网络协议。

2012年,Google发布第一款基于云的Fuzzing测试框架,用于测试Chrome浏览器,安全研究人员可以上传自己研发的Fuzzer来测试和收集Bug。

2016年,微软发布基于云的Fuzzing测试云服务。也是这一年,Google宣布OSS-Fuzz测试项目成为开源项目。

Fuzzing技术是一种基于黑盒(或灰盒)的测试技术,通过自动化生成并执行大量的随机测试用例来发现产品或协议的未知漏洞。

二、Fuzzing有用么?

Fuzzing是模糊测试,顾名思义,意味着测试用例是不确定的、模糊的。

大家可能会有疑问,计算机是精确的科学和技术,测试技术应该也是一样的,有什么的输入,对应什么样的输出,都应该是明确的,怎么会有模糊不确定的用例呢?这些不确定的测试用例具体会有什么作用呢?

为什么会有不确定的测试用例,我想主要的原因是下面几点:

1、我们无法穷举所有的输入作为测试用例。我们编写测试用例的时候,一般考虑正向测试、反向测试、边界值、超长、超短等一些常见的场景,但我们是没有办法把所有的输入都遍历进行测试的。

2、我们无法想到所有可能的异常场景。由于人类脑力的限制,我们没有办法想到所有可能的异常组合,尤其是现在的软件越来越多的依赖操作系统、中间件、第三方组件,这些系统里的bug或者组合后形成的bug,是我们某个项目组的开发人员、测试人员无法预知的。

3、Fuzzing软件也同样无法遍历所有的异常场景。随着现在软件越来越复杂,可选的输入可以认为有无限个组合,所以即使是使用软件来遍历也是不可能实现的,否则你的版本可能就永远也发布不了。Fuzzing技术本质是依靠随机函数生成随机测试用例来进行测试验证,所以是不确定的。

这些不确定的测试用例会起到我们想要的测试结果么?能发现真正的Bug么?

1、Fuzzing技术首先是一种自动化技术,即软件自动执行相对随机的测试用例。因为是依靠计算机软件自动执行,所以测试效率相对人来讲远远高出几个数量级。比如,一个优秀的测试人员,一天能执行的测试用例数量最多也就是几十个,很难达到100个。而Fuzzing工具可能几分钟就可以轻松执行上百个测试用例。

2、Fuzzing技术本质是依赖随机函数生成随机测试用例,随机性意味着不重复、不可预测,可能有意想不到的输入和结果。

3、根据概率论里面的“大数定律”,只要我们重复的次数够多、随机性够强,那些概率极低的偶然事件就必然会出现。Fuzzing技术就是大数定律的典范应用,足够多的测试用例和随机性,就可以让那些隐藏的很深很难出现的Bug成为必然现象。

Fuzing技术在各个大厂已经广泛应用,所以暴露出来的Bug很少明确标识是使用Fuzzing技术发现的,我们来看几个明确说明使用Fuzzing技术发现的漏洞:

1、2007年,Team509安全团队使用Fuzzing技术发现的QQ的一个内存溢出漏洞。腾讯为此专门发布了漏洞安全公告,这也是腾讯的第一个安全公告。后来,腾讯安全团队利用Fuzzing技术,又发现了QQ在远程协助、视频通话等模块中的多个远程溢出漏洞。

2、2014年,OpenSSL 的心脏滴血漏洞被Fuzzing技术发现,该漏洞的影响超过50万个网站。

3、2016年,威努特使用Fuzzing技术,发现4个高危工控漏洞(已经上报CNVD),涉及AB、施耐德、腾控等厂商。

另外,结合各个大厂(比如谷歌、微软)对Fuzzing技术的支持,可以肯定的说,Fuzzing技术已经是软件测试、漏洞挖掘领域的最有效的手段之一。Fuzzing技术特别适合用于发现0 Day漏洞,也是众多黑客或黑帽子发现软件漏洞的首选技术。Fuzzing虽然不能直接达到入侵的效果,但是Fuzzing非常容易找到软件或系统的漏洞,以此为突破口深入分析,就更容易找到入侵路径,这就是黑客喜欢Fuzzing技术的原因。

三、Fuzzing是怎么工作的?

Fuzzing工具是一套自动化测试软件(有些会和硬件服务器一起销售),根据前面的分析,其核心功能包括下面几点:

1、自动化测试框架,统一管理组织测试套件和测试用例的执行;

2、测试用例生成器,也叫Fuzzer,用于生成随机的测试用例;

3、监视器,用来监测被测设备是否正常,及时发现问题;

4、报表及回溯模块,生成测试报告,并跟踪定位问题的上下文信息,方便问题回溯和进一步的分析。

根据测试的对象不同,Fuzzing工具可以分为不同的种类,比如:文件Fuzzing、Web Fuzzing、命令行Fuzzing、API Fuzzing、网络协议Fuzzing、环境变量Fuzzing等等。各种Fuzzing的大体框架和技术都是类似的,今天我们主要以网络协议Fuzzing为例,来讲一下Fuzzing的基本框架:

这个框架中,Fuzzing引擎是系统的核心,它的作用是生成测试用例。

Fuzzing测试是一个无限空间的测试,逻辑上讲可以有无限个测试用例,为了有效的测试被测对象,必须对随机用例的生成做一些限制,即在一定的范围内生成测试用例。好比我们要攻击一个房子,应该优先寻找这个房子在门、窗、屋檐等结合的地方的漏洞,这些地方是相对薄弱的环节,否则即使花费很大的代价也可能一无所获。

Fuzzing工具的优劣,主要区别也就在于以下几点:

1)硬件性能,性能越好,越能生成和执行更多的测试用例;

2)Fuzzing引擎算法,算法越好越能生成有效的测试用例,也更容易发现未知的漏洞;

3)监控模块的性能和完备性,好的监控模块能更及时的发现问题。

上述的几点区别中,硬件及监视器的差异越来越小,目前业界基本都可以购买到同样基本的硬件,所以Fuzzing引擎算法的优劣就是判断Fuzzing工具优劣的关键。

Fuzzing引擎算法中,测试用例的生成方式主要有2种:

1)基于变异:根据已知数据样本通过变异的方法生成新的测试用例;

2)基于生成:根据已知的协议或接口规范进行建模,生成测试用例;

一般Fuzzing工具中,都会综合使用这两种生成方式。

基于变异的算法核心要求是学习已有的数据模型,基于已有数据及对数据的分析,再生成随机数据做为测试用例。

基于生成的算法核心是对已有协议或接口的建模,以及基于模型的随机生成算法。模型的定义越精准,越有利于Fuzzing测试效率的提升,就类似于上文提到的攻击一所房子,如果预先能精准的描述一个房子的门在哪、窗户在哪、锁是什么样的、天窗是什么样的,那对于找到房子的漏洞就有极大的帮助,知己知彼,百战不殆。

四、Fuzzing今后的发展方向是什么?

Fuzzing技术作为一个既古老又现代的测试技术,也在随着近年来安全问题的逐渐突出,受到越来越多的关注。

Fuzzing技术作为一种自动化测试技术,也在随着计算机技术的发展而发展,今后的发展可以简单归纳为下列几个方向:

1、测试平台化、通用化。这是任何计算机技术发展的必然方向,目前微软、谷歌发布的基于云的Fuzzing测试平台已经验证了这一点。平台化、通用化的好处是利用专家的能力,普及Fuzzing技术,让大多数没有Fuzzing技术能力的厂商和公司也可以对自己的产品进行Fuzzing测试。另一方面,因为大量产品的测试,反过来促进Fuzzing平台的成长和技术进步。

2、协议自动分析能力的提高。在不知道协议细节的情况下,主要是基于变异的生成方法,目前的Fuzzing技术还很薄弱,生成的测试用例效率很低。随着近年来机器学习算法的进步,今后在Fuzzing领域也将会带来相应的影响,即根据捕获的报文(或文件)进行协议分析,为协议智能建模,而不是傻傻的随机改变数据进行测试。

3、多维综合关联能力的提高。目前,大多数的Fuzzing测试用例都是一维的,即由一个用例或一个变量测试验证一个漏洞,而有些严重的漏洞是由多个问题共同作用引起的。今后随着人工智能技术的演进,可以逐步用来改进Fuzzing测试,可以做多维关联验证,那时候的Fuzzing工具,就相当于一个老练的黑客,而现在的Fuzzing工具还仅仅是一个自动化测试工具。

五、Fuzzing适用于工控领域么?

工控安全问题近年来刚刚引起人们的注意,Fuzzing技术因为其自动化、方便快捷,在工控设备的安全性测试方面很受重视,目前的ISA工控安全认证里面,对工控协议的健壮性测试很大一部分就是基于Fuzzing技术进行测试的。

当人们开始测试工控系统或设备的安全性时,结果确实是不容乐观,或者说问题很严重。

根据Synopsys公司在2017年初的统计,各个领域产品的Fuzzing测试结果如下图:

这个图中,横坐标表示测试失败的时间,越长表示质量越好,越短表示质量越差。纵坐标表示测试失败的用例数量,越高表示质量越差,越低表示质量越好。

可以看出,工控领域(ICS)是安全质量最差的,也说明了Fuzzing测试在工控领域的测试效果非常好,在最短的时间内发现了最多的问题。

工控领域的安全性差到什么程度,大家看一下这个表就会有更深的体会:

从这个表格可以看出,MMS协议在Fuzzing测试中仅仅过6.6秒就失败(测试用例没有通过)了,其他几个协议也在分钟级别就遇到了测试失败,而OPC协议在Fuzzing测试中竟然有16,692个用例都失败了。

工控设备、系统及其通信协议因为常年躲在互联网后面,安全问题没有受到大家的重视。近年来,随着互联网+的逐步拓展,越来越多的工控设备开始暴露在公网上,工控安全问题越来越受到重视。从上面的Fuzzing测试数据可以看出,工控系统基本就是一个不设防的系统,如果真的遇到攻击,基本上是瞬间缴械。

 

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值