Page 211 - 《软件学报》2021年第8期
P. 211
罗武 等:浏览器同源策略安全研究综述 2493
仍有短暂的时间窗口来发起代码注入攻击.基于此,Song 等人 [17] 建议将 JIT 引擎拆分为两个不同的进程来应对
这种安全威胁,包括一个执行 JIT 代码的不受信任进程和一个发出 JIT 代码的受信任进程.这种体系结构可以防
止 JIT 内存在不受信任的进程中随时可写.由于分割 JIT 引擎需要进程间通信和消息同步,因此在 JavaScript 基
准测试中,该方案所引入的运行时开销高达 50%.此外,Chen 等人 [115] 设计了 JITSafe 框架来混淆 JIT 代码与缩小
JIT 编译器生成与执行 JIT 代码的时间窗口.Frassetto 等人 [116] 利用地址空间随机化技术来使得攻击者无法获取
JIT 代码页的地址,从而抵抗利用该时间窗口的代码注入攻击.
利用 JIT 编译器忽略处理大常数的特性来发起的 JITSparying 攻击能够更进一步地加强为代码重用攻击,
因此将在下一节中具体阐述其加强后的攻击与防御方案.
5.2 代码重用攻击及防御
5.2.1 攻击方案
代码重用攻击是通过链接小的代码指令片段(gadgets)来执行任意代码,因而需要两个前提:一是目标程序
中具备有足够的 gadgets,二是目标程序存在控制流劫持漏洞使得攻击者能够对 gadgets 进行链接.由于软件漏
洞的不可避免,对代码重用攻击的攻防研究通常认为第 2 个条件是成立的,因而研究者们着重于如何在浏览器
中寻找或注入新的 gadgets.特别注意的是,代码重用攻击所提供的任意代码执行权限将能帮助攻击者 frame 直
接绕过浏览器同源策略的限制.
Snow 等人 [32] 提出了 JIT-ROP 攻击,一种针对 JIT 代码的代码重用攻击方案.JIT-ROP 攻击假设攻击者 frame
可以通过编写合适的 JavaScript 代码来利用浏览器的漏洞,从而获取到反复读取任意内存地址的能力.攻击者可
以利用该能力来跟踪程序指针.利用程序指针的指向关系,攻击者可以获取到足够多的代码内存页.接下来,攻
击者可以对收集到的代码内存页进行分析,从中搜索到发起代码重用攻击所需的 gadgets 以及一些特殊的 API
函数,如加载链接库等.最后,攻击者通过利用控制流劫持漏洞来链接搜索到的 gadgets 来调用目标 API,并提供
所需的参数.Snow 等人在 IE 浏览器中成功发起了 JIT-ROP 攻击.
JIT-ROP 攻击的工作方式是寻找已存在代码页中的 gadagets,这并不能保证攻击者所需要的 gadgets 一定能
够被找到.考虑到 JITSpraying 攻击能够实现代码注入,Athanasakis 等人 [20] 设计了结合 JITSpraying 攻击与 JIT-
ROP 攻击的代码重用攻击.该攻击利用 JITSpraying 攻击中所使用的大常数来往浏览器中注入 gadgets,然后与
JIT-ROP 一样,利用控制流劫持漏洞来将注入的 gadgets 链接到一起,从而发起代码重用攻击.图 11 中展示了生
成执行 mprotect 系统调用并提供相关参数所需的 gadgets 与对应的 JavaScript 代码.例如,在 JavaScript 中为变
量 g3 赋值为 12828721,当 JIT 编译器对 JavaScript 进行编译后,所生成的二进制代码将包含 c3c031,该指令片段
的含义是对 eax 寄存器清零后返回.
对应的
gadgets JIT编译器编译
以g3
为例
跳转至c3 c0 31
开始执行
Gadget
xor eax, eax; ret
Fig.11 Code reuse attack by combining JITSpraying and JIT-ROP attack [20]
图 11 结合 JITSpraying 与 JIT-ROP 的代码重用攻击 [20]
更进一步地,Maisuradze 等人 [117] 发现:除了 JavaScript 中的大常数以外,还有很多其他方案可以实现 gadgets