Electron Windows协议处理器MITM/RCE(CVE-2018-1000006修复绕过)
2018年5月24日 - 作者:Luca Carettoni
在一次客户项目中,我们分析了近期Electron Windows协议处理器RCE漏洞(CVE-2018-1000006)的补丁,并发现了一个绕过方法。在特定情况下,此绕过可导致会话劫持和远程代码执行。漏洞触发仅需通过浏览器访问网页即可。设计运行于Windows且注册为默认协议处理器、未在注册表项中添加双破折号的Electron应用均受影响。
我们于2018年5月14日向Electron核心团队(通过security@electronjs.org)报告了此问题,并立即收到通知称他们已在开发补丁。Google的Nicolas Ruff几天前也报告了此问题。
CVE-2018-1000006
2018年1月22日,Electron发布了v1.7.11、v1.6.16和v1.8.2-beta4的补丁,修复了一个关键漏洞CVE-2018-1000006(奇怪的是没有花哨的名称),影响运行于Windows且注册自定义协议处理器的基于Electron的应用程序。
原始问题在许多博客文章中已有广泛讨论,可总结为:能够从远程网页使用自定义协议处理器(例如myapp://)来携带命令行参数,并插入Electron/Chromium/Node识别并在启动应用时执行的新开关。
|
|
有趣的是,2018年1月31日,Electron发布了v1.7.12、v1.6.17和v1.8.2-beta5。事实证明,初始补丁未考虑大写字符,导致先前补丁被绕过:
|
|
理解补丁
CVE-2018-1000006的补丁实现在electron/atom/app/command_line_args.cc中,包含一个验证机制,确保用户无法在URL(特定协议处理器)后包含Electron/Chromium/Node参数。请注意,某些本地执行的应用程序确实需要传递自定义参数的能力。
|
|
如常见情况,基于黑名单的验证容易出错和遗漏,尤其是在像Electron这样的复杂执行环境中:
- 补丁依赖于可用Chromium标志的静态黑名单。每次libchromiumcontent更新时,Electron团队必须记得更新command_line_args.cc文件,以确保黑名单与Chromium/v8的当前实现保持一致。
- 黑名单使用二分搜索实现。如果标志未正确排序,有效标志可能会被检查遗漏。
绕过和安全影响
我们开始寻找遗漏的标志,并注意到host-rules不在黑名单中。使用此标志,可以指定一组规则来重写libchromiumcontent发出的请求的域名。这立即成为一个颠覆进程的良好候选。
事实上,攻击者可以利用此问题覆盖主机定义,以执行完全透明的中间人攻击:
|
|
当用户在浏览器中访问包含前述代码的网页时,Skype应用将被启动,所有Chromium流量将转发到evil.doyensec.com而不是原始域。由于连接是到攻击者控制的主机,证书验证无济于事,如以下视频所示:
(您的浏览器不支持视频标签。)
我们分析了此漏洞对流行基于Electron的应用的影响,并开发了MITM和RCE攻击的工作概念证明。虽然直接影响是攻击者可以获取机密数据(例如OAuth令牌),但此问题也可被滥用以注入包含XSS -> RCE负载的恶意HTML响应。启用nodeIntegration时,这只需通过利用Node的API即可实现。当遇到通过nodeIntegration: false或sandbox的应用沙箱时,有必要将此与其他漏洞(例如nodeIntegration绕过或IPC滥用)链式利用。
请注意,仅可能拦截由Chromium生成的流量,而不是Node。因此,Electron的更新功能以及其他关键功能不受此漏洞影响。
未来
2018年5月16日,Electron发布了一个新更新,包含v2.0.1、v1.8.7和v1.7.15的改进版黑名单。团队正在积极开发更具弹性的解决方案以防止进一步绕过。考虑到API更改可能破坏现有应用,将此安全改进包含在主要版本中是合理的。
同时,建议Electron应用开发者在setAsDefaultProtocolClient中强制执行双破折号表示法:
|
|
或在Windows协议处理器注册表项中。
最后,我们要感谢整个Electron团队在转向默认安全框架方面的工作。Electron贡献者肩负着关闭Web原生桌面差距的非平凡使命。现代浏览器正在实施众多安全机制,以确保站点之间的隔离,促进Web安全保护,并防止不受信任的远程内容危害主机安全。在使用Electron时,事情变得更加复杂。
@ikkisoft @day6reak