概念
模糊测试(Fuzzing),是一种通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。在模糊测试中,用随机坏数据(也称做 fuzz)攻击一个程序,然后观察哪里遭到了破坏。
模糊测试(Fuzz Testing)是一种自动化的软件测试技术,最初是由威斯康辛大学的巴顿·米勒于1989年开发的,通常用于识别程序中的潜在漏洞。模糊测试的核心是自动或半自动的生成随机数据输入到应用程序中,同时监控程序的异常情况,如崩溃、代码断言失败,以此发现可能的程序错误,如内存泄漏。模糊化是指自动生成和执行测试,模糊测试中输入的随机数据被称为“Fuzz”,随机数据的类型包括:超长字符串;随机数如负数,浮点数,超大数、特殊字符如~!@#$%等包含特殊含义的字符,作为输入可能会引发报错;unicode编码,因为有些程序是不支持unicode的。模糊测试无法提供对于一个软件应用在安全威胁或漏洞方面的整体评估,在处理不会导致应用崩溃的安全威胁时效果较差,例如某些病毒、蠕虫、木马等,因此需要结合其它的安全测试手段来保障软件系统的安全。
Fuzz生成的随机输入大多数在语法上是不成立的,为了能让模糊测试有效的进行下去,需要增加获得有效输入的几率。一个好的模糊生成器产生的数据,不会偏离预期输入太远,但又是非预期的,会触发应用的异常行为。模糊测试用例生成算法主要有两种:
1)基于变异:根据已知数据样本,通过变异的方法生成新的测试用例;
2)基于生成:根据已知的协议或接口规范,建模并生成测试用例;
目前最常用的 Fuzzer 是由谷歌工程师迈克尔·扎里斯基(Michal Zalewski)开发的 American Fuzzy Lop(AFL)。AFL 是一款开源的模糊测试工具,在程序执行前对程序源码进行插桩(instrumentation),以便在程序执行过程中实时获取程序的执行情况。AFL 采用遗传算法对程序的输入进行变异能够在程序运行的时候注入自己的代码,然后自动产生测试用例进行模糊测试。代码覆盖率是模糊测试工具用来评估找到导致错误的代码路径的可能性的主要指标。在执行过程中,AFL 向被测程序中输入 input,然后获取程序的覆盖率,将覆盖率大的 input 保留下来进行变异,然后在下一轮测试中向被测程序中输出这些变异后的 input,一直到程序的覆盖率在较长的一段时间不能继续增大为止。
随着技术的演变,模糊测试从单纯的黑盒模糊测试,也衍生了灰盒、白盒模糊测试技术。目前AFL没有维护了,社区维护版叫AFL++。
常用工具
- AFL
- libfuzzer
Resource
- AFL
- 自己写一个小型的Fuzzer
- 北大 软件分析
- 南大 软件分析
- The Fuzzing Book 模糊测试入门
- Static Program Analysis
- libfuzzer-workshop
Reference
1.什么是模糊测试?
2.什么是模糊测试? (不是同一篇文章)
3.Fuzzing(模糊测试)技术,你真的了解吗?
4.CS研究生如何入门模糊测试方向?