0x00 前言
自从Pwn2Own在2016年引入虚拟化类别以来,从客户机到宿主机的逃逸一直都是比赛的亮点,今年也不例外。ZDI计划中也包含客户机到宿主机的逃逸漏洞。实际上在今年比赛开始前一周,VMware就发布了针对这类漏洞的一个补丁。在本文中,我们将深入分析CVE-2020-3947,这个漏洞于去年12月由一名匿名研究人员提交至ZDI计划(ZDI-20-298)。该漏洞影响VMware Workstation的DHCP服务器组件,可能允许攻击者实现从客户机OS到宿主机OS的逃逸,在宿主机OS上执行代码。
0x01 DHCP
Dynamic Host Configuration Protocol(DHCP,动态主机配置协议)是通过DHCP客户端域服务器之间交换DHCP消息来动态分配和管理IP地址的一种协议。DHCP消息包括DHCPDISCOVER
、DHCPOFFER
、DHCPRELEASE
等,所有DHCP消息开头都为如下通用头结构:
图1. DHCP头结构
DHCP消息的中的Options
字段中包含一系列option
字段,option
字段的结构如下:
图2. option
字段结构
optionCode
字段用来定义选项类型。DHCP消息类型以及客户端标识符选项对应的optionCode
值分别为0x35
及0x3d
。
DHCP消息中必须包含1个DHCP消息类型选项。对于DHCP消息类型选项,对应的optionLength
字段值为1
。optionData
字段对应具体的消息类型,值为1
代表DHCPDISCOVER
消息,值为7
代表DHCPRELEASE
消息。对于该漏洞,有两类消息类型非常关键:客户端广播DHCPDISCOVER
消息来获取IP地址,发送DHCPRELEASE
消息来释放IP地址资源。
0x02 漏洞分析
在VMWare Workstation中,vmnetdhcp.exe
模块用来向客户机提供DHCP服务器服务,该启动项会被注册为Windows的服务。当客户端向存在漏洞的DHCP服务器反复发送DHCPDISCOVER
消息及DHCPRELEASE
消息时,就会触发漏洞。
在处理DHCPRELEASE
消息的过程中,DHCP服务器会调用vmnetdhcp! supersede_lease (vmnetdhcp+0x3160)
。supersede_lease
函数随后会将数据从一个lease
(租约)结构拷贝到另一个结构。lease
结构中包含一些信息,如分配的客户端IP地址、客户端硬件地址、租约时间、租约状态等。完整的lease
结构如下所示:
图3. lease
结构
该漏洞主要涉及到uid
及uid_len
字段。uid
字段指向的是一个缓冲区,其中包含来自客户端标识符选项optionData
字段中的字符串数据。uid_len
字段表示该缓冲区的大小。
supersede_lease
首先检查源lease
和目的lease
结构中相应uid
字段指向的字符串数据是否一致,如果两个字符串匹配,该函数就会释放源lease
结构中uid
字段指向的缓冲区。随后,supersede_lease
会调用write_lease (vmnetdhcp+016e0)
,将目的lease
结构以参数形式传入,以便将租约信息写入内部表中。
图4. 比较uid
字段
图5. 释放uid
字段
当服务端重复收到DHCPDISCOVER
消息和DHCPRELEASE
消息时,源和目的lease
结构中对应的uid
字段实际上指向的是同一个内存位置,而supersede_lease
函数并没有检查这种情况。因此,当函数释放源lease
结构uid
字段指向的内存时,目的lease
结构的uid
指针就会变成无效指针。最后,当write_lease
访问目的lease
结构uid
字段时,就会出现UAF(释放后重用)问题。
图6. 触发漏洞
0x03 补丁分析
VMware通过VMSA-2020-004修复了这个bug以及2个危害等级较低的漏洞。修复CVE-2020-3947的补丁中主要修改了1个参数:supersede_lease
。我们可以对比15.5.1.50853
版以及15.5.2.54704
版的VMnetDHCP.exe
模块中supersede_lease
函数,如下所示:
图7. BinDiff补丁比较
在打上补丁的supersede_lease
中,当完成源及目的lease
结构相应uid
字段指向的字符串数据后,该函数还会执行一项检查步骤,判断对应的uid
字段是否实际上引用的同一个缓冲区。如果满足该条件,函数就不会执行free
操作。
由于官方没有列出其他解决办法,因此为了确保不受该漏洞影响,大家应该安装相应补丁。
尽管UAF漏洞是非常知名的一类问题,但在现代软件中依然普遍存在。2019年我们公布的安全公告中,实际上有15%都属于UAF漏洞。这种情况是否会延续到2020年,让我们拭目以待。
发表评论
您还未登录,请先登录。
登录