acm-header
登录

ACM通信

研究突出了

使用VEX检查浏览器扩展是否存在安全漏洞


检查员

信贷:找到图标

浏览器已经成为日常计算的实际平台,成为计算机系统攻击者的热门目标。在针对或利用浏览器的许多潜在攻击中,浏览器扩展漏洞受到的关注相对较少。目前,扩展是通过人工检查进行审查的,这既耗时又容易出现人为错误。在本文中,我们提出了VEX框架,该框架将静态信息流分析应用于JavaScript代码,以识别浏览器扩展中的安全漏洞。我们描述了几种可能导致Firefox扩展中的特权升级的流模式。VEX使用高精度的、上下文敏感的、流敏感的静态分析来分析这些流模式的Firefox扩展。我们对2460个浏览器扩展进行了分析,VEX发现了18个之前已知的漏洞中的5个和7个之前未知的漏洞。

回到顶部

1.简介

推动互联网革命的是现代Web浏览器,它已经从一个用于显示静态数据的相对简单的客户端应用程序演变为一个复杂的网络操作系统,负责管理用户在线体验的多个方面。为了帮助满足广大用户群体的各种需求,浏览器扩展通过插入浏览器级别的事件和数据并与之交互,扩展浏览器的功能。有些扩展很简单,只对Web页面或浏览器本身的外观做很小的更改。其他扩展提供了更复杂的功能,如NOSCRIPT提供了对页面JavaScript执行的细粒度控制,15或者为脚本浏览器行为提供成熟的编程环境的润滑脂- monkey。3.这些只是目前Firefox(当今第二受欢迎的浏览器)可使用的数千个扩展中的几个。

善意编写的扩展可能具有微妙的安全相关bug,称为漏洞,这些漏洞使用户容易受到来自Web的毁灭性攻击,通常仅通过查看Web页面即可。Firefox扩展具有完全的浏览器权限,因此攻击者可以利用扩展弱点接管浏览器,窃取cookie或受保护的密码,破坏机密信息,甚至劫持主机系统,而不向用户透露他们的操作。不幸的是,在过去几年里已经发现了几十个扩展漏洞,并且已经证明了针对有bug的扩展的有效攻击。11

在本文中,我们提出了VEX,这是一个使用静态信息流分析来查找浏览器扩展漏洞的系统。我们的关键见解是扩展漏洞通常转化为从可注入源到可执行汇的显式信息流.对于善意编写的扩展,大多数攻击都是攻击者将JavaScript注入到数据项中,然后由扩展在完全的浏览器权限下执行。我们识别可能导致安全漏洞的这种性质的关键流,并使用既对路径敏感又对上下文敏感的高精度静态分析检查扩展是否存在这种流,以最小化假阳性可疑流的数量。VEX有特殊的特性来处理JavaScript的怪癖(例如,VEX对流入eval语句,执行动态生成的代码)。

确定扩展是否恶意或隐藏安全漏洞是一个困难的问题。扩展通常是复杂的工件,它们以微妙且难以理解的方式与浏览器交互。例如,ADBLOCK PLUS扩展执行看似简单的任务,根据广告服务器列表过滤掉广告。然而,ADBLOCK PLUS实现由超过11K行的JavaScript代码组成。类似地,NOSCRIPT扩展对允许哪些域执行JavaScript和基本的跨站点脚本保护提供了细粒度控制。NOSCRIPT扩展实现由超过19K行的JavaScript代码组成。此外,ADBLOCK PLUS在2006年1月1日至2011年10月6日发布了41个版本,NOSCRIPT在2011年1月1日至2011年10月6日发布了48个版本。虽然Mozilla在将每个新扩展和修订发布到官方批准的Firefox扩展列表之前会使用志愿者对其进行审查,但检查一个扩展以发现漏洞需要对代码有详细的了解,才能推理出最基本的信息流类型之外的任何东西。因此,帮助审查浏览器扩展的工具对于提高扩展的安全性非常有用。

我们展示了VEX识别了5个以前已知的漏洞,并识别了导致发现7个以前未知漏洞的其他流,包括扩展WIKIPEDIA TOOLBAR、MOUSE gesture和KAIZOU中的漏洞。

回到顶部

2.威胁模型、假设和使用模型

在本文中,我们将重点关注在有bug的浏览器扩展中寻找安全漏洞。我们不会试图识别恶意扩展、浏览器本身的bug或其他浏览器扩展机制(如插件)中的bug。我们假设开发人员既没有恶意,也没有试图混淆扩展功能,但我们假设开发人员可能编写包含漏洞的错误代码。

我们使用两种攻击模型。首先,我们考虑来自Web站点的攻击,并假设攻击者可以向用户的浏览器发送任意HTML和JavaScript,建模使用模型,假设用户可以导航到internet上的任何页面。我们关注的攻击是,这些不受信任的数据可以通过有bug的扩展导致代码注入或特权升级。在第二个攻击模型中,我们假设与上面的模型相同,但是我们认为某些Web站点是可信的。例如,如果一个扩展从Facebook网站收集信息,我们假设Facebook数据将包括任意的HTML和JavaScript,但只包含格式良好和可信的数据。

根据Mozilla开发者网站,Mozilla有一个志愿者团队,他们帮助手动检查扩展。它们在一个虚拟机中运行新的和更新的扩展,以测试用户体验。编辑器还使用验证工具,该工具使用grep寻找错误的关键指标。他们搜索的许多模式都涉及扩展和Web页面之间的交互,并且他们使用对这些模式的理解来帮助指导他们对代码的检查。我们的目标是帮助实现这个过程的自动化,以便分析人员能够快速地研究可能包含安全漏洞的特定代码片段。图1显示了我们使用VEX的整体工作流程:当扩展受到VEX的分析时,它会报告扩展代码中从不可信源到可执行汇的精确代码路径,专家必须手动检查这些路径,以检查它们是否可以用来发起攻击。

回到顶部

3.恼人的信息流模式

Firefox有两个特权级别:页面用于浏览器内容窗格中显示的Web页面,以及用于属于Firefox及其扩展的元素。页面特权比chrome特权更具限制性。例如,从。加载的页面illinois.edu只能从illinois.edu.Firefox代码和扩展以完全的chrome权限运行,这使它们能够访问所有浏览器状态和事件、操作系统资源(如文件系统和网络)和所有Web页面。扩展还可以通过类包含它们自己的用户界面组件chrome的文档,它可以运行与完整的chrome特权。

Firefox为扩展代码提供了跨保护域通信的api,这些交互是导致扩展安全漏洞的原因之一。正如Mozilla开发者网站所解释的,“扩展最常见的安全问题之一是在特权上下文中执行远程代码。一个典型的例子是RSS阅读器扩展,它将获取RSS提要的内容(HTML代码),将其格式化并插入到扩展窗口中。这里经常被忽略的问题是,RSS提要可能包含一些恶意的JavaScript代码,然后它将以扩展的特权执行,这意味着它将获得对浏览器(cookie,历史等)和用户文件的完全访问权。”

我们将这些跨保护域交互描述为信息流模式,从包含页面内容的JavaScript对象(不受信任的源)到使用chrome特权执行内容的JavaScript对象和方法(可执行汇)。在本节中,我们将讨论VEX跟踪的源和汇。这些源和汇之间的流有时是良性的,并且表示可能的扩展安全错误的不完整列表,但是这些模式被VEX认为是可疑的。

*3.1.不可信的来源

我们现在描述扩展可以访问的不可信JavaScript对象。不受信任的对象可能包含外部脚本,如果使用chrome特权运行,可能导致攻击。

JavaScript内容文档对象(window.content.document)直接访问浏览器的内容页,因此是一个不可信的源。此外,浏览器设置JavaScript弹出节点(document.popupNode)当用户右键单击文档对象模型(DOM)元素时。如果这个DOM元素是页面内容的一部分,那么它包含不可信的页面内容。

扩展用于访问持久状态的一个API是资源描述框架(RDF)。RDF是描述浏览器资源之间层次关系的模型17并且被浏览器用来存储持久数据,比如书签。扩展开发人员可以将持久扩展数据存储在RDF文件中,或者访问以RDF格式存储的浏览器资源。然而,RDF数据可能来自不可信的来源。例如,当用户存储书签时,Firefox将在RDF文件中记录书签页面的未消毒标题,该标题由Web页面控制。控件还可以访问未消毒的书签urlnsILivemarkService接口和BookmarksUtils对象。

扩展通过nsIPrefService接口。任何扩展都可以在首选项中设置值,并且扩展可以不受检查地访问所有首选项设置。一些扩展使用此服务存储从Web页面内容获得的不可信字符串;因此,使用此服务也被视为不可信源。

总之,VEX将以下对象视为不可信源对象:window.content.document、document.popupNode BookmarksUtils,并访问对象的新实例nsIRDFService nsILivemark服务,nsIPrefService

*3.2.可执行的水槽

现在我们描述一组可执行接收器,它们是JavaScript对象和方法,提供了一种动态解析和执行JavaScript的方法。VEX认为这些可执行接收器在使用chrome特权执行不受信任的JavaScript代码时具有潜在的危险。

eval函数调用将字符串数据解释为JavaScript,并动态执行。这种灵活的机制可用于动态生成JavaScript代码,例如反序列化JavaScript对象符号(JSON)对象。然而,这种灵活性可能导致扩展中的代码注入漏洞。如果扩展执行eval函数在来自不可信源的未消毒字符串上,攻击者可以注入运行完全chrome权限的JavaScript代码。

页面中的每个HTML元素都有一个innerHTML属性,该属性定义出现在元素开始和结束标记之间的文本。扩展可以更改innerHTML属性来更改现有的DOM元素,或添加新的DOM元素,因为在JavaScript代码修改了该属性之后,浏览器将解析修改后的文本。因此,传递特别制作的字符串(例如,标签,在它们的onload属性)innerHTML可能导致代码注入攻击。

扩展可以将新的DOM元素添加到内容页面或chrome页面列表末尾方法。此方法使浏览器解析和处理元素中的数据,类似于innerHTML财产。因此,该特性也可用于执行注入代码。

总之,我们在VEX中考虑的可执行接收器是对函数的调用eval而且列表末尾,以及分配给innerHTML财产。

回到顶部

4.静态信息流分析

VEX的核心组件是一个静态分析工具,用于检测用JavaScript编写的浏览器扩展中的显式信息流。VEX计算不同源和汇之间的流,包括第3节中描述的所有源和汇。为了支持细粒度的信息流分析,VEX使用基于污染的分析跟踪从源对象到JavaScript扩展中遇到的接收器的流。由于每个报告的流都需要手动检查攻击,这可能需要大量的人工工作,我们的目标是进行一种允许尽可能少的假阳性的分析,其中假阳性是由VEX报告的流,但在运行时实际上不会发生。

静态分析流的JavaScript扩展是一项艰巨的任务。JavaScript中的对象属性是动态变化的,也就是说新的对象属性可以在运行时动态创建。函数是JavaScript中的对象,因此可以动态创建、重新定义并作为参数传递。除了程序中定义的对象之外,扩展还可以访问浏览器的DOM API和XPCOM组件提供的Firefox Extension API,静态分析必须正确地处理它们。JavaScript浏览器扩展也有大量需要跟踪的对象和函数。挑战在于准确地跟踪这些对象、属性以及与之对应的流。

VEX中的分析引擎是用于检测显式流的静态污染分析,其中JavaScript的污染传播是通过改编Maffeis等人提出的JavaScript操作语义来实现的。13在分析中,我们用抽象的堆,其中抽象堆精确地跟踪对象及其属性,但抽象存储的原始值。抽象堆可以被视为一个有向图,其中JavaScript程序中的每个对象和函数都表示为一个节点,而堆中的边缘表示不同对象之间的字段关系。此外,抽象堆中的每个节点都与一个污染值相关联,VEX的分析使用该值来计算从源对象到接收器的信息流。

在分析中,VEX只处理无循环的程序,并首先通过展开有限次数的循环将带有循环的程序转换为无循环的程序(因此分析不是这样的)soundsee4.3节)。VEX抽象语义通过模仿JavaScript的操作语义,相当精确地计算和跟踪(无循环)程序上的抽象堆。与文献中使用的常见抽象域不同,在分析过程中的任何时刻,抽象堆都没有表示两个对象的单个节点;因此,VEX在跟踪精确的堆节点、字段关系和相应的流方面相当准确,只忽略堆中的精确原始值(如整数)。由于程序被展开为无循环的代码,抽象堆的大小是有限的,这导致了终止算法。

*4.1.JavaScript的抽象语义

在本节中,将详细描述抽象堆,然后描述用于静态分析的数据结构。还描述了VEX静态分析背后的高级思想。

摘要堆:我们使用抽象堆的概念对JavaScript程序的状态进行建模。每个对象都存储在堆上。堆被建模为一组(位置、对象)对。位置是在程序中创建新对象时任意生成的名称。对象是(属性名、值)对的集合。属性名可以是标识符或字符串。抽象值可以是堆位置(如果属性指向另一个对象)、函数声明、安全类型或原语值。安全类型跟踪污点;如果存在从源对象到接收器对象的显式流,接收器对象的安全类型将获得与源对象关联的污染。安全类型被建模为一对(污染值,源字符串); the taint value could either be LOW or HIGH and the taint source is a string identifying the source object of the taint. The primitive string values are preserved and propagated through string operations, whenever they evaluate to constant strings. All other primitive values are abstracted.

图2给出了一个使用VEX分析计算的JavaScript堆示例。JavaScript程序中的每个对象和函数都表示为堆中的一个节点,而对象的属性则使用图中的边表示。图中为全局对象loc_Global有五个属性ObjectProt, FunctionProt, Array, ArrayProt,array_instance指向节点loc_ObjProt, loc_FunProt, loc_1, loc_ArrayProt,loc_4分别。堆中的每个节点都与一个污染值相关,高或LOWHIGH表示不可信对象,LOW表示受信任对象。在图中,高污染和低污染分别用红色和蓝色节点表示图2).图3显示了最初的的抽象堆表示window.content.document对象和window.document对象;注意其中一个节点loc_document有很高的污染。

分析:VEX分析基于一组规则,这些规则根据程序中的每个语句转换抽象堆,它的工作原理基本上是过分接近语句对抽象堆的影响。这些规则严格遵循Maffeis等人提出的小步骤操作语义,13它涵盖了JavaScript的ECMA-262标准。JavaScript核心对象和函数被总结为只有基本的功能;第4.2节给出了一个例子摘要。在当前程序执行中或通过摘要未初始化的变量和函数将初始化为指向具有HIGH污染的占位符虚拟对象。在扩展中创建的对象的默认污染设置为LOW,除非分析显式地将值设置为HIGH或变量未初始化。程序中的循环被展开有限次,函数调用被内联以进行递归调用的有限展开,并探索结果程序的每条路径。因此,VEX可能会忽略某些流,如4.3节所讨论的。由于抽象的原因,静态分析不计算程序条件语句中的条件。每当它到达一个条件语句时,将以深度优先的方式遍历两个分支,以确保覆盖整个程序。分析是流敏感的,而且由于内联,也是上下文敏感的。

原型:JavaScript使用基于原型的继承。9JavaScript堆中的每个对象都有一个特殊的@Proto属性,该属性用于指定继承链。此外,可以用作构造函数的每个函数()有一个原型财产。这原型属性用于实例化@Proto属性在使用函数构造函数创建新对象时。对象继承它的所有属性@Proto以及原型中所有的物体@Proto链。

图2说明了VEX如何处理基于原型的继承。的数组对象在JavaScript中表示为节点loc_1在图中。自数组对象是一个构造函数,它可以用来创建数组的新实例,它有一个原型指向物体的场,ArrayProt,在图中用节点表示loc_ArrayProt.一个新的数组例如,array_instance对象,在程序中使用语句创建:array_instance = new Array ().在图2loc_4代表了array_instance对象。的@Proto字段指向该对象loc_ArrayProt.因此,push方法可访问array_instance对象,并可以使用array_instance.push

*4.2.处理JavaScript的其他特性

函数和对象摘要:本机支持的函数和对象被替换为总结访问时对堆的影响和缺陷的存根。因此,VEX函数和对象摘要是简化的JavaScript对象和函数,只包含对象的基本功能。例如,JavaScript数组对象在图4的函数对象@Class,原型,@Proto属性初始化为字符串"Function",标识符ArrayProt,标识符FunctionProt,分别。的变量FunctionProt而且ArrayProt指向原型对象,其中包含各种函数,如长度而且

浏览器的DOM API和XPCOM组件:VEX将大多数浏览器的DOM API和XPCOM组件视为未初始化的变量、字段和函数。然而,VEX为API组件和对象提供了显式的函数摘要,VEX需要跟踪这些组件和对象,以便跟踪进出对象的流。VEX分析将表示不安全源或依赖于不安全源的对象的污染设置为HIGH。

高阶函数:VEX分析精确地跟踪对象,并根据JavaScript语义内联函数体来实现函数调用。高阶函数调用也是内联的。此外,VEX在JavaScript API中提供了一些高阶函数的摘要。例如,settimeout函数的第一个参数是回调函数。该函数在VEX中表示为函数体调用第一个参数中的回调函数的函数。

动态生成的代码:eval方法允许执行动态形式的代码,在浏览器扩展中广泛使用。虽然准确地分析动态创建代码的结构本身就是一个研究课题,而且超出了本文的范围,但分析不能简单地忽略eval语句。VEX分析执行常量字符串分析用于字符串和字符串操作。如果实际参数为eval语句求值为常量字符串时,VEX的静态分析引擎将解析这些常量字符串并将它们插入到程序流中eval声明。这确保了这些新解析的语句包含在污染的计算中。在大多数正确的扩展中,aneval-ed语句从一组常量字符串中动态选择,或从可信的源获取,因此在所探索的路径上计算为常量字符串(并由VEX精确跟踪)。参数eval,其确切的字符串值不是由VEX沿着所探索的路径静态推断的,测试它们是否被污染。如果有气流从不可信的源的eval, VEX将报告此流量,因为它对应于一个脆弱的流量模式。

以关联数组的形式访问的对象属性:在JavaScript中,对象被视为关联数组。这意味着可以使用数组表示法访问对象的任何属性。数组下标可以是常量字符串,然后对其求值以获得被访问的实际属性;或者它们可以是数字,表示正在访问的属性号;或者它们可以是变量,可以在运行时实例化。如果VEX由于任何原因无法计算属性名的数组索引,则数组访问将保守地获得父数组对象中每个属性的污染。

接受任意数量参数的函数:JavaScript中的一些函数可以有数量不定的参数。例如,方法可以用任意数量的实参调用,实参将被追加到数组的末尾。要在VEX中处理此问题,表示方法有一个特殊的属性,表明它可以接受可变数量的参数,当调用该方法时,VEX分析会保守地将所有参数的污点附加到方法设置为调用该方法的数组对象。

*4.3.关于稳健的注释

大多数静态分析工具,例如编译器中使用的工具和抽象解释中使用的工具,over-approximate具体的语义,因此是声音.在流分析的上下文中,一个可靠的工具在程序有流的时候从不报告它没有流。稳健往往需要大量的假阳性例如,工具报告的流,但在执行过程中可能实际上从未发生过。

VEX并不可靠。我们相信,一个完善的、最先进的JavaScript扩展分析工具将会用大量的误报来压倒和挫败工具的用户。因此,为了处理JavaScript的某些特性而不产生过多的误报,我们选择不让VEX发出声音。因此,例如,恶意编写的扩展可以很容易地躲过VEX的检测。另一方面,恶意编写的扩展很容易直接伤害它的用户,而不需要来自不受信任的Web页面的任何输入。这就是为什么我们的威胁模型假设扩展作者不是恶意的原因。

我们没有把目标放在稳健性上,而是集中精力使VEX在程序中的路径上相当准确崩溃(合并)堆的节点以任何方式。然而,由于VEX只能以这种精确的方式分析程序中有限数量的路径(通过展开有限次数的递归获得),因此VEX执行的分析本质上是不可靠的。

当然,在VEX中也可能出现假阳性,也就是说,VEX可能报告程序中实际上不存在的流。这源于分析使用抽象的事实。特别是,没有足够精确的信息来计算条件,不能精确地确定要受约束的字符串的值eval报表等是假阳性的常见来源。与合并堆中节点的程序中的经典堆分析相比,VEX执行更精确的分析,大大减少了误报的数量。在实验中,我们发现VEX产生的假阳性非常少。

总的来说,我们的选择主要是由JavaScript分析的复杂性和我们构建一个有用的工具,这反过来又导致我们牺牲了稳健。

回到顶部

5.评价

VEX是用Java (~7000 LOC)实现的,并利用一个JavaScript解析器,该解析器使用ANTLR解析器生成器为ANTLR提供的JavaScript 1.5语法构建。1ANTLR为从扩展的XUL和JavaScript文件预处理中获得的JavaScript源输出基于java的抽象语法树(AST)。XUL文件向浏览器的chrome添加了不同的UI元素。当调用和单击任何一个用户界面元素时,将触发相应的事件并调用事件处理程序。我们从XUL文件中提取对事件处理程序的所有此类调用,并使用VEX的抽象操作语义运行它们。

在使用第4节中概述的抽象操作语义执行程序期间,如果程序到达一个脆弱的接收器,它将检查对接收器的输入或分配是否受到污染。如果它们受到了污染,VEX将报告流的发生以及代码中的源对象和接收器位置。源对象是第3节中描述的对象,接收器位置是在执行过程中遇到第3节中描述的接收器的点。本节的其余部分总结了我们的结果。

循环展开的数量可以设置为VEX分析引擎中的一个参数(在我们的实验中,只有一个使用)。VEX实现有许多优化来提高内存使用和速度。为了节省内存,在深度优先搜索中回溯时释放抽象堆。但是为了节省时间,在连接点上的抽象堆被缓存,并在其他路径到达这些点时进行比较,以避免不必要的探索路径。

*5.1.评价方法

我们分析的扩展如下所示。首先,在2008年10月,我们从Mozilla插件网站上随机选取1827个扩展,按字母顺序下载所有主题类别的第一批扩展,构建了一套扩展。该扩展套件有两个具有已知漏洞的扩展。2009年11月,我们下载了699个最流行的扩展和8个已知漏洞的扩展。随机样本和流行扩展有74个共同的扩展,总共有2460个扩展。我们的套件包括多个版本的一些扩展,允许跨版本比较。例如,我们发现了FIZZLE的一个新版本(参见Bandhakavi等。2),尽管它的作者试图修复上一个版本中的漏洞,但它仍然很容易受到攻击。

我们从这些扩展中提取JavaScript文件并在上面运行VEX,使用2.4 GHz 64位× 86处理器,JVM的最大堆大小为16GB。

为了评估VEX的有效性,我们进行了两种实验。首先,我们在下载的扩展上运行VEX,检查它们中是否有恶意流模式。其次,我们检查VEX是否可以检测到已知的扩展漏洞。

*5.2.实验结果

查找从可注入源到可执行汇的流程:图5总结了从可注入源到可执行汇(汇为的流)的实验结果eval而且innerHTML).在VEX分析的2460个扩展中,agrep显示了总共有977个扩展出现了字符串"eval"或者弦"innerHTML”或两者兼而有之。

的第一列图5表示VEX检查的确切源汇流型。第二列表示VEX报告具有相应流的警报的扩展的数量。平均而言,VEX每次扩展需要11.5秒。我们花了大约一周的时间来分析从不可信源到的所有扩展eval而且innerHTML下沉。

为了寻找潜在的攻击,我们手动分析了VEX发现的带有可疑流的扩展,平均每个扩展花费约20分钟。下一列报告了我们可以基于VEX报告的流设计攻击的扩展的数量。我们能够攻击9个扩展,其中只有两个扩展(FIZZLE VERSION 0.5和BEATNIK V-1.0)是已知的易受攻击的。其余的袭击都是新的。

下一列显示扩展,其中源由扩展用户或扩展开发人员提供,或者由扩展从系统参数计算。这些值要么存储在首选项中,要么存储在本地文件中。因为我们信任信任模型中的用户和扩展开发人员,所以这些扩展被认为是不容易受到攻击的。但是,如果首选项文件或本地文件系统以任何方式损坏,这些扩展都可能受到攻击。

第五列显示了扩展,其中源代码是来自Web站点的代码,以及攻击的位置是可能的前提是该网站可以被攻击。换句话说,这些扩展依赖于信任的网站假设(例如,Facebook网站上的代码是安全的)。我们认为这些是有效的警告,扩展(和Mozilla)的用户应该意识到;受信任的网站最终可能会被破坏,这些网站上的代码可能会被更改,从而导致对此类扩展的所有用户的攻击。

并不是所有的流都会导致攻击,下一组专栏将描述我们无法转化为具体攻击的警报。有些扩展不能像输入那样利用消毒正确地(通过扩展或浏览器),防止JavaScript注入。其他扩展不能利用,因为水槽不在chrome可执行上下文中。这些扩展将在接下来的两列中提到。最后,VEX,作为一个静态流分析工具,确实报告了关于实际上不存在的流的警报——这些流很少,并在“不存在的流”一栏下注明。第5.4节讨论了不导致攻击的流。

新发现的漏洞:中第3列显示了发现的安全漏洞的数量图5其中7个是新的。维基百科工具栏版本V-0.5.7和V-0.5.9有来自window.content.documenteval,这就导致了攻击。氧化还原V-2.0.3有从nsIPrefServiceeval这也导致了一起袭击。BEATNIK V-1.2、FIZZLE V-0.5.1和FIZZLE V-0.5.2也是可攻击的,并且有来自nsIRDFServiceinnerHTML.KAIZOU V-0.5.8有一个流量从window.content.documentinnerHTML这就导致了攻击。第5.3节给出了一些关于流和一些脆弱扩展中的攻击的详细信息。关于FIZZLE(和BEATNIK)漏洞的详细信息可以在本文的前一个版本中找到。2

已知的漏洞检测:除了VEX发现的新漏洞外,过去还报告了几个易受攻击的扩展。在我们的研究过程中,我们发现18个独特的扩展被报告在各种数据库,如CVE, Secunia等容易受到攻击。在这18个扩展中,我们没有找到5个扩展的源代码(GREASEMONKEY v 0.3.5, WIZZ RSS v < 3.1.0.0, SKYPE v 3.8.0.188, MOUSEOVERDICTIONARY v < 0.6.2, POW v < 0.0.9),所以我们没有分析它们。在剩下的13个扩展中,我们发现可以使用显式信息流分析技术(如VEX)找到其中的10个扩展。

目前,VEX可以检测到上述10个已知的具有基于流的漏洞的扩展中的5个:FIZZLE V-0.5, BEATNIK V-1.0, coolpreview V-2.7, 2.7.2, inss V-<=1.1.4.2, SAGE V-< 1.3.9, <=1.4.3。coolpreview有来自的流document.popupNode列表末尾.inss的流量来自nsIRDFService列表末尾.SAGE有来自BookmarksUtils方法访问本地文件系统的对象nsIFile接口。

其余五个扩展存在流漏洞,但由于以下原因,VEX没有发现。对于FEEDSIDEBAR V< 3.2, FIREBUG V-1.01, SCRIBEFIRE V<= 3.4.2, UPDATE SCANNER V< 3.0.3,流的触发器在事件处理程序或在扩展代码库之外调用的函数调用中。在YOONO版本6.1.1中,一个未经消毒的JavaScript元素(如图像或链接)会在chrome上下文中呈现。但是,很难从源代码中找到源对象和接收器对象。

最后,有三个扩展漏洞(我们有源代码)不能被VEX发现,因为它们不是流漏洞。这些漏洞包括对文件服务器的攻击(例如,FIREFTP V < 0.97.2, < 1.04),以及当chrome包是“扁平的”而不是包含在jar中时的目录遍历攻击(例如,NAVIGATIONAL SOUNDS版本-1.0.2,AJAX YAHOO MAIL VIAMATIC WEBMAIL版本-0.9)。在上述两种情况下,攻击者都可以从扩展的目录中逃脱,并读取磁盘上可预测位置的文件。因为这类攻击与chrome特权升级无关,VEX也不处理它们。

*5.3.成功的攻击

攻击脚本:我们所有的攻击场景都涉及一个用户,他安装了一个易受攻击的扩展,他访问恶意页面,并自动或通过调用扩展,触发编写在恶意页面上的脚本在chrome上下文中执行。图6演示可用于此类攻击的攻击有效负载:此脚本显示根目录中的文件夹和文件。

攻击的有效载荷可能更加危险,攻击者可以使用XPCOM API函数获得对受影响计算机的完全控制。Freeman和Liverani给出的白皮书中列举了更多此类有效载荷的例子7在本节中,我们将演示一些针对具有未知漏洞的扩展的攻击。

维基百科工具栏,至0.5.9版本:如果用户访问一个标记中包含目录显示攻击脚本的Web页面,并单击Wikipedia工具栏中的一个按钮(取消监视、清除等),该脚本将在chrome上下文中执行。攻击有效,因为扩展有给定的代码图7在它的toolbar.js文件中。

第一行从Web页面获取第一个