2020年Pwn2Own中VMware虚拟机逃逸最新UAF漏洞分析(CVE-2020-3947)
2020-04-06 11:20:00 Author: www.4hou.com(查看原文) 阅读量:457 收藏

自2016年在Pwn2Own引入虚拟化软件以来,guest-to-host 虚拟机逃逸漏洞一直是比赛的亮点,今年的比赛也不例外。全年,其他guest-to-host 虚拟机逃逸漏洞也都通过ZDI计划进行。实际上,VMware 在今年比赛之前一周发布了针对此漏洞的补丁程序。在此文章中,我们研究了CVE-2020-3947,该漏洞由一位匿名研究人员于12月下旬提交给ZDI程序(ZDI-20-298)。该漏洞影响VMware Workstation的DHCP服务器组件,并且可能允许攻击者从guest操作系统上提升特权并在host操作系统上执行代码。

 https://www.vmware.com/security/advisories/VMSA-2020-0004.html
 
 https://www.zerodayinitiative.com/advisories/ZDI-20-298/

0x01 动态主机配置协议(DHCP)

动态主机配置协议(DHCP)用于通过在DHCP客户端和服务器之间交换DHCP消息来动态分配和管理IP地址。DHCP消息包括DHCPDISCOVER,DHCPOFFER,DHCPRELEASE和其他一些消息。

所有DCHP消息均以以下通用头结构开头:

图1-DHCP标头结构

该选项 DHCP消息的字段包含序列的选项字段。

选项字段的结构如下:

图2-选项字段结构

所述optionCode字段定义选项的类型。对于DHCP消息类型和客户端标识符选项,optionCode的值分别为0x35和0x3d 。

DHCP消息必须包含一个DHCP消息类型选项。对于DHCP消息类型选项,optionLength字段的值为1,而optionData字段指示消息类型。值1表示DHCPDISCOVER消息,而值7表示DHCPRELEASE消息。这是对该漏洞很重要的两种消息类型。客户端广播DHCPDISCOVER以获取IP地址,然后客户端发送DHCPRELEASE放弃IP地址。

0x02 漏洞分析

在VMWare中,vmnetdhcp.exe模块为guest计算机提供DHCP服务器服务,此启动项作为Windows服务安装。当反复向易受攻击的DHCP服务器发送DHCPDISCOVER消息和随后的DHCPRELEASE消息时,就会出现攻击情况。

在处理DHCPRELEASE消息期间,DHCP服务器调用vmnetdhcp! supersede_lease(vmnetdhcp+0x3160)。supersede_lease。然后,该函数将数据从一个结构复制到另一个结构。这个结构包含诸如已分配的客户端IP地址,客户端硬件地址,期限,状态等信息。

完整的结构如下:

图3-结构

对于此漏洞,uid和uid_len字段很重要。UID字段指向从包含字符串的数据的缓冲器optionData所述的客户端标识符的选项,所述uid_len*字段指示该缓冲区的大小。

supersede_lease首先检查由源和目标的各自uid字段指向的字符串数据是否相等。如果这两个字符串匹配,则该函数释放由源的uid字段指向的缓冲区。然后,supersede_lease调用write_lease(vmnetdhcp+016e0),并将目标租约作为参数传递,以写入内部表。

图4 –比较uid字段

图5-释放uid字段

在易受攻击的情况下,这意味着当服务器重复收到DHCPDISCOVER消息和DHCPRELEASE消息时,源结构和目标结构的各自uid字段实际上指向同一内存位置,该supersede_lease功能不检查这个条件。结果,当它释放源的uid字段指向的内存时,目标的uid指针将变为挂起指针。最终,当write_lease访问目标的uid字段时,将出现UAF漏洞条件。

图6-触发漏洞

0x03  漏洞补丁

VMware使用VMSA-2020-004修复了此漏洞以及两个严重性较轻的漏洞,CVE-2020-3947的补丁有一项更改:supersede_lease。

 https://www.vmware.com/security/advisories/VMSA-2020-0004.html

补丁比较supersede_lease在VMnetDHCP.exe版本15.5.1.50853与15.5.2.54704版本如下:

图7-BinDiff补丁比较

在supersede_lease的修补版本中,在执行源和目标的各个uid字段之间的字符串比较之后,它将执行新的检查,以查看各个uid字段是否实际上在引用同一缓冲区。如果是,则该函数跳过对free的调用。

由于没有列出解决方法,因此确保免受此漏洞影响的唯一方法是打补丁。

本文翻译自:https://www.zerodayinitiative.com/blog/2020/4/1/cve-2020-3947-use-after-free-vulnerability-in-the-vmware-workstation-dhcp-component如若转载,请注明原文地址


文章来源: https://www.4hou.com/posts/6zkn
如有侵权请联系:admin#unsafe.sh