导语:在本文中,我们将为读者介绍Web扩展安全方面的知识。
在本文中,我们将为读者介绍Web扩展安全方面的知识。我们知道,Web扩展提供了大量的新API,为了能够在这个安全领域自由翱翔,首先需要了解它们的运行机制。
WebExtension安全性概述
对于浏览器在网络内容方面所面临的基本安全问题,我想大家都已经很熟悉了。实际上,Web内容所面临的大多数安全问题(同源策略违规、XSS、clickjacking等)也适用于WebExtensions。但是,这里要讨论的是WebExtension所特有的安全问题,为此,我们需要了解一些WebExtension方面的新知识。为此,我们建议读者阅读MDN,或者考察一些小型WebExtension的源代码以获得更好的理解。
关于权限
所有WebExtensions都必须提供一个名为manifest.json的文件,其中包含描述扩展的元数据。在这里,我们将重点关注该文件中的数组变量permissions。如果您曾经安装过浏览器扩展的话,就会发现安装之前会先显示一则提示信息,告诉您该扩展所提供的功能。
例如,如果WebExtension权限数组中包含“bookmarks”的话,则在安装之前会通知用户该扩展将有权访问其书签。有了这种权限的话,我们就可以通过编程来破解用户的书签。
同样,如果我们获得了“downloads”权限的话,就能够与下载管理器进行交互。当然,我们可以同时获取这两种权限,并且在安装之前会向用户告知这两种权限。
此外,我们也可以添加带有通配符的网站。这样的话,就能一次添加多个网站,只要它们符合匹配模式。
说到这里,有心的读者可能已经注意到了其中隐含的安全问题。如果您具有使用类似“*://*.example.org/*”这种模式的权限,那么您的扩展就可以在“https://anything.example.org/anything”上执行JS。
因此,如果您请求的是站点A的权限,但是却能在另一站点(不匹配的权限)站点B执行代码的话,那么这可能就是一个安全漏洞。此外,您还可以请求文件:URI方案的权限。
需要注意的是,通配符*://不能匹配file: URL这种形式,而只能匹配http/s,所以您必须明确写出来。同样,如果您请求的是使用“downloads”API的权限,却能以某种方式通过它来访问书签(这需要“bookmarks”权限)的话,那么这也是一个值得注意的安全漏洞。
链接限制
在各种权限中,最有趣的就是<all_urls>了,在FireFox上,该权限允许您在任意内容的URL(包括http/s和file:URI)上执行任意JS,但不允许访问特权(about:addons)和半特权URL(稍后将详细介绍)。
请记住,Firefox允许您的扩展在file:URL(具有<all_urls>或file://*权限)内执行JS,但是这并不意味着您可以以编程方式打开file:URL。
用户必须使用浏览器手动打开一个文件,然后您才能够向其中注入JS(然后通过将JS注入到一个file: URL,继而通过注入的JS来打开其他file: URL)。因此,如果您可以(在Firefox上)以编程方式打开file: URL(无需依赖用户为您打开任何内容),那么这就是一个从天而降的“大馅饼”。
但是,对于Chrome浏览器而言,在默认情况下,我们可以通过编程方式打开file: URL(具有适当的匹配模式权限)。需要注意的是,在默认情况下(或使用适当的匹配模式)是无法注入JS的。如果想注入JS,需要选中特定WebExtension选项,具体如下所示。如果在没有选中“Allow access to file URLs”复选框的情况下,就能够在file:URL中注入JS的话,说明您找到一个安全漏洞。
上面为大家详细介绍了与浏览器扩展有关的相关知识,接下来我们向读者介绍几个与浏览器扩展有关的安全漏洞。在本文的第2部分中,我们将会为读者介绍更多的相关漏洞。
CVE-2018-5113——launchWebAuthFlow可以打开特权页面——Firefox浏览器
利用“identity”权限,我们可以访问用于启动OAuth2登录流程的launchWebAuthFlow函数。下面给出JS PoC:
browser.identity.launchWebAuthFlow({ interactive: true, url: 'about:addons?redirect_uri=http://any' });
正如读者已经注意到的那样,该函数会检查redirect_uri是否被附加到url,否则会抛出一个错误。更重要的是,这里能打开about:addons页面(本例中是通过一个新窗口打开的)。
正如我上面提到的,除非用户已经打开过单个文件的URL(至少一次),否则Firefox是不允许扩展打开诸如about:addons之类的页面或本地文件的。
所以,利用这个安全漏洞,我们就可以读取整个磁盘,或利用它来链接另一个漏洞,来发动其他方面的攻击。
这里可能会让人感到困惑,因为Chrome是允许导航至特权页面(about: pages)的,而Firefox则不允许。据我所知,Mozilla安全团队认为这样做会带来安全风险,因为如果与其他漏洞相结合的话,会导致更大的安全漏洞。
例如,WebExtensions中可能存在一个允许在特权页面上执行任意JS执行的漏洞,但是除非用户明确这么做,否则是不能自动打开这样的页面(about:home不是特权而是半特权页面,而特权页面在默认情况下是可能导致RCE问题。)所以,这里的漏洞可以用来打开一个特权页面,然后通过其他漏洞向其中注入代码,以实现RCE攻击。
Firefox禁止打开具有特权的about: pages页面的另一个原因也很简单:XSS。
我曾经在Firefox浏览器的“about:cache”页面中找到了一个XSS漏洞。然而,为了触发这个漏洞,要求受害者访问两个特权页面。
首先,受害者需要访问以下URL:
about:cache-entry?storage=memory&context=&eid=<svg/onload=alert(location)>&uri=http://aa.com
然后,受害者还必须访问下面的URL:
about:cache?storage=memory&context=
在第一步中,对原始的输入进行缓存时,好像没有对参数eid进行严格的过滤。不幸的是,虽然这里的about:cache页面没有特权(不能执行RCE),但它仍然包含了大量的私人数据。
很明显,除非结合其他允许打开任意about: URL的安全漏洞,否则这个XSS本身没有多大的用处。为此,可以设法让用户安装一个恶意WebExtension,该扩展只需要identity权限即可,之后,我们就可以组合这两个漏洞,从而达到在about:cache页面内执行JS的目的。
CVE-2018-5112——browser.devtools.panels.create无法确保面板pagePath为相对URL(Firefox)
这个漏洞允许攻击者在devtools中打开任意的需要URL(包括具有特权的URL),这要求具有devtools权限。不过,由于该漏洞的利用过程要求用户手动打开Devtools,所以它没有前面的漏洞那样严重。
PoC:
browser.devtools.panels.create( "My Panel", "icons/star.png", "about:about"//<-- ).then((newPanel) => { console.dir(newPanel) newPanel.onShown.addListener(handleShown); newPanel.onHidden.addListener(handleHidden); });
CVE-2018-5134——Web扩展可以通过view-source:打开任意URL(Firefox)
对于这个漏洞,上面的标题已经说的很明白了。正如我们以前所了解的那样,通常不允许扩展具有打开about:URL的权限,但实际上只要在URL开头部分加上view-source:,就能轻松绕过这些限制。这个漏洞对权限没有特殊的要求,默认情况下攻击者可以打开新的选项卡。
PoC:
browser.tabs.create({url:"view-source:about:about"})
CVE-2018-5135——activeTab权限能够在本不应该允许执行脚本的页面上执行脚本(Firefox)
activeTab权限使WebExtension能够访问用户跟扩展进行交互的活动标签IFF。用户可以通过三种方式与扩展进行交互:
1.单击Firefox右上角显示的扩展按钮。
2.单击自定义上下文菜单(右键单击时显示的内容)按钮。
3.激活扩展分配给自己的键盘快捷键。
就本例来说,我只是注意到,该功能并未禁止该扩展从about:cache页面内执行JS,而该页面是一个半特权页面,正常情况下是不允许扩展访问的。
对于这个漏洞,只要检查是否可以截取半特权页面即可找到它。
未完待续
这篇文章中介绍的安全漏洞仍然只是冰山一角:实际上,我们已经在WebExtensions中发现了20多个漏洞,而这里仅仅列举了4个而已。通过将这些漏洞组合起来,就能够通过WebExtensions实现RCE攻击。一旦其他漏洞得到了修复,我会第一时间将其公布出来。如果读者有任何疑问,可以通过Twitter平台与我进行探讨,我的账户为@qab。