模糊测试(fuzz testing)是一种安全测试方法,他介于完全的手工测试和完全的自动化测试之间。为什么是介于那两者之间?首先完全的手工测试即是渗透测试,测试人员可以模拟黑客恶意进入系统、查找漏洞,这对测试人员的要求比较高。能力强的测试人员可以发现比较多或者高质量的安全性问题,但是如果测试人员的能力不够,可能就不能找到足够多、威胁大的安全漏洞。所有渗透测试对人员能力的依赖性强,成本高,难以大规模的实施。
但是想用完全的自动化来实现渗透测试也不可行,同一套测试用例和方法不可能不加修改的就用在不同的产品上,因为各个产品的需求、实现、功能等等都不一样。测试过程中还需要测试人员的介入来分析结果、判断漏洞等等。那么,这种情况下我们就可以引入模糊测试。
为了简单起见,假定我们要测试的应用是一个C/S应用的服务端程序。这个程序运行在Unix平台上,名字叫做Tserver。我们唯一知道的信息就是客户端和Tserver之间使用基于TCP/IP的自定义协议进行通讯。这种情况下,我们该如何尝试找到应用系统中可能的漏洞?
方法1:
如果我们手头上有Tserver的源代码,通过代码审查显然可以找到可能的漏洞。就算没有源代码,通过逆向工程方式,用代码审查的方式也可以达到找到漏洞的目的。当然,这必然要求审查者具有足够好的技能,而且,被测应用规模越大,需要付出的成本也就越高。
方法2:
我们可以在知道产品服务器端和客户端的通信协议后,根据协议的格式、定义,自己准备大量的测试数据,从客户端发送给服务器端,从而试图找到一些安全漏洞。
但是分析通信协议很难,而且自己准备数据成本太高,那么我们就可以用模糊测试的方式,让机器生成测试数据,病发送给服务器,最后测试人员再对测试结果进行分析。
模糊测试充分利用了机器的能力:随机生成和发送数据;同时,也尝试将安全专家在安全性方面的经验引入进来。从执行过程来说,模糊测试的执行过程非常简单:
- 测试工具通过随机或是半随机的方式生成大量数据;
- 测试工具将生成的数据发送给被测试的系统(输入);
- 测试工具检测被测系统的状态(如是否能够响应,响应是否正确等);
- 根据被测系统的状态判断是否存在潜在的安全漏洞。
比如我们知道一个Tserver和客户端的通信协议的定义和格式,我们就可以用一种模糊测试工具用模板方式把协议描述出来,然后工具根据模板生成大量的测试数据,然后把测试数据发送给Tserver。同时测试人员监控Tserver(可以通过其他工具),假如Tserver出现异常比如无响应、响应错误等等,测试人员就可以通过日志等资料分析问题,并报告异常。
可以阅读《模糊测试——强制发掘安全漏洞的利器》来了解更多模糊测试。
模糊测试工具:
一般有Spike,Bunny,teenage mutant ninja turtles,sulley等等,Cisco用Codenomicon。
参考:http://www.ibm.com/developerworks/cn/java/j-fuzztest.html
https://en.wikipedia.org/wiki/Fuzz_testing