CVE-2017-4918:VMware Horizon的macOS客户端中的代码注入漏洞分析

本文我想讨论下VMware Horizon的macOS客户端(版本4.4.0,5164329)中的一个代码注入漏洞,其可以被用于获得本地root权限。好消息是这个问题已经在最新的版本中被修复了。

0x01 分析

在我的MAC上面了解“Open VMware View Client Services”SUID二进制后发现了它。

我认为它是在Horizon的远程USB服务内部使用的,并且只能在启动后输入管理员凭据后才能被利用。

为了进一步调查二进制,我使用了最新的Fireeye的应用程序Monitor.app。它是macOS上的进程监控工具(procmon)。

基于通过Monitor.app捕捉到所有行为,很明显“Open VMware View Client Services”是services.sh的封装。对于脚本文件SUID位被忽略可以理解。

在仔细浏览这个脚本之后,我确定了下面截图中的高亮部分是代码注入漏洞的启动点。尽管我不知道./vmware-usbarbitrator内部工作原理,但是我立马就注意到应该深入调查这个二进制。我(非管理员用户)能设置环境变量VMWARE_VIEW_USBARBITRATOR_LOG_OPTIONS,其在SUID执行脚本中使用。

在进一步浏览命令行选项,我很确定我能使用-kext标志加载自定义的内核扩展。

然而,有其他两个问题:

1. 内核扩展只在拥有root:wheel权限才能加载

2. 另外,KEXT必须有苹果的签名

本例的LPE我忽略了问题2。因此我禁用了SIP。

让我们关注于问题1.为了成功加载内核扩展,二进制必须拥有root:wheel权限。然而,对于一个正常用户,是不可能对任何本地文件设置这个文件系统权限。幸运的是,我已经花了大量时间来学习Tools On Air中的文件系统。因此我知道唯一的事情是我必须利用NFS。这是可能的,因为NFS允许服务器指定文件系统权限,即使是用户mount的。我所知道的任何其他的本地或者远程文件系统,都会以某些方式忽略文件的拥有权限。因此,下一步是使用NFS导出一个远程文件夹(在我的Kali Linux上)

使用Finder的“连接到服务器”来mount它。

创建一个简单的KEXT

并更新info.plist文件来满足需要(简单的添加字典“IOKitPersonalities”)

复制这个KEXT到NFS服务器上,它的权限能满足“root:wheel”的需求,最后,我们能启动真正的利用。

为了做到这个,简单的设置VMWARE_VIEW_USBARBITRATOR_LOG_OPTIONS环境变量到我们之前创建的KEXT,并运行“Open VMware View Client Services”。现在可以加载它了。

因此我们能在普通用户账户权限下的内核上下文中得到代码执行的能力。

0x02 建议的解决方案

过滤或清除环境变量VMWARE_VIEW_USBARBITRATOR_LOG_OPTIONS 和 VMWARE_VIEW_USBD_LOG_OPTIONS。

0x03 披露时间

2017-04-21:报告问题

2017-04-24:VMware开始调查

2017-06-06:修复

2017-06-08:更新Horizon版本4.5,及发布安全公告VMSA-2017-0011