这是我们评选的2018年五大漏洞的第二个案例,这些评选出来的bug都具有一些独特的元素,使得其与今年发布的大约1400条其他报告不同。这篇博客实际上是详细描述了Electron框架中的多个bug,这些bug最终都收到了相同的CVE编号。
2017年12月初,我们从长期合作伙伴rgod那里收到了一组存在于谷歌Web Designer (ZDI-18-552)、Microsoft Teams (ZDI-18-426)、Skype (ZDI-18-308)和Slack (Slack -18-265) Windows桌面客户端中的与协议处理程序相关的远程代码执行漏洞。虽然它们是非常不同的产品,但它们有一个共同点——Electron.js。Electron是一个开发框架,允许开发人员使用Node.js编写跨平台的桌面客户端,是一种比较新的跨平台桌面应用程序框架。
编号为CVE-2018-1000006的这四个不同的漏洞都可以通过一个的Electron.js的补丁来修复。这个补丁是从一个下游产品中合并而来的,并不是rgod提交的相关部分。由于Electron从一个不相关的软件存储库中获取了补丁,rgod似乎还发现了一个bug冲突。
这个漏洞被选为年度前5大漏洞之一的原因是因为它的影响超出了前面提到的4个产品。在修复的版本发布后不久,Tomas Lažauninkas (@Wflki)发现Exodus钱包应用也受到了影响。除此之外,rgod还在利用了Chromium嵌入式框架(一个类似于Electron.js的平台)的应用程序中发现了相同的脆弱性模式,影响到了Spotify Music Player (ZDI-18-280)和Amazon Music Player (ZDI-18-215)的Windows客户端。
漏洞
基于Electron.js的的应用程序可以注册一个定制的协议处理程序,以促进深层链接的用户体验模式。这允许用户点击浏览器中自定义的应用程序URI(统一资源标识符),从而导致相应的应用程序启动并显示上下文相关的内容。攻击者可以使用任意命令行参数创建自定义URI,并注入嵌入式Chromium命令行选项来影响程序流或应用程序的启动条件。
谷歌浏览器的一些选项是十分危险的。例如,--gpu-launcher= 选项会根据提供的命令创建一个进程,很多公开可用的PoC代码就利用了这个命令行选项。在rgod给微软团队的提交报告(ZDI-18-426)中,他用以下PoC演示了这种技术:
然而,我们还没有看到任何公开的PoC使用rgod在其他提交文件中所演示的利用技术。在针对影响到谷歌Web Designer的ZDI-18-552的提交报告中,他利用了其他三个命令行选项来注入.hta HTML,将应用程序文件放入日志文件中。日志文件由攻击者控制,放置在受害者机器的启动目录中:
当受害者重新启动他们的电脑,suntzu.hta将作为启动程序执行,并且启动计算器应用。
在影响微软Skype的ZDI-18-308提交报告中,他展示了另一种利用技术:
这个--browser-subprocess-path=谷歌命令行选项允许用户为渲染程序和插件子进程指定可执行文件的路径。在这个PoC中,rgod演示了payload文件也可以存储在网络UNC路径上。这种利用技术可能会对某些端点检测和响应(EDR)软件造成不利影响。
在他提交给Slack (ZDI-18-265)的文件中,他指出Slack只要存在一个活动实例,就能够阻止exp的运行。但是添加--user-data-dir=选项可以指示Slack使用不同的用户配置文件,并导致Slack启动exp运行,即使受害者的计算机上运行着一个活动实例:
问题核心
Electron通过将一系列与Chromium相关的命令行选项列入黑名单来减少这些bug,虽然这确实使这些特定的bug不可利用,但是问题的根源仍然没有得到修补。当应用程序调用Electron.js API app.setAsDefaultProtocolClient()来为它的Windows客户端注册一个自定义的URI时,Electron.js会在Windows中创建一个新的注册表项。下面是Electron.js如何在未修复漏洞版本的Stack Windows客户端上注册了自定义协议:
根据微软的文档,这个注册会将slack.exe设置为定制slack:// URI模式的处理程序,整个URI将会替换“%1”字符串并且作为命令行选项传递给处理程序。Microsoft已经在文档中记录了简单字符串替换的潜在安全风险。
Electron.js的开发者不仅在默认情况下没有以安全的方式注册处理程序,他们也没有就微软文档中提出的潜在安全问题进行讨论。我们可以看到最新版的Electron.js中在默认情况下仍然以不安全的方式注册处理程序,并且只包含了一些可能“由非特权用户编写”的最简短的注释。
总结
Electron是一种很受欢迎的技术,它利用Chromium封装特定于平台的实现细节,使大量JavaScript开发人员能够快速编写跨平台桌面应用程序。单一技术在计算领域的普及可能会带来方便和效率,但同时,当发现一个关键缺陷时,它也有可能带来广泛的损害。与之前的其他框架一样,Electron需要构建和维护一种方法,以便在漏洞被发现时能快速解决安全问题。还应该在他们的文档中进行改进,以确保开发人员理解使用各种特性的安全性影响。随着其受欢迎程度持续增长,漏洞可能会产生很广泛的影响。
你可以关注我的Twitter@TrendyTofu,或者关注我们的团队以了解最新的漏洞利用技术和安全补丁。请继续关注将于明天发布的下一个年度五大漏洞相关博客。
没有评论