fuzzing学习
1、简介
1.1 fuzzing
模糊测试(fuzzing)是一种通过向程序提供非预期的输入并监控输出中的异常来发现软件中的故障的方法。
用于模糊测试的模糊测试器(fuzzer)可以按照以下3种方式进行分类:
- 根据是否从已有输入衍生出新的输入,分为基于变异的、基于生成的模糊测试器
- 根据是否理解输入结构,分为迟钝的、聪明的模糊测试器
- 根据是否理解程序结构,分为白盒、灰盒、黑盒的模糊测试器
基于变异的模糊生成器需要提供原始输入,称之为输入种子(input seed),在这些种子输入之上去产生新的输入。比如有一个种子输入库,库中有1000个数,基于变异的模糊生成器将这1000个数全部加1,作为新的输入,而基于生成的模糊测试器有可能只是产生1000个随机数。
smart模糊测试器根据输入结构的特性来生成输入,比如,现在库中有1000个数,其中900个在0-1000之类,那么smart模糊生成器生成的新输入保证9/10的新输入在0-1000之类。dumb模糊生成器就不管这些已有的输入特性,比如生成平均分布的测试输入。
黑盒、灰盒、白盒就比较直接了,软件测试里面的基本概念。比如黑盒测试就是完全不知道程序内部结构,白盒测试中有一种叫路径覆盖,保证测试用例执行程序所有路径,灰盒测试则介于两者中间。
1.2 fuzzing和符号执行
符号执行的很大问题就是路径爆炸,fuzzing和符号执行相比,覆盖率不如符号执行,但是有更高的效率。
2、模糊测试框架
Coverage-Guide Fuzzing:AFL、libFuzzer 、honggfuzz 、AFLFast 、VUzzer 、CollAFL 。目标是提高代码覆盖。通过插桩的方式来检测代码覆盖率。
Target-Directed Fuzzing:AFLGo 。其他目标的Fuzzing
参考
Awesome-Fuzzing(很好的资源合集)
fuzzing.info(paper)