-
游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。
赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!
TheHackerWorld官方
- 0
赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!
TheHackerWorld官方
问题
HACK1949
安全分析 | 两个VMware Workstation中的TOCTOU漏洞
写在前面的话
就在前两天,VMware发布了一份安全布告,并修正了VMware ESXi、Workstation、Fusion和NSX-T中的六个安全缝隙。其中有两个缝隙归于TOCTOU(Time-of-check Time-of-use)竞赛条件缝隙,既然现在缝隙已被修正,那咱们就一起来看一看这两个TOCTOU缝隙的详细信息以及其对VMware体系的影响吧!
缝隙剖析
VMware Workstation运用了一个修正版的PhoenixBIOS 4.0 Release 6来完成其旧版别BIOS的模仿功用。在咱们对BIOS.440.ROM镜像剖析进程中,咱们发现其中一处修正将导致VMware软件中存在后门。这种场景下的“后门”其实并没有什么歹意性,与传统意义上的后门相反,这个“后门”指的是一个合法的数据通道,虚拟客户机能够经过它与管理程序进行通信。在这种状况下,后门是经过模仿的I/O端口完成的,而用户能够经过履行以下指令并运用后门来发送消息:
经过交叉引用后门调用并结合open-vm-tools,咱们能够辨认出ROM镜像中所运用的指令集:
这儿的每一条指令代表的都是一个后门功用函数,它们在主机体系上完成,能够由用户经过向模仿端口传递相应的值来进行调用。
在这儿,BDOOR_CMD_PATCH_ACPI_TABLES指令是最有意思的了,因为它能够从用户的内存中解析ACPI表,下面的剖析进程根据的是VMware Workstation的Linux版别(v 15.5.6)。
后门函数所完成的BDOOR_CMD_PATCH_ACPI_TABLES首要会查看方针主机装置的VMware Tools版别以及当前用户处理器的权限等级(CPL),然后再进行功用调用。
Get_VMTools_Version函数能够回来VMware Tools的版别信息,回来数据的格局为编码整型值,这部分数据在open-vm-tools中的定义如下:
其中,BDOOR_CMD_PATCH_ACPI_TABLES指令只要在用户陈述VMware Tools版别低于6.0.0的时分才会运用到。除此之外,这儿还会查看以确保指令是从CPL 0(或ring 0)调用的,而这也是最高等级的用户权限了。这种机制或许是为了限制用户运用这个后门指令来猜想发动代码。完成查看之后,代码将会扫描用户的BIOS高内存区域(0xE0000到0xFFFFF)以辨认“RSD PTR”符号,并尝试定位Root体系描绘指针(RSDP)结构。
接下来,代码还会对剩余的ACPI数据结构进行解析以定位体系差异描绘表(DSDT)。
找到DSDT之后,后门函数会寻找并用“F00”替换_S1的数据。
为了测验该缝隙,咱们首要需要导出DSDT表,并在陈述了VMware Tools版别小于6.0.0之后重启客户机。在对open-vm-tools进行剖析之后,咱们发现个该东西将运用“tools.set.version”这个GuestRPC指令来设置这条信息。
重启之后,咱们再次导出DSDT表,然后对ASL代码进行剖析。
S1休眠状况此时会被更改,而且导出表的校验和也会进行相应的更新。
在这儿,我发现了两个不同的Time-of-check Time-of-use (TOCTOU)缝隙。其中一个是越界受限写入缝隙,另一个则是越界读取缝隙,并有可能导致方针主机发生信息走漏。
DSDT表中包含了一个ACPI Header,后面跟着的是AML字节码。ACPI Header的数据结构如下所示:
Header中最有意思的数据字段为length和checksum。表的长度和校验和首要会在ValidateAndGetACPITable函数被调用时来进行验证,调用方位为0x01D9C6A:
总的来说,ValidateAndGetACPITable函数首要会从客户机内存中读取出ACPI表的巨细,然后运用这个巨细值来从客户机物理内存中将整个ACPI表映射到主机内存中。接下来,它会核算映射内存的字节巨细并核算出ACPI校验和来对表进行验证。
CVE-2020-3982/ZDI-20-1268
完成了表验证之后,代码会再次从客户机内存中读取出ACPI表长度,然后在DSDT AML代码中查找_S1。
.
在这儿,客户机操作体系是能够修正两次获取到的表的巨细值的,从而导致受限的OOB写入原语:“finding _S1”,并运用F00替换其值。
CVE-2020-3981/ZDI-20-1267
当S1休眠目标被修正之后,Header中的校验和将需要被更新。为了预备核算新的校验和,代码将再次从客户机内存中检索表长度:
如果客户机在这次读取操作之前增加了长度字段的值,那么将导致在校验和核算进程中出现越界读取的状况。
缝隙运用PoC
尽管这个后门函数在履行受信任的BIOS代码期间只被调用一次,但它在引导后不会被禁用,并且即使是客户机操作体系也能够持续拜访它。因为BIOS内存区域是可写的,所以在调用后门之前,客户机能够在地址0xE0000插入一个伪造的RSDP结构。因为RSDT物理地址是在伪造的RSDP结构中设置的,因而整个ACPI的解析进程都有可能被劫持:
攻击者需要在客户机RAM的结尾设置一个DSDT表,这样就能够直接在主机内存上受限OOB拜访了。尽管这种OOB写入操作是高度受限的,但ACPI校验和核算进程中的OOB读取是能够走漏主机堆内存数据的。
ACPI表校验和是一个值,它使得表中所有字节的总和为0(mod 256)。考虑到这一点,信息走漏策略应该是一次走漏一个字节。攻击者能够设置DSDT ACPI表头,使长度和校验和字段可从客户机拜访。AML代码占用了与主机堆内存区域相邻的客户机内存区域末尾,使得客户机无法拜访该内存区域。然后,它们能够运用竞赛条件触发1字节的OOB读取,并查看校验和值是否已更改。如果是,根据之前的校验和值和更新后的校验和值,运用它们能够核算出走漏的字节。如果在经过一定量的尝试后没有观察到校验和的变化,则假定走漏的字节为0。然后,攻击者能够触发一个2字节的OOB读取来走漏后续字节,以此类推。
下面给出的缝隙运用PoC:
下面给出的是vmware-vmx进程的主机堆内存状况(2GB内存):
总结
目前,VMware已经在Workstation v16.0版别中修正了该问题。除此之外,VMSA-2020-0023补丁还修正了我的同事Lucas Leong陈述的ESXi中的一个可长途运用的缝隙。
链接帖子
意见的链接
分享到其他网站
这个问题有0个答案
推荐的帖子