Page 214 - 《软件学报》2021年第8期
P. 214
2496 Journal of Software 软件学报 Vol.32, No.8, August 2021
的内存泄漏漏洞,使得其可以对任意内存进行读写;最后,攻击者 frame 在运行时利用内存地图与内存泄漏漏洞
来查找目标数据的地址,并对目标数据进行修改.实验结果表明,该内存制图技术能够直接用来重现 Jia 等人的
工作,并在 IE 浏览器上也实现了内存利用来泄漏受害者 frame 的 cookie.
Frassetto 等人 [116] 实现了对 JIT 编译器的仅数据攻击 DOJITA.JIT 编译器在编译 JavaScript 代码时,会首先
生成中间语言,然后根据中间语言来生成最后的二进制代码.如果攻击者能够在中间语言中加入一些伪造的数
据,这些数据将会被编译为二进制代码执行.Frassetto 等人利用浏览器的堆溢出漏洞实现了该仅数据攻击,使得
攻击者 frame 获取到在渲染进程中执行任意代码的能力,同源策略也将很容易被攻击者绕过.
5.3.2 防御方案
仅数据攻击发生的根本原因是浏览器对一些安全相关敏感数据的不完全保护,使得攻击者可以利用内存
漏洞来对敏感数据进行任意读写.因此,解决仅数据攻击必然需要对浏览器进行安全加固以保护安全敏感数据.
Jia 等人 [22] 认为,地址随机化能够用来保护这些安全相关的数据.浏览器可以将所有安全相关数据放置在一
个单独的内存段中,并对内存段的基址进行随机化处理.更进一步的,浏览器要保证没有指针从内存段外指向内
存段里,否则,内存攻击者将可以跟踪指针来找到随机化后的内存段.此外,浏览器还要保证攻击者无法通过其
他内存数据来引用该内存段的基址,如将内存地址放在特殊的寄存器中来避免基址的泄漏.在具体实现过程中,
为避免对浏览器的大范围修改,Jia 等人使用浏览器的可信内核进程来维护该内存段的基址.
Reis 等人 [33] 对浏览器的多进程架构进行加固,来保护这些安全相关的数据.传统的浏览器多进程架构会使
得位于同一浏览实例的 frame 放在同一渲染进程中 [24,25] (见第 2.1 节),所以当一个 frame 内嵌跨源子 frame 时,
父子 frame 将在同一个进程中运行,同源策略的安全监控器也不得不放置在渲染进行中进行策略实施.Reis 等
人提出了 SiteIsolation 架构,该架构彻底地将不同网站的 frame 运行在不同的渲染进程里.在这种情况下,即使攻
击者 frame 对其所在的渲染进程发起了内存攻击并控制了该渲染进程,由于进程边界的存在,攻击者 frame 依旧
不能访问受害者 frame 所在的渲染进程的数据,从而实现更强的安全隔离.
对安全敏感数据的保护,还可以使用 SGX 等 CPU 级别的隔离机制.例如,Frassetto 等人 [116] 将 JS 引擎放置在
利用 SGX 创建的 enclave 中,由于 enclave 外的代码无法对 enclave 里的内存进行访问,攻击者 frame 将无法修
改 JavaScript 引擎中的敏感数据,之前的 DOJITA 仅数据攻击将无法实现.TrustJS [119] 与 Fidelius [120] 也利用硬件
机制实现了类似的安全加固.
5.4 方案对比与讨论
表 8 总结了浏览器 3 种内存攻击的代表性工作、攻击原理、对同源策略的影响以及相关防御机制.
Table 8 Summary on memory attacks on browser
表 8 浏览器内存攻击总结
攻击机制 代表性工作 攻击原理 对同源策略安全的影响 相关防御机制
Gong 等人 [18] ; JIT 代码页的权限需
代码注入 Song 等人 [17] 在可写与可执行切换 执行任意代码,从而绕过 W^X、地址空间随机化
攻击 [19] 同源策略以访问跨源资源
Blazakis 等人 JIT 编译器忽略大常数 常数盲化、地址空间随机化
利用漏洞搜索现有 地址空间随机化、
[32]
Snow 等人 执行任意代码,
代码重用 代码页以获取 gadgets 从而绕过同源策略 控制流完整性
攻击 Athanasakis 等人 [20] ; 利用大常数 以访问跨源资源 常数盲化、地址空间随机化、
Maisuradze 等人 [117] 注入 gadagets 控制流完整性、JavaScript 重写
利用漏洞修改 执行任意代码,从而绕过
[116]
Frassetto 等人 内存隔离、地址空间随机化
仅数据 JIT 编译器元数据 同源策略以访问跨源资源
攻击 Jia 等人 [22] ; 利用漏洞修改 修改元数据,欺骗同源 内存隔离、地址空间随机化
Rogowski 等人 [23] 同源策略元数据 策略以访问跨源资源
我们从以下两个角度来分析讨论这 3 类内存攻击.
• 攻击原理:对浏览器发起这 3 类内存攻击的共同点是利用来自于 JavaScript 引擎的漏洞,攻击者可利用
这些漏洞来影响可执行代码(如通过大常数等),获得内存读取能力(如搜索所有代码页中的 gadgets)以