CVE-2020-3947:VMware DHCP组件UAF漏洞分析

阅读量561929

|评论1

|

发布时间 : 2020-04-07 14:30:06

x
译文声明

本文是翻译文章,文章原作者 zerodayinitiative,文章来源:zerodayinitiative.com

原文地址:https://www.zerodayinitiative.com/blog/2020/4/1/cve-2020-3947-use-after-free-vulnerability-in-the-vmware-workstation-dhcp-component

译文仅供参考,具体内容表达以及含义原文为准。

 

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消息包括DHCPDISCOVERDHCPOFFERDHCPRELEASE等,所有DHCP消息开头都为如下通用头结构:

图1. DHCP头结构

DHCP消息的中的Options字段中包含一系列option字段,option字段的结构如下:

图2. option字段结构

optionCode字段用来定义选项类型。DHCP消息类型以及客户端标识符选项对应的optionCode值分别为0x350x3d

DHCP消息中必须包含1个DHCP消息类型选项。对于DHCP消息类型选项,对应的optionLength字段值为1optionData字段对应具体的消息类型,值为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结构

该漏洞主要涉及到uiduid_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年,让我们拭目以待。

本文翻译自zerodayinitiative.com 原文链接。如若转载请注明出处。
分享到:微信
+10赞
收藏
興趣使然的小胃
分享到:微信

发表评论

内容需知
合作单位
  • 安全客
  • 安全客
Copyright © 北京奇虎科技有限公司 三六零数字安全科技集团有限公司 安全客 All Rights Reserved 京ICP备08010314号-66