模糊测试(Fuzz Testing)一直被黑客们广泛使用,却很少应用于商业软件系统开发过程中。在互联网安全产业,如何让模糊测试重新焕发活力,是我一直在思考的问题。
概念及目的
在计算机领域,模糊测试是一个古老却容易被忽视的测试领域,它的诞生绝对早于真正意义上的自动化测试。甚至可以这么说:自从计算机允许用户输入,模糊测试便应运而生了。
所谓模糊测试,顾名思义可以理解成用一段非常规的字符串(或值)去替换正常的输入值,或者用非常规的、不合法的文件替换合法的文件输入,然后检测系统的行为是否正常、模块是否被破坏。虽然概念简单,但模糊测试的作用是非常巨大的,有时它能帮助发现严重的安全漏洞,这也是它深受广大黑客喜爱和认可的原因。
模糊测试在黑客界比较流行,凡是有输入点的地方总有黑客存在。基于对被攻击系统的学习和研究,黑客们会尝试有目的地设计出各种不同的随机输入值去攻击系统直至找到系统的漏洞。SQL Injection Attack便是黑客们常用的一个模糊测试的经典案例。
为了消除被攻击的风险,必须先发制人,在产品发布之前更多地发现产品的安全问题和漏洞便成了软件测试工作者关注的问题。
应用场景
我们的一款商业邮件服务器安全防护系统,目前用于测试的基本邮件库里大约有20万封测试邮件样本,扩展邮件库里大约有100万封。作为普通的压力测试之用,这些样本看起来已经足够多,而且邮件样本在不断更新,但从模糊测试的角度看,依然有以下不足点。
邮件库里的邮件样本是固定的,系统的输入点就是这些邮件的发送和接收,然后对邮件进行分析,固定的量不能覆盖更全、更完整的测试面。
在版本跟进过程中总是使用固定的样本不符合日新月异的测试需求,容易产生测试惰性。所谓惰性,就是固定的样本总是发现相同的问题,而这些问题早在之前就被发现了,再用同样的样本做压力测试很难发现新问题和新漏洞。
以上两个不足点的共同之处就在于样本是固定的。对此,我们的解决方案就是在压力测试中引入模糊测试,基于固有的测试样本基数模糊生成更多甚至成指数倍递增的模糊样本库,而且模糊的策略不同,模糊出来的样本也不尽相同,这便实现了我们测试的初衷——让样本更多、更动态。
在压力测试中如何进行模糊测试
压力测试中引入模糊模块在流程上是一个很简单的概念,就是将原始的输入样本进行一番模糊,生成更多的样本,在本文应用场景下,便是基于已有的邮件样本库然后模糊出来更大的样本库,示意流程如图1所示。
图1 模糊测试流程图
其中①便是压力测试系统新增的Fuzz模块,通过Fuzz模块扩容后的邮件样本库(扩容倍数会依据Fuzz策略不同而定)在压力测用例分发程序分发样本到指定的已安装了邮件安全产品的邮件服务器上去。
其中②表示分发程序根据样本分发策略具体进行分发的过程。
其中③表示新引入的自动化测试流程,基于Fuzz的压力测试后,产品需要进行安全漏洞和功能性验证,此处需要启动的自动化测试范围需要根据压力测试的策略和目标而定,最常见的比如:
● 没有程序和服务的崩溃与挂起。
● 没有内存泄漏。
● 通过最基本的(优先级别最高的)测试用例。
一般说来,模糊测试和压力测试中发现的问题都具备以下特点:
● 严重的安全漏洞和程序异常。
● 普通人工测试和自动化测试很难复现的bug。
● 比较难解的bug。