欢迎光临散文网 会员登陆 & 注册

模糊测试

2022-05-24 00:41 作者:安静的秃头怪  | 我要投稿

概念

模糊测试(fuzz testing, fuzzing)是一种软件测试技术。其核心思想是将自动或半自动生成的随机数据输入到一个程序中,并监视程序异常,如崩溃、断言(assertion)失败,以发现可能的程序错误,比如内存泄漏。模糊测试常常用于检测软件或计算机系统的安全漏洞。

模糊测试包括几个基本的测试步骤:确定被测系统->确定输入->生成模糊数据->使用模糊数据执行测试->监控分析系统的行为->输出日志

Fuzzing通常由盲Fuzzing(Blind Fuzzing)导向性Fuzzing(Guided Fuzzing)两种。

  1. Blind Fuzzing生成测试数据的时候不考虑数据的质量,通过大量测试数据来概率性地触发漏洞。

  2. Guided Fuzzing则关注测试数据的质量,期望生成更有效的测试数据来触发漏洞的概率,比如,通过测试覆盖率来衡量测试输入的质量,希望生成有更高测试覆盖率的数据,从而提升触发漏洞的概率。


基本方案

  1. 构造大量测试用例(初始seed)

  2. 筛选可行测试用例(seed选择)

  3. 种子变异(对seed代码进行简单修改)

  4. 程序执行测试用例

  5. 若出bug则保存该用例,否则继续执行第二步

AFL模糊测试工具

AFL这个工具出来的一个起因就是AFL的开发者认为盲Fuzzing的效率是比较低的;第二个原因是Charlie Miller和Laurent Gaffié所做的样本筛选的方法是有效果的;第三个原因是符号执行,符号执行的理论是非常不错的,但在实际中经常受到可行性、性能等方面的限制。于是在这样一个背景下,AFL出现了。AFL有两个关键词:指令插桩和边覆盖。首先AFL是基于插桩的,能够辅助程序分析;其次AFL是基于边覆盖的,是对Charlie Miller等人基于块覆盖用样本筛选的一个改进和提升。

AFL工作流程大致如下:

  1. 从源码编译程序时进行插桩,以记录代码覆盖率(Code Coverage);

  2. 选择一些输入文件,作为初始测试集加入输入队列(queue);

  3. 将队列中的文件按一定的策略进行“突变”;

  4. 如果经过变异文件更新了覆盖范围,则将其保留添加到队列中;

  5. 上述过程会一直循环进行,期间触发了crash的文件会被记录下来。


模糊测试的评论 (共 条)

分享到微博请遵守国家法律