一种针对JavaScript 引擎JIT 编译器的模糊测试方法*
2021-01-26王轶骏
王 越,孙 亮,王轶骏,薛 质
(1.上海交通大学,上海 200240;2.江苏省南通市公安局,江苏 南通 226001)
0 引言
Web 浏览器安全是用户在网络环境中至关重要的一环,而JavaScript 引擎是浏览器中的重要组件,攻击者可以通过钓鱼网页轻易地让用户触发JavaScript 引擎漏洞。JavaScript 引擎又是内存危险的,触发漏洞后攻击者可以构造特殊的原语来实现内存的任意读写,从而控制被攻击者的设备。JavaScript 引擎漏洞在近几年频繁出现,伴随的利用脚本都仅仅需要远程浏览器访问,范围覆盖Windows、MacOS、iOS、Android 各种操作系统,故JavaScript引擎的安全问题已经是安全研究的重点对象。
近几年来,JavaScript 引擎漏洞中JIT 编译器的漏洞占据了越来越大的比重。JIT 编译器,全称(Just-In-Time)是一种程序语言提高运行效率的方法。如图1 所示,JavaScript 引擎解释执行JavaScript 的流程为:先通过词法和语法分析将JavaScript 脚本转化为AST 树,然后编译为中间语言字节码,接着进行逐步解释执行,当执行的过程出现多次循环或者多次函数调用时,JIT 编译器会将该部分字节码重新编译,通过编译优化提升运行效率,最终转化为符合操作系统的机器码并执行。

图1 解释执行JavaScript 流程
JIT 优化阶段,JIT 会将优化拆分成为多个步骤(如常数折叠、循环不变量提升等),这些步骤即为每一个具体的JIT 优化阶段。JIT 优化时会将需要优化的代码进行分析,当其满足优化阶段的条件时,进行优化。
JIT 编译器漏洞,主要包含的是JIT 优化相关的漏洞,优化漏洞通常在JIT 编译优化过程中利用错误预测或绕过检查而达到利用。其中包含绕过边界检查,如CVE-2015-0817、CVE-2017-2547 和CVE-2018-0769;……
