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 语言中的
   190   191   192   193   194   195   196   197   198   199   200