Page 209 - 《软件学报》2021年第8期
P. 209
罗武 等:浏览器同源策略安全研究综述 2491
行任何输入验证.若 JSON-P 资源含有恶意代码,引入该资源脚本的网页将受到攻击.因此,导入第三方 JSON-P
资源需要完全信任第三方.Stock 等人 [90] 曾对目前网站中 JSON-P 与 CORS 的使用率进行了统计,发现 2014 年
前,JSON-P 的使用率远大于 CORS.然而截至 2016 年,CORS 的使用率已经超过 JSON-P 将近 10%.CORS 机制相
对于 JSON-P 更加完善,HTML5 标准的支持也将不断修复 CORS 机制中存在的安全漏洞,因此,Web 应用开发者
将逐渐趋向于使用 CORS 来取代 JSON-P.
4.4 小 结
目前的跨域/跨源通信方案最主要的 4 种机制是 document.domain,postMessage,JSON-P 与 CORS.document.
domain 只支持同网站下不同子域名之间的资源共享;而 JSON-P 由于其在可用性与安全性上的不足,已经基本
被 CORS 所替代.之后的网站将越来越倾向于使用 postMessage 与 CORS 这两类标准中提供的跨源通信机制.
然而,postMessage 与 CORS 依旧存在各种各样的安全威胁,研究人员在不断地分析安全威胁与提出更加安全的
机制,网站开发人员应当了解使用这些机制的风险,并尽可能按照标准建议的方案进行代码编写.不论如何,跨
域/跨源通信机制允许不同源网站共享资源,这意味着网站的信任边界从本网站自身向外扩大,我们要认识到信
任边界扩大的安全威胁,不应为了便利而盲目地使用这些通信机制.
5 内存攻击下的同源策略安全
使用不安全语言(如 C/C++)开发的软件不可避免地存在引起内存攻击的漏洞,如缓冲区溢出、内存泄漏与
格式化字符串等 [97] .内存攻击的初始形式为代码注入攻击 [98] ,即攻击者在程序运行时利用程序的漏洞注入事先
准备的负载(payload),然后通过将程序控制流指向负载,导致负载作为恶意代码得以执行.应对代码注入攻击的
防御机制是数据不可执行(data execution prevention,简称 DEP)机制 [99] .DEP 通过将数据段与代码段分离,并确保
数据段不可执行.此后,代码重用攻击得以提出,例如 ROP(return oriented programming) [100,101] ,JOP(jump oriented
programming) [102,103] 等.代码重用攻击不需要注入代码,而是从现有程序代码中找到一系列的片段(称为 gadgets)
并修改栈来链接 gadgets.代码重用攻击被证明能执行任意代码,但控制流完整性(control flow integrity,简称
CFI) [104,105] 以及一些基于特征的启发式方式 [106,107] 能够被用来检测与防御代码重用攻击.其他抵御代码重用攻
击的方案还包括修改编译器来使得程序没有可利用的 gadgets [108] ,或者通过地址空间随机化 [109] 来使得攻击者
很难找到 gadgets.更进一步的,内存攻击还能允许攻击者直接对内存中的数据进行读取或修改(称之为仅数据
攻击).基于数据流的系统化的攻击(data oriented programming,简称 DOP) [110] 与防御机制(data flow integrity,简
称 DFI) [111] 也随后得以提出.
浏览器环境的特殊性,使得内存攻防研究进入一个新的阶段.
• 代码注入攻击:浏览器通过引入在运行 JavaScript 时编译 JavaScript 的即时编译器(just-in-time
compiler,简称 JIT 编译器)来提高性能,这使得 JIT 编译后生成的代码(称为 JIT 代码)所在内存页的权限
必然是变化的:在生成 JIT 代码时,内存页的权限为可写;运行 JIT 代码时,内存页的权限为可读.这意味
着攻击者有可能来发起代码注入攻击.
• 代码重用攻击:JIT 编译意味着一个恶意的 frame 可以通过设计相应的 JavaScript 代码来在浏览器中注
入代码重用攻击所需要的 gadgets,从而传统的使用特定编译器来去除 gadgets 的方案并不能抵御对浏
览器的代码重用攻击;而且,浏览器的性能需求使得利用 CFI 来加固 JIT 代码是不可行的.
• 仅数据攻击:一个网页中可能包含来自不同源的 frame,这些不同源的代码将在同一进程中执行.一个
恶意 frame 可以利用内存攻击来直接修改受害者 frame 的数据.
浏览器环境中的内存攻击将对同源策略安全造成破坏性的影响.成功发起代码注入攻击和代码重用攻击
意味着攻击者 frame 可以直接执行任意代码,同源策略的安全防御能够很容易被绕过.发起仅数据攻击可以直
接读取与修改受害者 frame 的数据.由于同源策略的安全监控器与网页代码位于同一个渲染进程里,仅数据攻
击也可以通过修改浏览器的元数据来欺骗同源策略的安全监控器.考虑到浏览器(特别是 JIT 编译器)漏洞的不
可避免性,研究分析可行的内存攻击以及设计合适的防御方案,是浏览器同源策略安全研究中不可缺少的环节.