本文分析2019年12月匿名研究人员在ZDI提交的安全漏洞——CVE-2020-3947。该漏洞影响VMware Workstation的DHCP服务器组件,攻击者利用该漏洞可以从guest OS进行提权,并且可以在主机操作系统上执行代码。
DHCP协议用于DHCP客户端和服务器交换DHCP消息来动态分配和管理IP 地址。DHCP消息包括DHCPDISCOVER, DHCPOFFER, DHCPRELEASE
等。所有的DHCP消息都具有下面的header
结构:
图 1 - DHCP Header
结构
DHCP消息的Options
域中含有一些option序列,option域结构如下所示:
图 2 – Option域结构
optionCode
域定义了option
的类型。optionCode
的值如果是0x35
和0x3d
就分别表示 DHCP 消息类型和客户端识别符选项。
DHCP消息比如包含一个DHCP 消息类型选项。对DHCP 消息类型选项, optionLength
域的值是1
,optionData
域表示消息类型。如果值为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结构如下所示:
图 3 – Lease结构
对该漏洞来说,uid
和uid_len
域非常重要。Uid
域指向含有来自客户端识别符选项的optionData
域的字符串数据的缓存。uid_len
域表示缓存的大小。
supersede_lease
首先检查源和目的租约的uid
域指向的字符串数据是否是相等的。如果2个字符串匹配,函数就会释放源租约的uid域指向的缓存。然后,supersede_lease
会调用write_lease
(vmnetdhcp+016e0
),将目的租约作为参数传递来讲租约写入内部表中。
图 4 – 比较uid
域
图 5 – 释放uid
域
当服务器重复接收到DHCPDISCOVER
和DHCPRELEASE
消息后,源和目的租约结构的uid 域就会指向相同的内存位置。supersede_lease
函数并不会指向该条件。当释放源租约的uid域指向的内存后,指向目的租约的uid指针就会成为挂起指针。最后,当write_lease
访问目的租约的uid
域时,UAF条件就产生了。
图 6 – 漏洞触发
VMware已就该漏洞发布了补丁。补丁中通过对函数supersede_lease
进行修改来修复漏洞。VMnetDHCP.exe
v15.5.1.50853和v15.5.2.54704版本的supersede_lease
对比如下所示:
图 7 – BinDiff补丁比较
在修复的supersede_lease
补丁版本中,在执行源和目的租约的uid域字符串比较后,会执行一个新的检查来查看uid 域是否引用了相同的缓存。如果是,函数就会跳过对释放的调用。
研究人员建议用户尽快更新安全补丁。
本文作者:ang010ela
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/129006.html