我们主动向 Opera 团队披露信息,并迅速做出反应,体现了安全研究人员和浏览器开发人员在保护用户方面的重要合作。本文旨在阐明研究过程的复杂细节和发现的漏洞,以及为保护数字体验免受不断变化的网络威胁而正在进行的努力。
从 Opera 的 My-Flow 到 RCE 缺陷
Opera 的 My Flow 功能因其在桌面和移动设备之间的无缝笔记和文件共享而脱颖而出,所有这些都可以通过 Opera 浏览器完成。只需使用 Opera 的移动应用程序扫描二维码,您就会看到一个类似聊天的界面,用于交换消息和文件。
然而,从网络安全的角度来看,有一个方面值得关注。类似聊天的界面为任何带有附加文件的消息添加了“OPEN”链接,允许用户立即从 Web 界面执行文件。这表明网页上下文可以以某种方式与系统 API 交互,并在浏览器通常的范围之外从文件系统执行文件,没有沙盒,没有限制。
相关教程
linux高级usb安全开发与源码分析视频
linux程序设计与安全开发
-
恶意软件开发
-
-
-
windows网络安全防火墙与虚拟网卡(更新完成)
-
-
windows文件过滤(更新完成)
-
-
USB过滤(更新完成)
-
-
游戏安全(更新中)
-
-
ios逆向
-
-
windbg
-
-
还有很多免费教程(限学员)
-
-
-
更多详细内容添加作者微信
-
-
此功能虽然方便,但揭示了高潜在安全风险,因此我们的团队需要进一步调查。在我们的漏洞研究中,我们识别了如上所述的高风险向量,并彻底检查了所涉及的架构、开发和安全协议,旨在查明可能被利用的安全漏洞或逻辑错误——事实上,我们发现了一个重大漏洞。
隐藏的内置扩展
与当今许多流行的浏览器一样,Opera 建立在 Chromium 开源项目之上。它与 Chromium 共享其大部分核心代码、功能和设计。为了让自己与众不同并提供独特的功能,Opera 利用了 Chromium 的内置自定义选项,其中之一包括内置浏览器扩展的概念。
与您从浏览器商店安装的扩展类似,这些内置扩展程序增强了功能并添加了新功能。但是,一个关键的区别是内置扩展预安装在浏览器中,无法禁用或控制,并且可以拥有更广泛的功能和权限。
对于好奇的人来说,可以通过浏览器的开发工具一睹这些扩展,您可以在其中检查浏览器的内部工作原理 - 只需浏览并选择“扩展”:opera://inspect
特殊的 My Flow 功能是通过负责所有内部工作的扩展来实现的。Opera Touch Background
与任何其他扩展名一样,它引入了一个声明所有权限和功能的清单文件。在其中,我们应该特别注意以下声明:externally_connectable
"externally_connectable": {
"matches": [
"https://*.flow.opera.com/*",
"https://*.flow.op-test.net/*"
]
}
以上意味着只有声明的域下的 Web 资源才能与此扩展进行通信。这是通过 API 完成的,使网页能够访问该强大扩展中所有声明的处理程序。chrome.runtime.connect
检查扩展代码本身的侦听器会发现 My Flow 可以访问的一些特殊功能:
port.onMessage.addListener(data => {
switch (data.type) {
case 'GET_PAIRING_TOKEN':
wrapResponse(this.getPairingToken(data.value), data);
break;
case 'GET_DEVICES':
wrapResponse(this.getConnectedDevices(true), data);
break;
...
case 'OPEN_FILE':
wrapResponse(this.openFile(data.localFileName), data);
break;
case 'SEND_FILE':
wrapResponse(
this.sendFile(
data.name, data.content, data.file_type, data.preview,
data.messageId, data),
data);
break;
case 'DOWNLOAD_FILE':
wrapResponse(
this.downloadFile(
data.url, data.name, data.iv, data.messageId, data),
data);
break;
...
}
});
更深入地研究代码,我们看到它最终会访问浏览器核心对象下的本机私有 API:
在本地操作系统上的特定目标中创建文件也是如此。OPEN_FILE
opr.operaTouchPrivate.openFile(String filename).
DOWNLOAD_FILE
~/Downloads/MyFlow/
想想可能性——如果我们找到一种方法来调用这些处理程序,我们最终可以下载任何类型的有效负载并在我们的目标系统上执行它,而无需用户干预。这是一个强大的攻击媒介,具有巨大的恶意潜力!
为此,我们首先需要找到一种方法,从 下声明的域的上下文中运行我们自己的受控代码。opera.com
利用 Opera 控制的域权限
好的,所以只有 Opera 控制的域下的资源才能访问我们在这里定位的 or 处理程序。这确实是一项重要的安全措施。DOWNLOAD_FILE
OPEN_FILE
我们首先想到的是 XSS(跨站点脚本)——通过操纵可能触发代码漏洞的不同输入(如 URI 参数或 POST 数据)将任意 javascript 代码注入从相关域加载的网页。如果我们发现这样的东西,我们只需要制作相关的 URL 并让受害者点击它,让它在 opera 域下运行我们自己制作的代码。事实上,类似的流程在 2 年多前就已经被发现并披露给 Opera。因此,我们必须假设该页面现在编码良好并且不受此类漏洞的影响。
通过扩展操作注入代码
另一种更直接的注入代码方法是使用扩展。想象一下,一个具有通用权限的普通扩展程序,就像数百万用户每天安装的任何其他广告拦截器和类似工具一样。安装在浏览器上后,该扩展可以将多种方法中的代码注入到目标 URL 中——在本例中,从 .flow.opera.com
第一个要尝试的选项是扩展 API 调用,它将脚本注入并执行到主网页上下文中。由于 Opera 直接在其浏览器代码中引入的特定安全策略,因此在此域中可以防止这种情况。这类似于 Google 的 Chrome 阻止扩展程序在 Chrome 商店页面上执行代码。到目前为止——干得好,Opera。chrome.tabs.executeScript
另一种选择是我们的目标域上允许的 API。借助 AdBlocker 扩展程序常用的这些权限,可以更改页面对特定资源发出的请求,并让它获取不同的资源。在我们的例子中,页面从 请求一个 javascript 文件,因此我们可以切换它以使用简单的规则获取我们自己构建的文件。WebRequest/DeclerativeNetRequest
flow.opera.com
/ext/v1/scripts.js
好吧,这一次我们以 CSP 的形式遇到了下一个障碍:
CSP(内容安全策略)是一种 Web 安全标准,用于通过指定受信任的内容源来防止 XSS、点击劫持和其他代码注入攻击。在这种情况下,我们的脚本不是由批准的来源提供的,因此无法执行!这可以在原始 Opera 控制的 Web 应用程序页面上声明此策略的 meta 标记中看到:
<meta http-equiv="Content-Security-Policy" content="script-src 'self' https://flow-dev.operacdn.com https://flow.operacdn.com">
除此之外,脚本标签本身还包含 SRI(子资源完整性)形式的额外安全级别:
<script src="https://flow.operacdn.com/ext/v1/scripts-1673951285900.js" defer="" integrity="sha256-0vAferkk3jK3H8s/xAEmiM1WNl6rUWIr+bEExaTCcAA=" crossorigin="anonymous"></script>
上述属性确保加载的脚本具有声明的哈希值。除非我们碰巧在地下室里有一台量子计算机,否则没有办法绕过这个检查......
因此,即使我们设法更改了脚本内容,由于哈希值不同,它也无法在浏览器端加载和执行。Touché Opera!integrity
以令人惊讶的方式克服 CSP/SRI
好吧,一定还有另一种方法......
该系列中的域被用作 Opera 的多个产品、不同版本,甚至可能是 beta/dev 版本的生产应用程序。这些会给我们带来更多的利用机会吗?*.flow.opera.com
使用 urlscan.io 快速搜索此域系列下的历史扫描,得到了有趣的结果!urlscan.io 是一种安全工具,它通过扫描和检查网页来分析和提供有关 URL 内容和安全性的详细报告。因此,它还让我们瞥见了每个域的使用历史。在这种情况下,一些被遗忘已久的随机 HTML 页面位于这些域下,即使在几年后仍然可用!
在找到的那些中,我们看到了同一个 My Flow 登录页面的许多不同版本——包括这个特定的 2+ 岁版本:
该页面本身看起来与当前生产中的页面完全相同,但更改隐藏在引擎盖下:它不仅缺少 CSP 元标记,而且还包含一个脚本标签,该标签调用 javascript 文件,而无需任何完整性检查。没有 CSP,没有 SRI——看起来好得令人难以置信:
<head>
<!-- disable Service Worker <link rel="manifest" href="manifest.json"> -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content=".....">
<!-- NO CSP tag! -->
<link rel="icon" href="https://flow.operacdn.com/ext/v1/img/....">
<title>My Flow</title>
<link rel="stylesheet" href="https://flow.operacdn.com/ext/v1/....">
</head>
..
..
<!-- NO SRI attribute! -->
<script src="https://flow.operacdn.com/ext/v1/scripts-1633701575733.js" defer=""></script>
这正是攻击者所需要的——一个不安全的、被遗忘的、容易受到代码注入影响的资产,最重要的是——可以访问(非常)高权限的本机浏览器 API!
模拟“我的流”发送恶意负载
长话短说,我们现在可以创建一个简单的扩展概念证明,通过一些简单的步骤,将文件下载到受害者的计算机上并执行它。
这里只缺少一个构建块,即有效载荷本身。我们如何将文件发送到受感染的浏览器?好吧,这一次是纯粹的倒车和自动化。我们意识到浏览器本身(例如我们的扩展代码)可以模拟 My Flow 应用程序的相同活动,因为它们都使用相同的端点。flow.opera.com
首先,该扩展通过调用一些虚假的移动设备详细信息以及将用于加密文件有效负载的公钥来创建一个新的设备实例。作为回报,我们得到一个设备 ID 和一个令牌。接下来,我们使用处理程序向浏览器请求配对令牌。这将返回手机上的应用程序扫描的 QR 码值,以将其与浏览器配对。flow.opera.com/v1/devices
GET_PAIRING_TOKEN
现在我们将上述数据发送给 https://flow.opera.com/v1/connect-devices,以连接假设备并与我们的浏览器配对。
下一个明显的步骤是模拟从假移动设备到浏览器的文件传输,启动其下载,然后打开文件。Opera 对我们在设备之间发送的文件使用加密(因为这些文件存储在他们的服务器上以允许此活动),因此我们应该首先使用之前交换的相关密钥来加密我们的恶意负载。
即便如此,我们还是意识到了更好的方法。浏览器用于将文件发送到移动设备的处理程序有一个有趣的副作用 - 它将已发送文件的副本保存在MyFlow也将文件下载到的同一文件夹下。此处理程序还可以以 blob 的形式获取文件内容——因此,我们刚刚找到了另一种快速方法,可以直接从我们的扩展到主机文件系统生成任何恶意文件!SEND_FILE
现在我们的文件在系统上的相关文件夹中,我们可以触发调用,我们完成了。 该文件是从受感染浏览器操作系统的本地存储中执行的。OPEN_FILE
最后一个问题——从零到一键
现在,我们遇到了另一个最后一个障碍,即调用的权限块。似乎对此类操作的调用必须来自特定上下文,因为我们收到此错误:FILE_OPEN
在探索 My Flow API 时,我们观察到触发操作需要点击事件,事实上,这种方法是成功的。但是,这会将攻击动态从零点击转变为一键式方案。虽然一键攻击的威力不如零点击,但设计起来却非常简单。OPEN_FILE
我们只需要用户点击屏幕上的任意位置。但是,嘿,我们已经让用户安装了一个扩展程序(伪装成一个特殊的广告拦截器或类似的诱惑),并且安装了任何新的扩展程序,都会有我们都习惯的“感谢您安装”页面:
我们已经向这个新选项卡注入了代码,该代码滥用了域中被遗忘的资产。有了它,我们可以快速注入一些简单的代码来动态污损此页面,使其类似于简单的感谢页面——只需提示用户单击任意位置即可开始。这是一种简单而有效的方法。flow.opera.com
全范围漏洞利用扩展 POC
为了演示完整的概念验证 (POC) 攻击流程,让我们考虑攻击者如何利用 Opera 中这个新发现的漏洞,从而可能在全球众多用户的计算机上安装恶意负载。
攻击始于浏览器扩展程序,狡猾地伪装成 AdBlocker。这种伪装不仅吸引了广泛的日常安装,而且还授予了必要的利用权限——特别是 .此权限允许我们将原始脚本请求替换为有效负载,将其伪装在执行标准广告拦截功能的众多其他规则中。DeclerativeNetRequest
用户安装此扩展后,处理程序会立即在新选项卡中打开域中的易受攻击页面。此操作将启动漏洞利用的恶意阶段:OnInstalled
flow.opera.com
然后,我们精心制作的 JavaScript 代码被注入到此页面中,巧妙地改变了它的外观,并实现了与 Opera Touch 扩展的交互。这种交互旨在模拟移动设备与浏览器配对、传输恶意文件并执行它,在不到一秒的时间内完成攻击流程。该漏洞可以在一秒钟内在目标操作系统(无论是 Windows 还是 MacOS)上执行文件。这种快速执行突显了该漏洞被恶意使用的惊人潜力。
披露和与 Opera 合作
发现此漏洞后,我们立即联系了 Opera 的团队,全面披露了该问题并分享了我们的所有发现。当时,没有证据表明在野外积极利用了这个漏洞,但我们不能确定。因此,我们的首要任务是充分通知Opera,并以任何可能的方式协助纠正该问题。
Opera 工程团队的反应迅速而有效。在我们披露后的短短五天内,他们通过从服务器中删除有问题和不安全的资产来实施修复的最关键部分。
补救措施和最终想法
虽然目前 Opera 的生产服务器上没有已知的易受攻击资产,但由于人为错误或易受 XSS 影响的新代码更新,此类问题在未来再次出现的可能性仍然存在。这凸显了 Opera 以及 Chromium 基础设施需要进一步的内部设计更改。例如,通常禁用专用生产域的第三方扩展权限 - 就像在 Chrome 的网上商店中完成一样。
值得一提的是,Opera反应迅速,并在整个过程中进行了高效的合作。以下是Opera的官方声明:
作为我们与外部安全研究人员持续合作的一部分,Guardio Labs 团队于 2023 年 11 月向我们发出了此漏洞的警报。根据他们的发现,我们的团队与 Guardio Labs 密切合作,并迅速采取行动解决该漏洞,并在短短几天内在服务器端实施修复。具体来说,我们在 11 月 17 日收到警报,修复程序在 11 月 22 日就位。
我们当前的结构使用 HTML 标准,并且是不会破坏关键功能的最安全选项。在 Guardio 提醒我们注意此漏洞后,我们删除了这些问题的原因,并确保将来不会出现类似的问题。
我们要感谢 Guardio Labs 在发现并立即提醒我们注意此漏洞方面所做的工作。此次合作展示了我们如何与世界各地的安全专家和研究人员合作,以补充我们在维护和提高产品安全性方面所做的努力,并确保我们的用户拥有安全的在线体验。
这项研究揭示了现代浏览器中存在的漏洞,强调了随着浏览器变得更加丰富和复杂而出现的众多攻击媒介。它特别强调了尽管在沙盒环境中运行,但扩展仍然可以成为黑客的强大工具。这些扩展可以很容易地传播以窃取信息,如图所示,甚至可以突破浏览器本身的边界。
这凸显了平衡新功能与维护强大安全协议的必要性的持续挑战。在Guardio Labs,我们的研究团队仍然致力于这项工作。与更广泛的网络安全社区一起,我们致力于主动识别此类威胁,努力领先于恶意行为者一步。
关于 POC 的注意事项 —为了安全起见,我们选择不发布漏洞的概念验证 (POC) 代码。我们的决定源于对现有架构仍处于被利用的高风险的担忧中。我们旨在防止恶意方的潜在滥用,特别是如果产品的未来更新无意中重新引入了跨站点脚本 (XSS) 或扩展滥用漏洞。
原文始发于微信公众号(安全狗的自我修养):在 Opera 浏览器中发现的0day RCE 漏洞
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论