文章
Liang H, Pei X, Jia X, et al. Fuzzing: State of the art[J]. IEEE Transactions on Reliability, 2018, 67(3): 1199-1218.
综述
Fuzzing技术可以概括为通过自动化生成并执行大量的随机测试用例,来发现目标程序的未知漏洞。
Fuzzing的一般过程如图:
Target program可以为binary或source code;
monitor利用符号执行、taint analysis等技术获取目标程序的useful runtime information;
Test case generator用于生成测试用例,可分为基于变异的和基于语法的两种;
Bug detector检测、收集潜在的bugs。当目标程序崩溃或报告一些错误时,收集并分析相关的信息(例如stack traces),以判断是否存在一个bug。
Bug filter从Bug detector检测到的bug中提取可利用的bugs。
黑盒、白盒、灰盒fuzzing:
根据需要目标程序运行时信息的多少,fuzzer可分为黑盒、白盒、灰盒三种。如白盒fuzzer需要完整的程序内部逻辑信息,使用动态符号执行和覆盖率最大化的启发式搜索算法可以explore all execution paths;灰盒利用code instrumentation与污点分析技术,尽量使得测试用例可以覆盖更多的路径。
漏洞可分为导致目标程序崩溃的shallow bugs与存在于程序逻辑深处且难以触发的hidden bugs(如复杂的分支语句)。通常黑盒fuzzer适用于发现shallow bugs而白/灰盒适用于hidden bugs。在工业界黑灰盒更常用而白盒开销高不常用。
Fuzzing主要的问题:
1)如何生成或选择seed test case,如何生成其他test case:如从补丁中提取
2) 如何使这些test case可以通过目标程序的输入验证:如通过hash验证
3)如何处理引起crash的test case:比如区分、提取不同执行路径的test case
4)如何更好的利用运行时信息:如使用动态符号执行时,如何解决路径爆炸问题
5)如何提高fuzzing的可扩展性
现有的fuzzer根据应用领域分类:
General Purpose Fuzzers、Fuzzers for Compilers and Interpreters、Fuzzers for Application Software、Fuzzers for Network Protocols、Fuzzers for OS Kernels、Fuzzers for Embedded Devices, Drivers and Components
汇总表如下:
Fuzzing的研究方向:
Input Validation and Coverage、Smart Fuzzing(program analysis techniques、scalable and efficient)、Filtering Fuzzing Outputs、Seed/Input Generation and Selection、Combining Different Testing Methods、Combining Other Techniques With Fuzzing