Page 195 - 《软件学报》2021年第8期
P. 195
罗武 等:浏览器同源策略安全研究综述 2477
盖,这有可能直接影响宿主 frame 自身的业务逻辑.
3.1.3 防御方案
应对第三方脚本安全威胁的主要方案是:将宿主 frame 本身的脚本与第三方脚本运行在不同的作用域下,
以实现第三方脚本与宿主 frame 的隔离.根据隔离机制方案的不同,我们将其划分为以下 4 类.
(1) 第 1 类是基于语言的防御机制.
即利用 JavaScript 语言的特性来实现脚本之间的隔离与资源共享.在该方向上的防御机制包括 Jate [44] 、
JSand [45] 、ScriptProtect [46] 、BrowserShield [47] 、Caja [48] 、GateKeeper [49] 等.图 3(a)展示了 Tran 等设计的 Jate 系统 [44] .
该系统首先利用一个网络代理来将在网页中包含一个 Jate 库并对第三方脚本进行重写.Jate 库利用 JavaScript
的“with(scope){⋅}”语句使得第三方脚本的所有变量不能超过 scope 变量的作用域,因而第三方脚本无法直接访
问宿主 frame 的其他变量.为支持第三方脚本对宿主 frame 的正常操作,Jate 利用 JavaScript 的对象代理(proxy)
机制为宿主 frame 中的相关变量创建代理对象,并在第三方脚本重写时,允许对这些代理对象的访问.同时,由于
对象代理机制允许设置回调函数,宿主 frame 可以实施对应的策略:当一个代理对象被调用时,该对象上的策略
回调函数将会被调用,用来判断第三方脚本是否被授权来访问宿主 frame 的对象,如图 3(a)中允许对 window 对
象的引用,但拒绝对 data 对象的引用.其实验表明,Jate 机制引入了接近 20%的开销.
作用域: 作用域: 作用域: site.com Worker: third.com
site.com third.com
宿主frame
代理对象引用 第三方脚本
window window 脚本
原生DOM 虚拟DOM
代理对象引用
data □ data
TreeHouse监测器 虚拟Worker API
创建作用域与 消息通信
代理对象
Jate库
原生Worker API
浏览器 浏览器
(a) 第 1 类防御机制:Jate 系统 [44] (b) 第 2 类防御机制:TreeHouse 系统 [30]
Fig.3 Examples for the type 1 and type 2 defense mechanisms
图 3 第 1 类与第 2 类防御机制示例
(2) 第 2 类是基于 Worker 的防御机制.
即利用浏览器提供的 WebWorker 来实现宿主 frame 与第三方脚本的隔离.由于 JavaScript 的单线程性质,
frame 中比较耗时的操作将会很大程度上影响到网页浏览体验.WebWorker 机制使得 JavaScript 可以请求浏览
器创建新的线程来运行指定代码.浏览器为 WebWorker 中的代码与宿主 frame 其他代码创建不同的作用域而实
现隔离.Ingram 等据此设计了 TreeHouse 系统 [30] .如图 3(b)所示,该系统将第三方脚本放置在 WebWorker 中,并创
建虚拟 DOM 来允许第三方脚本对特定 DOM 的合法访问.第三方脚本与宿主 frame 之间的交互需要通过消息
通信机制来实现.
(3) 第 3 类是基于 frame 的防御机制.
即利用浏览器的同源策略来实现宿主 frame 与第三方脚本的强隔离.在该方向上的防御机制包括
AdJail [50] 、Pivot [51] 、Mashic [52] 、MashupOS [53] 等.举例来说,Louw 等人提出了 AdJail [50] 系统,来将第三方脚本放
置在一个具有唯一源的 frame 中.根据同源策略,运行在另一个源中的第三方脚本将无法直接访问原来宿主
frame 的数据.为了保留第三方脚本对宿主 frame 某些资源的访问,AdJail 系统利用消息通信机制来实现资源共
享.Mickens 等人更进一步地提出了 Pivot 系统 [51] .类似于 AdJail,第三方脚本被放置在不同源的 frame 中来实现
隔离.然而, AdJail 的资源共享由于利用消息通信机制使得其必须是异步操作,Pivot 利用 JavaScript 语言中的