CVE-2020-3947: VMWARE DHCP组件UAF漏洞分析
2020-04-21 18:13:40 Author: www.secpulse.com(查看原文) 阅读量:439 收藏

本文分析2019年12月匿名研究人员在ZDI提交的安全漏洞——CVE-2020-3947。该漏洞影响VMware Workstation的DHCP服务器组件,攻击者利用该漏洞可以从guest OS进行提权,并且可以在主机操作系统上执行代码。

DHCP协议用于DHCP客户端和服务器交换DHCP消息来动态分配和管理IP 地址。DHCP消息包括DHCPDISCOVER, DHCPOFFER, DHCPRELEASE等。所有的DHCP消息都具有下面的header结构:

image.png

图 1 - DHCP Header结构

DHCP消息的Options域中含有一些option序列,option域结构如下所示:

image.png

图 2 – Option域结构

optionCode 域定义了option的类型。optionCode的值如果是0x350x3d就分别表示 DHCP 消息类型和客户端识别符选项。

DHCP消息比如包含一个DHCP 消息类型选项。对DHCP 消息类型选项, optionLength域的值是1optionData域表示消息类型。如果值为1表示DHCPDISCOVER消息,如果值是7就表示DHCPRELEASE类型的消息。对该漏洞来说,有2个消息类型非常重要。DHCPDISCOVER是客户端获取IP地址的广播,客户端会发送DHCPRELEASE来释放IP地址。

在VMWare Workstation 中,vmnetdhcp.exe模块提供DHCP服务器访问给客户端机器。启动记录是以Windows 服务的形式安装的。当发送DHCPDISCOVER 消息后重复发送DHCPRELEASE 消息给有漏洞的DHCP服务器时,漏洞条件就被触发了。

在处理DHCPRELEASE消息过程中,DHCP服务器会调用vmnetdhcp! supersede_lease(vmnetdhcp+0x3160)。supersede_lease函数会从一个租约(lease)结构复制数据到另一个结构。Lease结构中含有分配的客户端 IP 地址、客户端硬件地址、 租约期、租约状态等信息。完整lease结构如下所示:

image.png

图 3 – Lease结构

对该漏洞来说,uiduid_len域非常重要。Uid域指向含有来自客户端识别符选项的optionData域的字符串数据的缓存。uid_len域表示缓存的大小。

supersede_lease首先检查源和目的租约的uid域指向的字符串数据是否是相等的。如果2个字符串匹配,函数就会释放源租约的uid域指向的缓存。然后,supersede_lease会调用write_lease (vmnetdhcp+016e0),将目的租约作为参数传递来讲租约写入内部表中。

image.png

图 4 – 比较uid

image.png

图 5 – 释放uid

当服务器重复接收到DHCPDISCOVERDHCPRELEASE消息后,源和目的租约结构的uid 域就会指向相同的内存位置。supersede_lease函数并不会指向该条件。当释放源租约的uid域指向的内存后,指向目的租约的uid指针就会成为挂起指针。最后,当write_lease访问目的租约的uid域时,UAF条件就产生了。

image.png

图 6 – 漏洞触发

VMware已就该漏洞发布了补丁。补丁中通过对函数supersede_lease进行修改来修复漏洞。VMnetDHCP.exev15.5.1.50853和v15.5.2.54704版本的supersede_lease对比如下所示:

image.png

图 7 – BinDiff补丁比较

在修复的supersede_lease补丁版本中,在执行源和目的租约的uid域字符串比较后,会执行一个新的检查来查看uid 域是否引用了相同的缓存。如果是,函数就会跳过对释放的调用。

研究人员建议用户尽快更新安全补丁。

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

本文作者:ang010ela

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/129006.html


文章来源: https://www.secpulse.com/archives/129006.html
如有侵权请联系:admin#unsafe.sh