虚拟化漏洞专题之寻找VMware Workstation渲染器中的漏洞
Posted 看雪学院
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了虚拟化漏洞专题之寻找VMware Workstation渲染器中的漏洞相关的知识,希望对你有一定的参考价值。
背景
一月中旬,ZDI宣布了2017年比赛的规则,其中包括了攻破VMware,完成虚拟机逃逸的队伍会获得相当高额的奖金。VMware已经不是一个新目标了。在2016年,VMware就被确定为攻击目标。
作为攻击目标,VMware已经经历过各种各样的攻击,攻击点很多。
有趣的是,早在2006-2009年间,就有针对D&D和C&P的漏洞而完成虚拟机逃逸了。然而在2015年Kostya Kortchinsky和lokihardt又在D&D和C&P中发现了类似的漏洞。从此,研究员们开始对这些代码更加深入的研究。
从我们旁观者的角度,这一现象是令人深思的。我们在想,VMware的漏洞一共有多少?其中又有哪些能被我们发现?
虽然一系列的漏洞被曝光,但是在2016年的Pwn2Own上,没有一支队伍能够成功完成虚拟机逃逸。虽然像VMware这样的传统桌面软件不是我们的研究领域。但我们还是对寻找VMware中的漏洞非常感兴趣。
我们决定面对这个挑战,看看挖掘VMware中的漏洞到底有多困难。我们定了一个计划,用一个月的业余时间来寻找漏洞。虽然我们没能在Pwn2Own前完成,但我们确实发现了一些高危漏洞,并且尝试通过这些漏洞找到VMware中可利用的攻击点。
攻击面
之前并不了解VMware的细节,我们开始不清楚实施攻击应该从何处着手。关注指令模拟的内部细节会有帮助么?有些CPU支持VT,又有多少指令是被模拟的?为了避免与他人撞洞,除了打印和像D&D或C&P的主机客户机交互外,还剩下什么呢?
下文是我们的研究成果,正如Pwn2Own规定的,所有的漏洞都要能被虚拟机里的普通用户所利用。
VMWare模块
在VMware的各种模块中,GUI是最不受关注的部分。VMware在主机和虚拟机端都有内核模块(至少有vmnet/VMCI),thnuclnt(负责虚拟打印),vmnet-dhcpd,vmnet-natd,vmnet-netifup,vmware-authdlaucher,vmnet-bridge,vmware-usbarbitrator,vmware-hostd,还有虚拟机端最重要的vmware-tools。
几乎所有的这些模块都是作为特权进程运行,这使得他们成为被研究者分析的对象。虚拟打印已经被攻击多次了。
vmnet-dhcpd吸引了我们的注意,因为他以root模式运行并且是从ISC-DHCPD演变而来。更令人感兴趣的是,vmware-dhcpd基于isc-dhcp2。我们开始把它作为攻击目标。
然而,当我们发现公开的漏洞后(CVE-2011-2749,CVE-2011-2748)我们就放弃了这一想法。VMware为了防止漏洞,已经在最新的isc-dhcp中修补了漏洞。
于是我们决定在QEMU和AFL对vmware-dhcpd的一些小补丁进行fuzz测试。一个月的fuzzing并没有显示出任何漏洞。vmware-hostd也是一个令人感兴趣的进程,它作为一个web服务器,用于虚拟机共享,而且可以从虚拟机内部访问到。然而,我们还是决定把精力投入研究VMware的核心组件。
vmware-vmx是最主要的虚拟机监管模块,在主机上作为root/系统进程运行,拥有一些令人感兴趣的特性。事实上,它有两个版本,vmware-vmx和vmware-vmx-debug。
如果VMware的设置中调试选项被启用,那么使用的就是后者。这一点很重要,因为当我们进行逆向工程时,从拥有很多调试信息的版本开始总会简单许多。或许这不是最适合的方法,但却很有效。后面我们会讲到。
RPC/RPCI
你可曾经想过VM和主机之间的文件拖放功能是如何实现的?RPC在其中发挥了重要的作用。VMware内部在0x5658端口上提供了一个接口作为“后门”。通过这个端口,虚拟机可以通过I/O指令来和主机进行通信。
通过寄存器传递一个VMware可识别的魔数,VMware会自动解析附加的参数。I/O指令通常都是特权指令,但这个“后门”接口是个例外。这种例外是很少的。当执行一个后门I/O指令时,VMware会进行一系列的判断,判断该I/O指令是否来自拥有特权的虚拟机。
在这个“后门”接口的上层,VMware使用了RPC服务在主机和客户机之间交换数据。在客户机端,vmware-toolsd执行“后门”命令的同时,使用了RPC服务。
这就是为什么之后在安装了vmware-toolsd的客户机上,你才能使用像拖放文件这样的功能。内核驱动和用户空间功能的结合利用实现了这一功能。
在最初的“后门”接口中只能通过寄存器来传递数据,面临大量数据的传输时,速度会变得很慢。为了解决这个问题,VMware引入了另一个端口(0x5659)来实现高带宽的“后门”。实际上这个端口是被RPC使用。
通过传递一个数据指针,vmware-vmx不用重复的调用IN指令,直接调用read/write API就可以完成数据的传输,Derek曾经就在这个功能里发现了一个非常有趣的漏洞。
RPC接口提供了以下的功能:
打开通道
发送命令长度
发送数据
接受回复的长度
接受数据
结束互动
关闭通道
你可能会想如何防止进程扰乱RPC的交互,建立一个通道时,VMware会生产两个cookie值,用它们来发送和接受数据。显然,这两个cookie是以安全的方式生成的。由于这两个cookie就是两个32位的无符号整数,不能用memcmp和其他方式来比较它们。
在上层,VMware还用RPC命令来处理DnD,CnP,Unity和其他的事件。有些命令只能在虚拟机特权用户下执行。在虚拟机端。vmware-tool或open-vm-tools提供了rpctool用来和API交互。保存和获取虚拟机信息的一个简单的例子如下:
rpctool 'info-set guestinfo.foobar baz'以上是关于虚拟化漏洞专题之寻找VMware Workstation渲染器中的漏洞的主要内容,如果未能解决你的问题,请参考以下文章