本文首发于阿里先知安全社区:Electron < v1.8.2-beta.4 远程命令执行漏洞—【CVE-2018-1000006】
Electron
Electron是基于Chromium 和Node.js,并使用HTML、JS、CSS来构建应用的框架。项目地址:https://github.com/electron/electron 。在1月22日,官方发布了对漏洞的通告
环境搭建
从上述通告可知,该漏洞有两个要点:
- 基于electron构建的app登记了协议,即可以使用该协议直接打开应用程序。
- 影响win平台
可以直接从CHYbeta/CVE-2018-1000006-DEMO获取环境,以下部分即可忽略。
新建一个文件夹比如test,里面新建三个文件main.js,index.html,package.json:
main.js:
index.html:
package.json:
包成exe应用,生成有漏洞的版本应用,这里我选择electron版本为1.7.8
复现与分析
本地写一个html,其中协议的名称要与之前的设置对上,poc.html:
当点击一个链接时,会触发cmd,并弹出计算器:
在electron的源码中,atom\browser\browser_win.cc的第212行定义了SetAsDefaultProtocolClient方法:
经过上述的注册表登记,通过查看注册表编辑器,可以发现多了一项:
|
|
在微软官方文档中,在Launching the Handler
一节中提到了在协议登记后如何启动应用:
所以当我们点击payload时,注册表中的%1
被替换为我们的payload,双引号被成功闭合:
从而传递了第三个参数--gpu-launcher=cmd.exe /c start calc
造成命令执行。
对参数传递有疑的可以用下面代码测试:
自己手动注册协议,参数解析情况如图:
第三个参数--gpu-launcher=cmd.exe /c start calc
会传递给Chromium,在List of Chromium Command Line Switches中总结了Chromium的命令行参数:
所以其实换其他参数也是能命令执行成功的,比如:
漏洞修复
打包生成打上补丁的版本1.8.2-beta.4:
再点击poc即可发现无法触发计算器。
这个漏洞仅影响win平台,究其根源在于windows用了双引号来传参,在微软官方文档中提到:
好像就这个洞而言,第二条好像就被轻易饶过了。
Electron官方在 commit-c49cb29ddf3368daf279bd60c007f9c015bc834c修复该漏洞,主要是对参数的接受以及子进程的运行做了检查。
首先增加了对黑名单的验证,新增加了 app/command_line_args.cc,其中第40行增加了黑名单列表:
由CheckCommandLineArguments进行验证:
该验证函数在atom/app/atom_main.cc的第132行调用
另外还增加了对子进程的验证,在atom/browser/atom_browser_client.cc的第244行:
MakeAbsoluteFilePath()是chromium定义的函数,这段代码用于对于启动进程的路径检查,防止未知应用的启动。
实际上,对黑名单的修补是不完善的,可以直接绕过,但后面对于路径的验证却难以绕过,因为路径验证的失败而直接导致程序崩溃。
其他
以上是我分析的一些想法,若有错误烦请各位师傅指出,谢谢各位师傅。