现代炼金术:将XSS转化为RCE
03 Aug 2017 - 发布者: Luca Carettoni
TL;DR
在2017年黑帽大会上,Doyensec联合创始人Luca Carettoni展示了关于Electron安全的新研究。在快速概述Electron的安全模型后,我们披露了可被利用来入侵任何基于Electron应用程序的设计弱点和实现错误。特别地,我们讨论了一种绕过方法,即使在存在框架级保护的情况下,渲染不可信内容(例如通过跨站脚本攻击)也能实现可靠的远程代码执行(RCE)。在本博客文章中,我们将深入探讨该漏洞(CVE-2017-12581)及其修复方案。
什么是Electron?
虽然您可能不熟悉这个名字,但您很可能已经在使用Electron,因为它运行在数百万台计算机上。Slack、Atom、Visual Studio Code、WordPress Desktop、Github Desktop、Basecamp3、Mattermost只是使用该框架构建的应用程序的几个例子。每当传统的Web应用程序被移植到桌面时,开发人员很可能使用了Electron。
理解nodeIntegration标志
虽然Electron基于Chromium的内容模块,但它不是浏览器。由于它促进了复杂桌面应用程序的构建,Electron赋予了开发者很大的权力。事实上,得益于与Node.js的集成,JavaScript可以访问操作系统原语,以充分利用本地桌面机制。
众所周知,在启用Node集成的情况下渲染不可信的远程/本地内容是危险的。因此,Electron提供了两种机制来“沙箱化”不可信资源:
BrowserWindow
|
|
WebView
|
|
在上述示例中,nodeIntegration标志设置为false。尽管在渲染器进程中运行着Node.js引擎,页面中运行的JavaScript将无法访问全局引用。
寻找nodeIntegration绕过方法
现在应该清楚为什么nodeIntegration是框架的一个关键安全相关设置了。此机制中的漏洞可能导致仅通过渲染不可信网页就完全入侵主机。作为现代炼金术士,我们利用这类缺陷将传统的XSS转化为RCE。由于所有Electron应用程序都捆绑了框架代码,在整个生态系统中修复这些问题也很复杂。
在我们的研究中,我们广泛分析了所有项目代码变更,以发现先前发现的绕过方法(我们在v1.6.1之前统计了6个),目的是研究Electron的设计和弱点。凭借这些知识,我们开始了狩猎。
通过研究官方文档,我们很快识别出由于Electron的“美化”JavaScript API而导致的标准浏览器的显著偏差。
当创建新窗口时,Electron返回一个BrowserWindowProxy实例。这个类可用于操纵子浏览器窗口,从而颠覆同源策略(SOP)。
SOP绕过 #1
|
|
SOP绕过 #2
|
|
SOP绕过 #2使用的eval机制可以通过以下图表解释:
[图表说明:展示了通过win.eval()方法在子窗口中执行代码的流程]
额外的源代码审查揭示了特权URL的存在(类似于浏览器的特权区域)。将设计上的SOP绕过与lib/renderer/init.js中定义的特定特权URL结合,我们意识到我们可以覆盖nodeIntegration设置。
以下是一个简单而可靠的证明概念,展示了影响所有1.6.7之前Electron版本的nodeIntegration绕过:
|
|
2017年5月10日,我们通过电子邮件向维护者报告了此问题。几小时内,我们收到了回复,称他们已经在修复这个问题,因为特权chrome-devtools:// URL是在我们报告前几天内部安全活动中发现的。事实上,虽然当时官方网站上的最新版本是1.6.7,但修复特权URL的git提交日期是2017年4月24日。
该问题在1.6.8版本中修复(大约在5月15日正式发布)。所有先前版本的Electron以及 consequently 所有基于Electron的应用程序都受到影响。Mitre为此问题分配了CVE-2017-12581。
缓解nodeIntegration绕过漏洞
-
保持应用程序与最新Electron框架版本同步。发布产品时,您也在分发由Electron、Chromium共享库和Node组成的捆绑包。影响这些组件的漏洞可能会影响应用程序的安全性。通过将Electron更新到最新版本,您可以确保关键漏洞(如nodeIntegration绕过)已被修补,无法被利用来滥用您的应用程序。
-
采用安全编码实践。应用程序的第一道防线是您自己的代码。常见的Web漏洞,如跨站脚本(XSS),在Electron上具有更高的安全影响,因此强烈建议采用安全的软件开发最佳实践并进行定期安全测试。
-
了解您的框架(及其限制)。现代浏览器实施的某些原则和安全机制在Electron中未强制执行(例如SOP强制执行)。采用深度防御机制来缓解这些缺陷。更多详情,请参考我们的Electronegativity:Electron安全研究演示和Electron安全清单白皮书。
-
使用最近的“沙箱”实验性功能。即使禁用了nodeIntegration,Electron的当前实现也不能完全缓解加载不可信资源引入的所有风险。因此,建议启用沙箱功能,该功能利用原生Chromium沙箱。沙箱化的渲染器没有运行Node.js环境(除了预加载脚本),渲染器只能通过IPC将任务委托给主进程来更改系统。虽然在撰写本文时仍不完美(存在已知的安全问题,沙箱不支持
标签等),但应启用此选项以提供额外的隔离。
其他相关文章:
- Streamlining Websocket Pentesting with wsrepl (18 Jul 2023)
- Diving Into Electron Web API Permissions (27 Sep 2022)
- ElectroNG, our premium SAST tool released! (06 Sep 2022)
- Electron APIs Misuse: An Attacker’s First Choice (16 Feb 2021)
- Signature Validation Bypass Leading to RCE In Electron-Updater (24 Feb 2020)
- Electron Security Workshop (03 Jul 2019)
- Electronegativity 1.3.0 released! (11 Jun 2019)
- Subverting Electron Apps via Insecure Preload (03 Apr 2019)
- Electronegativity is finally out! (24 Jan 2019)
- Instrumenting Electron Apps for Security Testing (19 Jul 2018)
- Electron Windows Protocol Handler MITM/RCE (bypass for CVE-2018-1000006 fix) (24 May 2018)