CVE2018-100006漏洞复现

14
Mar

CVE2018-100006漏洞复现

漏洞描述

什么是Electron?
Electron 是一款基于Chromium和Node.js ,使用HTML5、 Javascript 和 CSS构建跨平台桌面应用的开发框架。因为完美兼容 Node.js 包管理(npm)的大量功能和丰富的模块,并且相对于 native 降低了开发难度和迭代成本,因此受到了开发者的青睐,像Slack、Skype、网易云音乐、Github的Atom、Microsoft的VS Code均采用该框架开发。

2018年1月22日,Electron官方发布了对漏洞的安全公告

(https://electronjs.org/blog/protocol-handler-fix)

这是一个远程命令执行漏洞。
在受影响的应用注册了自定义 url 协议之后,攻击者可以利用这些伪协议,在浏览器等场景中远程通过恶意的 url 传递命令行参数执行任意命令,最终完全控制受害者的计算机.

由于其利用方式简单粗暴,执行效果理想,是一个危害很大的漏洞。由于 Electron 的流行,受影响的软件甚至包括 Atom 编辑器, GitHub 客户端, VSCode 编辑器, Slack 客户端,有道云音乐这样用户颇多的 Windows 桌面应用。


漏洞成因

漏洞要点:

1.基于构建的app登记了协议,即可以使用该协议直接打开应用程序。
2.影响win平台

原理浅析:

由官方的漏洞公告可知,该漏洞存在位置app.setAsDefaultProtocolClient()
在仓库中全局搜索
SetAsDefaultProtocolClient(electron/electron)
由于该漏洞仅影响Windows系统,则关注browser_win.cc#L212
该函数的主要的功能是实现注册表键值的注册。
通过查看注册表编辑器(运行regedit ),可以发现一项%1

运行PoC,点击构造好的超链接(payload),注册表中的%1则会替换成payload

Payload中的第一个双引号和“%1”前双引号闭合,Payload中的最后一个双引号和“%1”后双引号闭合,最终形成如下所示命令:

通过第3个参数带入Chromium实现命令执行:
--renderer-cmd-prefix=cmd.exe /c start calc


利用思路

  1. 程序开发时调用了存在漏洞的函数,实现用户自定义协议的注册,拿我这个来说注册了test协议,那当用户访问test协议下的资源时,就会启动该程序访问(test://xxx)
    app.setAsDefaultProtocolClient('test')

  2. 程序启动时会在注册表中注册键值(%1是占位符,用于接收用户输入的参数)
    "E:\elec_rce.exe" "%1"

  3. 执行PoC时,通过刚刚程序注册的test://自定义协议触发
    test://?" "--no-sandbox" "--renderer-cmd-prefix=cmd.exe /c start calc

  4. payload带入占位符%1,同时闭合双引号,通过后续的参数--renderer-cmd-prefix,传递至Chromium,实现命令执行


漏洞复现

样本1:

环境搭建:
Microsoft Windows10
Electron 1.7.8
https://github.com/CHYbeta/CVE-2018-1000006-DEMO
里面的文件有main.js、index.html、package.json

自己打包成exe应用,生成有漏洞的版本,以版本1.7.8为例:

本地写一个触发的html,其中的协议名称要与之前的设置一一对应

当你点击链接时,会触发这个RCE,实现命令执行,弹出计算器。

样本2:

环境搭建:
Microsoft Windows10
Electron 1.7.8
网易云音乐客户端2.0

由于我们知道网易云客户端用到的协议是orpheus://


影响范围

Electron < 1.8.2-beta.4、1.7.11、1.6.16 的版本


解决方案

1.升级至1.8.2-beta.4、1.7.11、1.6.16版本
官方补丁:
https://github.com/electron/electron/commit/c49cb29ddf3368daf279bd60c007f9c015bc834c
2.不升级的话,可以在调用app.setAsDefaultProtocolClient()函数时,增加--参数(代表命令行选项的结束,类似注释?),避免Chromium解析更多的选项

添加新评论