Abstract
目标: 生成语法语义有效的JS code snippets
工具: CodeAlchemist
算法: semantics-aware assembly
效果: 在JS引擎中找到了很多bugs
1. Intro
P1: js引擎使用广泛
P2: js安全重要
P3: 成功的JS Fuzzing engines:
- LangFuzz
- 方法: 将样本JS文件解析后切分为多个code fragments,然后再重组形成新的test cases。
- 效果:从2011年到成文时至少发现了2.3k个bugs
- jsfunfuzz
- 方法: 从手写的语法文件中生成语义有效的js语句
- 效果: 从2006年到成文时至少发现了2.8k个bugs
P4: 目前js fuzzer存在的缺点:生成的样例语义有效性低
P5: jsfunfuzz缺点:写语法文件本身过于费时
目前jsfunfuzz处理方法:允许一部分语法无效的code snippets出现,将js code snippets放在trycatch block中执行
该解决方案仍然存在着其实没有提升语法有效率的缺点,还可能会改语义,导致一些bugs无法出现。比如CVE-2017-11799
P6: 学习概率文法模型,比如Skyfire和TreeFuzz,仍然存在难以处理复杂的js类型系统,会生成语义无效样例的情况
P7: 本文:提出semantics-aware assembly,关键是把JS种子切分为多个code bricks,每个code bricks上标着若干称为assembly constraints的用于指示当前code brick在什么条件下能与其他code brick结合。
具体的,这些条件会指明每个codebrick中定义和使用了哪些变量(用数据流分析确定的),还会动态确定这些变量的类型。
assembly constraints就是与langfuzz的最大不同。
尽管还是存在语义无效的可能性,codealchemist还是大大增加了语义有效率。
P8:
无需人力实现语法文件,可以从现有种子直接学习。
P9:
实验:
对象:4个引擎:ChakraCore, V8, JavaScriptCore, SpiderMonkey
效果:
- 其中一个上面超过jsfunfuzz 4.7x
- 19 bugs, 11 security bugs