随着业界对软件安全问题关注度的不断提升, 漏洞挖掘也逐渐成为相关领域重点研究的内容。漏洞挖掘技术是指对未知漏洞的探索, 通过综合应用各种技术和工具, 尽可能地找出软件中潜在的漏洞。传统的漏洞挖掘技术 (静态分析技术、动态分析技术) 耗时费力, 又难以对每一个软件进行全方位的漏洞扫描, 更重要的是即使经过严格测试的软件, 在投入运行后还是会发现有漏洞存在, 这促使了对一种更为有效的漏洞挖掘方法的研究。模糊测试(fuzz testing)是一种介于完全的手工渗透测试与完全的自动化测试之间的安全性测试类型,它能够在一项产品投入市场使用之前对潜在的安全漏洞进行分析和挖掘。本文围绕模糊测试技术的基本理论,从模糊测试执行过程、 模糊测试数据生成的方法和模糊测试的应用等方面对模糊测试进行介绍。
模糊测试是一种基于缺陷注入的自动化软件测试技术,它使用大量半有效的数据作为应用程序的输入,以程序是否出现异常或错误作为标志,来发现应用程序中可能存在的安全漏洞。所谓半有效的数据是指对应用程序来说,测试用例的必要标识部分和大部分数据是有效的, 但同时该数据的其他部分是无效或者漏洞攻击的。因为的数据会被待测程序认为这是一个有效的数据,这样应用程序就有可能发生错误,从而导致应用程序的崩溃或者触发相应的安全漏洞。模糊测试是一个自动或半自动的过程,这个过程包括反复操纵目标软件并为其提供处理数据。
模糊测试(fuzz testing)和渗透测试(penetration test)都是属于安全测试的方法,它们既有联系也有区别。渗透测试一般是模拟黑客恶意入侵的方式对产品进行测试,对测试者的执行力要求很高,成本高,难以被大规模应用。而模糊测试通过向应用提供非预期的输入并监控输出中的异常来发现软件中缺陷,整个执行过程依靠工具进行自动化或半自动化测试。模糊测试技术具有自动化程度高、可用性好、误报率低, 对目标程序源码没有依赖等优点。
- 模糊测试的执行过程
模糊测试执行过程主要包含几个基本阶段:
(1)识别测试目标
确定明确的测试目标,才能决定使用的模糊测试工具或方法。比如需要选择应用包含的特定文件或者库作为测试目标,需要把注意力放在多个应用程序之间共享的那些二进制代码上。因为如果这些共享的二进制代码中存在安全漏洞,将会有非常多的用户受到影响,因而风险也更大。
(2)识别输入
大部分可被利用的安全漏洞都是由于应用没有对用户的输入进行校验或是进行必要的非法输入处理。是否能找到所有的输入向量(Input vector)是模糊测试能否成功的关键。