作者: Wen Xu, Soyeon Park, Taesoo Kim (Georgia Institute of Technology)
出处:CCS2020
背景
DOM是浏览器中重要的组件,目前针对DOM的fuzzing主要使用静态语法来生成随机的HTML文档,这样生成的文档虽然合法但是缺乏丰富的语义。
现有的基于代码覆盖率的fuzzing还没有直接运用到DOM中,因为有以下问题:
1. 目前的工具支持的变异算子很少,Domato只支持添加新数据,像位翻转、拼接这些就不支持。
2. 浏览器他不会自动正常退出,除非crash。那如果强制每次测完之后退出会影响吞吐量。
动机
首先作者分析了现有的DOM模糊测试工具,目前都比较倾向于静态生成语法正确的文档,然后每次用一个新的浏览器去执行这个文档。这方面已经有一个成熟的工具叫Domato。但是它仍旧存在以下问题:
- CCS selectors会引用一个或多个用id,类或者标记设置样式的元素。Domato生成的文档中这些元素的数量是不确定的,可能有的元素没有用到。
- CCS属性,这些属性要被用到就得保证调用它们的元素是存活的并且符合特定类型。Domato生成的输入可能没有激活这些CCS属性。
- 属性名称值。Domato它不知道每个元素都有哪些属性,所以他随机生成的属性可能这个元素根本就没有。
- 属性值。属性的值是和其它位置的值有数据依赖的,Domato不知道这些数据依赖,所以不能够生成正确的或者有意义的属性值。
方法设计
- 用一个自定义的FD-IR来表示HTML文档的语法和语义。FD-IR遵循DOM规范,同时保存一些上下文信息。主要是两种上下文信息:
- 全局上下文。它会维护一个树形结构去记录所有的元素以及他们的标签和属性。在树形结构之外,它也保留可用的token。
- 局部上下文。对于每个JavaScript函数它会有一个局部上下文,包括对全局上下文的引用、特定API调用中定义的DOM对象。这类的对象只能在定义之后才能引用。也就是说它会提取这个对象是在哪一行被定义的,然后确保这个调用有效。
- FD-IR中的value接口它能够代表所有类型的数据值,包括CCS selectors、CCS properties、attributes、arguments、API的返回值等。对于不同的值他会定义如何生成、变异以及转换成正常的文档内容。
- 此外就还有 DOM tree、CCS rules以及event handlers。
- 对于背景中提到的两个问题,这篇文章首先支持更多中变异方式、然后采用分布式的fuzzing环境来实现高吞吐量。
总结
- 本文主要解决fuzzing生成输入的语义缺失问题,它通过提取上下文信息结合变异方法来丰富输入的语义信息。
- 对于高度结构化的输入可以使用这种中间语言形式的树型结构表达。
- 对于层次性的测试,也就是除了给文档还要考虑API的调用、CCS,要针对不同的组件进行定制化的变异。