在最近项目的测试中,我们引入了模糊测试(Fuzz testing)。在这个过程中,接触到了Sulley,一款用Python实现的用于网络协议fuzz testing的开源测试框架。跟其他的开源工具比起来,使用上比较灵活,而且也很方便。
举例来说,在测试过程中如果出现了目标程序crashing的情况,会导致后续的测试无法继续进行下去。针对这种情况,Sulley提供了一个用Python实现的进程监控的Agent(process_monitor.py),它的功能就是类似于watchdog,一旦检测到程序崩溃,会自动重启目标程序,使后续测试能顺利进行下去。如果程序的内部数据,比如某些配置已经由于之前的Fuzz testing被破坏掉了,只是简单重启目标程序还不足以让后续的测试正常的进行,可以选择在测试之初,直接把目标程序装在vmware虚拟机上,同样的,Sulley也提供了一个用来控制vmware虚拟机的Agent(vmcontrol.py),可以完成对虚拟机及snapshot的操作。有个这个Agent的协助,我们可以在目标程序环境准备好之后但是测试开始之前,对虚拟机做个vsnapshot,然后在测试开始之后,一旦发现crash,可以利用这个Agent直接把虚拟机rollback到之前预存好的snapshot状态,然后测试继续,够直接吧,呵呵。
网上关于Sulley的资料不多,在这里做点笔记,供大家参考。
什么是模糊测试(Fuzz testing)
模糊测试(Fuzz testing),根据WiKi上给出的定义,就是指一种软件测试方法:通过给程序提供不合法的,没有考虑到的,随机的输入,一旦程序出错了(比如crashing,或断言失败),则Bug被发现。根据程序输入的不同,模糊测试可以应用在很多方面,比如文件格式,网络协议,环境变量,键盘,鼠标事件,数据库,共享内存等,当然最常见的还是文件格式和网络协议。
根据这个定义,要成功实施Fuzz testing找出程序中的bug,在测试过程中我们需要解决以下2个问题:
- 如何生成随机但有效的输入
- 何能够对目标程序监控以保证及时地发现, 定位目标程序错误
而这也正是模糊测试工具力图解决的问题。
什么是Sulley
”工欲善其实,必先利其器“,为了能更方便地进行Fuzz testing,工具自然是少不了的。Sulley,正是一款用Python实现的开源Fuzz testing框架,主要应用于网络协议方面的测试. 目前现在关于这方面的测试工具也挺不少,不管是开源的(比如历史悠久的SPIKE, 或者是本文介绍的Sulley)还是商业的(比如Mu Dynamics公司的产品),更多可以看这里.
事实上,在Sulley出来之前,这方面的工具已经有一些了,但是为什么Sulley的作者还要选择重新造轮子呢?根据Sulley的文档,他这么做的理由是,当时已有的工具主要是专注在”数据生成“部分,而仅仅做到这一步对Sulley是不够的,因为Sulley设计的目标是:不仅要简化数据生成,同样要简化与目标系统的之间的数据传输,以及目标系统的监控。因此我们可以把刚才这段话理解成,Sulley要做的是一个能支持fuzz testing的整个测试流程的框架。在这一点上,显然Sulley的定位比起之前的工具高出了很多。而且事实上,Sulley的作者也不算是在造一个全新的轮子,比如在具体实现Sulley的时候,他也借鉴了一些当时已经成熟很成熟的Fuzz框架(SPIKE)的经验,比如用“块”结构的方式来构造数据,这点从Sulley构造Request所用的API接口就可以看出来,包括对于特定数据类型所用到的fuzz library也都直接从SPIKE拿过来,这些内容,我们会在后面的文章中介绍。
好了,基本的背景知识了解完毕,接下来我们会开始介绍Sulley的整个框架中四个主要的组成部分:数据表示,会话管理,Agent 以及 Utilities.