题目:Taint-based Directed Whitebox Fuzzing
作者:Vijay Ganesh and Tim Leek and Martin Rinard
单位:MIT Computer Science and Artificial Intelligence Lab
问题:
fuzzing在揭露更深的由于系统没有正确处理合法输入导致的语义错误上不是很有效,很多系统采用全部随机的输入生成策略无法满足有格式要求的输入基本的语法约束,因而无法通过最初的解析阶段探索之后的代码
方案:
提出有导向的白盒fuzzing测试,BuzzFuzz工具,旨在生成格式良好的测试输入,使其能够执行到被测程序核心语义处理部分的深处代码
基于如下技术:
1)污点追踪:执行一个或多个有效样本输入,通过插桩获取污点信息,能够记录程序计算的每个值受输入中哪些字节影响
2)攻击点选择:被测系统中的一些特定的点被识别为潜在攻击点,BuzzFuzz默认所有库函数和系统调用为攻击点,也可用户配置选择程序中任意点为攻击点
3)有导向fuzzing:对每个攻击点和每个样本输入,BuzzFuzz计算影响该攻击点的值的输入字节集合,产生的新输入只修改影响值的输入字节,其它的字节与样本一样,默认BuzzFuzz会给这些字节赋一些极端的值,如大整型、小整型、零等。BuzzFuzz也可配置使用不同策略,如生成随机值等
4)有导向测试:在新生成的种子上运行系统观察是否揭露错误
该方法的好处:
1)保留语法结构:有导向的fuzzing希望在不影响原始输入的合法语法结构的情况下改变输入字节,自动生成的输入需要通过初始解析部分以执行语义核心中的代码
2)目标值:被修改的输入字节为能够直接与特定潜在脆弱性相关的值
3)协同改变:有导向fuzzing可以识别并修改输入空间中多个互斥区域,只有协同一起修改这些空间才能揭露一个错误
实验结果: http://people.csail.mit.edu/vganesh/buzzfuzz.html
原理:
1. 动态污点追踪:BuzzFuzz实现了一个标准的污点追踪算法,第一步是处理被测源代码,插入对BuzzFuzz污点追踪库的调用代码
维护了一个map,用哈希表将地址映射为输入文件中输入位置的集合,当应用用了已有值的集合计算一个新的值时就对这些输入字节位置集合取union,并把该集合存到新值地址对应的哈希表索引处
1)类型信息:除了记录文件位置信息,污点追踪系统还要记录新值的类型,BuzzFuzz用这些信息在fuzzing阶段选择合适的极端值
2)过程调用:为了跨过程调用追踪污点,BuzzFuzz维护了一个栈,记录过程参数的污点信息,每个过程调用点,插入的调用污点追踪库的代码会将参数的污点信息压入栈中,利用栈去检索参数污点信息
3)库过程:特定情况下,BuzzFuzz是无法获得库的源代码的,因此无法为这些过程插桩,BuzzFuzz维护了一个内部数据库,记录污点在一个小的关键库过程调用集合中怎样流动的
4)攻击点:在攻击点的插桩记录了每次执行到攻击点的时刻,攻击点处所有值的污点信息
5)报告:执行结束时,BuzzFuzz生成一个报告,包含每个攻击点的污点信息。每次执行到每个攻击点时,对攻击点处的每个值,报告列举了影响该值的所有输入文件位置。报告还包括每个值的类型
局限:BuzzFuzz没有追踪由于条件和数组访问引起的间接污染关系。
2.生成fuzzed输入
1)第一步:要得到一个种子输入的语料库,给定这样一个集合,BuzzFuzz依次用这些输入执行插桩版本的应用,得到一个包含每次执行每个程序点的污点追踪信息的报告
2)第二步:利用报告来fuzz相应种子输入,得到一个新测试输入。每个报告都表明了一个相关输入文件字节的集合,BuzzFuzz可以根据类型修改。
3)第三步:结合并应用来自所有报告入口的改变,目前BuzzFuzz的实现是简单地结合并应用报告中所有入口的改变。如果两个入口冲突了则BuzzFuzz随机选择一个。
3. 测试
在非插桩的版本上执行新生成的fuzzed测试输入,观察是否有失败,将这些失败报告给开发者
评估:
在两个开源C程序上进行测试,Swfdec 0.5.5(一个Adobe Flash Player)和MuPDF 0.1( 一个PDF Viewer)
分别从Pedram Amini和MIT的Adam Kiezun那获得了两个程序的语料库
实验环境:64bit 3GHz Ubuntu Linux box
每小时发现的错误率反映了本文技术的整体有效性
BuzzFuzz可以有效发现跨模块边界的有问题的交互相关的错误
与随机fuzzing相比,随机fuzzing生成的输入文件在文件头部分的字节基本上总是被解析部分代码就拒绝了,即文件不合法
有导向的fuzz测试可以保留输入文件的语法结构,并没有设计去发掘初始输入解析代码中的错误,这方面的错误简单的随机fuzzing更有效
本文的方法采用轻量级的符号化信息,能够在实际中探索更深的程序路径,发现更深处的错误,相应的trade-off是无法系统地枚举输入以穷尽探索程序执行空间,揭露一个错误的可能性完全取决于fuzzing算法和应用特性之间的交互
总结和未来工作:
本文技术的成功背后最主要的观点在于利用污点追踪获取哪些输入字节改变能命中特定攻击点,这些污点信息使得BuzzFuzz能够在不违背语法有效性前提下改变种子输入文件。不需要人工干预也不需要测试者理解输入文件格式。