Abstract
本文: Montage
特点: Fuzzing + 神经网络语言模型(LSTM)
主要步骤: 将一棵AST转化为一串AST subtrees,训练LSTM
实验效果:
- 能够生成valid JS tests
- 比previous studies outperforms
- 找到了37个bugs,其中3个是CVEs
1.Intro
P1: JS受欢迎->JS Bug的严重性
P2: JS Bug的严重性: JS Bug常被利用;被利用的方式; NVD中浏览器项目中JS Bug占比
P3:
- LangFuzz: 结合JS seed files的代码碎片来生成新的JS test input
- GramFuzz和IFuzz: 思路类似,不过IFuzzer使用基于feedback的遗传算法来指导来增进Fuzzing效率
P4: 都没有考虑到code fragments内在逻辑关系;本文能利用
P5,6: 2个observation - a new security problem often arises from JS engine files that have been patched for a different bug
- test code that triggers new security vulnerabilities is often composed of code fragments that already exist in regression tests
- 这个的说明是通过找到2038个JS文件和67个包含bug的JS文件,将这些文件都转化为只有1层的AST,发现这67个对应的AST有95.9%出现在2038个转化而成的AST中???
本文核心任务: 通过将一部分代码改成LSTM生成的代码来变异regression test
核心步骤:
- 将每个JS test对应的AST转化为一串fragments(fragment指深度为1的子树)
- 用fragments训练LSTM
- 用LSTM变异JS test的子树
已有类似研究:
- [16]: 重组PDF objects
- 需要对structural control flows建模,此外,还需要对JS tokens之间的语义数据依赖关系进行建模
Montage与已有研究的差别: 基于fragments,每个fragment内部已经有了一定的结构关系,能够反映出语法和语义共性
实验:
- 在ChakraCore1.14.1上寻找bug,并与CodeAlchemist, jsfunfuzz, IFuzzer进行对比
- 5次比对,每次72h
- Montage找到133个bugs,其中15个security bugs,竞品没找到的数目分别是9,12,12;
- Montage能找到其他工具找不到的bug
- 将Montage与随机选择,马尔科夫链,字符/token级别的网络做比对
- 在CharkraCore, JSCore, SpiderMonkey和V8上分别进行fuzz
- 找到37个unique bugs;分别来自什么软件
- 显示Montage有在现实项目中找到bug的能力
2.Background
2.2 Fuzzing testing
- jsfunfuzz: 以terminal token为单位生成
- CodeAlchemist: 利用assembly constraints of its building blocks
- LangFuzz, GramFuzz, IFuzz: struct a pool of code fragments
- TreeFuzz: 利用概率性上下文无关文法来生成test suite
- Skyfire: 推测出概率性上下文无关文法
- 4&5缺点: 太general,不能找到js的bug
3.Motivation
P1: 回答问题: 会导致bug的JS files是否有什么相似之处-为此,设计了从ChakraCode的PoC中观察的一些小实验;为什么选择ChakraCode
P2: PoC是如何收集的;收集到了什么;
P3-: 如何从PoC数据中得出两个observations
4.Overview
Montage基本特点;基本功能;利用两个observations;基本步骤;PhaseI-III基本步骤,必要性,目的;
Montage在第三步会把当前subtree之前的fragment作为context放入。
Other model guided approaches
addressing code completion和其他神经网络生成测试的工作
5.Design
目标:
- 生成的测试中能够反映js的语法和语义特性
- 通过AST子树来抽象化JS fragments之间的语义层次关系
- 不产生ref errors
提出了新算法;利用了什么性质;基本步骤;认为该模型能做到什么;
5.1 Phase I: Building Training Data of Fragment Sequences
5.2 Phase II: Training an LSTM Model
5.3 Phase III: Generating JS Tests
6.Implementation
Parse & Generating JS Statement: Esprima 4.0和Escodegen 1.9.1
其他技术细节: python和nodejs之间用pipe channel通信
LSTM的参数
监控: Python subprocess module, SIGILL, SIGSEGV
源码地址