Abstract
背景介绍: JS中有个名为binding layers的接口,可以将数据结构从js翻译为底层语言如c或者c++。明显,测试data representation层很重要,它对测试数据提出的要求是: 1. 需要语法语义有效 2. 要尽可能减少input space
本文提出了Favocado,专注于js runtime system中binding layers的fuzzing。
通过使用提取到的语义信息和执行状态本身的细致维护来生成语法和语义都有效的输入。
Favocado生成的测试用例不会引起未规划的runtime exceptions,而后者又可能引发binding code。
利用binding layers的relative isolation特性,Favocado将输入划分为等价类,因此大大减少了输入空间。
实验:
- 将Favocado和其他DOM Fuzzer进行对比
效果 - outperform
- 61个已知的bugs
I. Intro
背景介绍: 不仅在浏览器中,在许多商业软件中也内嵌了js引擎
现有的js fuzzer都不能在非浏览器环境中对js binding layers做测试
测试用例必须要遵守js specification,以便被js engine转化为AST。
目前,为了生成语法正确的test case,目前常用两种方法:
- 上下文无关文法
- 利用已经存在的语法有效的种子
但是仅仅做到语法有效不行,js许多语句具有依赖关系。
现在已经有了一些semantic-aware fuzzer,但是其生成的数据中无法通过语义检查的比例还是很高。
要测试到binding layers对应的binding code, test case至少要执行以下两步操作: - 创建object
- 在函数中调用这个object或者为这个object更改property
只考虑这两步操作,涉及到的input space也很大,此外还有很多methods和properties的参数难填入,这都给binding layers的操作带来了难点。
为此, Favocado定义objects relation为一个binding object把另一个binding object当作property或者方法参数时成立的关系,利用relative isolation of different DOM objects(也即不同native modules中的binding objects,除非存在objects relation,不然在测试逻辑上是无关的,比如spell.check()和Net.http.request位于无关的两个native modules中,二者测试的顺序和context很可能不会影响到找到bug)将输入空间划分为不同等价类,只在等价类内部做fuzzing,以大大减小input space,加速fuzzing。
本文工作: Favocado
特点:
- 能生成语法语义有效的test cases
- 从JS API和IDL(Interface Definition Language)中读取method和properties信息
- 生成的JS statement中只使用有效的objects, properties和methods,如果不是有效的,则创建对应对象
- object-relation aware
- 会划分等价类来分别测试
实验
三种binding objects: PDF, mojo, DOM
四种JS运行系统: Adobe Acrobat Reader; Foxit PDF Reader; Chromium; Webkit
效果: 同abstract
II. Background
A. Binding code
已发现的JS bugs主要集中在:
- binding codes omits necessary checks
- violates data translation rules
- mishandle exceptions
已有的工具既有静态分析,也有动态
B. Terminology
semantics: 本文中指静态type signatures of all methods and objs
semantically correct test case:指semantics根据binding code规定是正确的,在执行上下文中也是有效的这样的js statements
C. Fuzzing JS Engines
- Skyfire通过probabilistic context sensitive grammar和已有的samples来生成test cases
- CodeAlchemist通过数据集中的代码基本块来生成语义-aware JS
- DIE通过structure preserving mutation和type preserving mutation来减少input space规模,此外,还利用已知的PoC(Proof of concept) exploits或者现有的test cases
- Montage: 用了神经网络语言模型
D. Fuzzing the Binding code of JS Runtime System
Domato和DomFuzz都可用于测试Dom
缺点是需要人工说明语法,提供如何调用方法以及设置properties的详尽说明
E. JS Engine Fuzzers for Binding Code
- DIE或者Montage等使用了已知漏洞的PoC,但是生成Binding layer的测试并不需要复杂的语义或者Code pattern。
- Code Alchemist是前沿的semantics-aware fuzzer,但是也只有小于20%的超过5句话规模的test case不会发生runtime error
- Superion和Nautilus需要well-developeed grammar
III. Overview
A. Requirements
需要自动提取目标binding code的精确语义信息
本文不用已有的test suite
B. Our Approach
- 读取API(无源码时)和IDL
- 生成test case generator
- fuzzing
- test case generator从Fig5中随机挑选一个模板
- 利用上下文信息和binding code语义信息填完一句statement
- 若涉及到的obj已经被deallocate,则冲i性能创建
- 运行
- 记住新定义的变量名称
为了加速, Favocado会同时选出多个objs,并行测试
IV. Design
Favocado主要分为两个部分:
- semantic information constructor
- dynamic error-safe test case generator
A. Semantic information constructor
主要提取以下信息:
- object names, parent object name
- methods name, argument types
- property name, type, 潜在string value, 是否只读
B. dynamic error-safe test case generator
binding object的生成是人工填入的,generator会记录下新定义的。此外,每次执行前还会用eval确定变量有效。Favocado保证一次测的objects数目,包括有relation的,不会超过6个。
Favocado有能力生成完全正确的测试用例,不过为了测出bug,会故意填入错误的type或者错误的值。