现代炼金术:将XSS转化为RCE
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的Content模块,但它不是浏览器。由于它促进了复杂桌面应用程序的构建,Electron赋予了开发者很大的权力。事实上,得益于与Node.js的集成,JavaScript可以访问操作系统原语,以充分利用本地桌面机制。
众所周知,在启用节点集成的情况下渲染不可信的远程/本地内容是危险的。因此,Electron提供了两种机制来“沙盒化”不可信资源:
BrowserWindow
|
|
WebView
|
|
在上述示例中,nodeIntegration标志设置为false。尽管在渲染器进程中运行着Node.js引擎,页面中运行的JavaScript将无法访问全局引用。
寻找nodeIntegration绕过
现在应该清楚为什么nodeIntegration是框架的一个关键安全相关设置。此机制中的漏洞可能导致仅通过渲染不可信网页就完全危害主机。作为现代炼金术士,我们利用这类缺陷将传统XSS转化为RCE。由于所有Electron应用程序都与框架代码捆绑在一起,在整个生态系统中修复这些问题也很复杂。
在我们的研究中,我们广泛分析了所有项目代码变更,以发现先前发现的绕过(我们在v1.6.1之前统计了6个),目的是研究Electron的设计和弱点。凭借这些知识,我们开始了狩猎。
通过研究官方文档,我们很快识别出与标准浏览器的显著偏差,这是由于Electron的“ glorified” JavaScript API造成的。
当创建新窗口时,Electron返回一个BrowserWindowProxy实例。这个类可用于操纵子浏览器窗口,从而颠覆同源策略(SOP)。
SOP绕过 #1
|
|
SOP绕过 #2
|
|
SOP绕过 #2使用的eval机制可以通过以下图表解释:
[图表描述:展示SOP绕过 #2的eval机制]
额外的源代码审查揭示了特权URL的存在(类似于浏览器的特权区域)。结合设计上的SOP绕过和lib/renderer/init.js中定义的特定特权URL,我们意识到可以覆盖nodeIntegration设置。
以下是一个简单而可靠的证明概念,展示了影响所有Electron 1.6.7之前版本的nodeIntegration绕过:
|
|
2017年5月10日,我们通过电子邮件向维护者报告了此问题。几小时内,我们收到回复,称他们已经在修复此问题,因为特权chrome-devtools://在我们报告前几天的一次内部安全活动中被发现。事实上,虽然当时官方网站上的最新版本是1.6.7,但修复特权URL的git提交日期是2017年4月24日。
该问题在1.6.8版本中修复(大约在5月15日正式发布)。所有先前版本的Electron以及因此所有基于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)