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
   206   207   208   209   210   211   212   213   214   215   216