本文介绍了两个近期公布的Virtual Box 虚拟机逃逸漏洞,问题存在于 Oracle VirtualBox 5.1.30和5.2-rc1中。漏洞的发现归功于独立安全研究人员Niklas Baumstark。目前漏洞已被提交至 Beyond Security 的 SecuriTeam。

厂商回应

Oracle已针对漏洞发布补丁。更多细节详见:http://www.oracle.com/technetwork/security-advisory/cpujan2018-3236628.html

CVE 编号:CVE: CVE-2018-2698

漏洞详情

漏洞存在于 VirtualBox 的核心图形框架(VBVA子组件)中,影响所有主机操作系统,在用户级VirtualBox主机进程中提供了任意读/写原语。

VirtualBox 模拟的VGA设备与一定数量的VRAM相关联,VRAM 在host(宿主机)上的 VM 进程中,以及 guest(客户机)内核内存中连续映射。VRAM 的一部分被用作通用的共享内存,用于 host 和 guest 之间的通信(host – guest shared memory interface,HGSMI)。借助这种共享内存机制,guest 可以向 host 发出某些命令,例如实现鼠标自动捕获和无缝窗口功能。guest 还可以通过一个名为 VDMA 的子系统,通知 host 代表其在VRAM内部复制数据。

1. vboxVDMACmdExecBpbTransfer 中存在的越界读写漏洞

VBOXVDMACMD_DMA_BPB_TRANSFER 结构体的定义如下((详见 virtualbox 源码 \include\VBox\Graphics\VBoxVideo.h):

当发送一个类型为 VBOXVDMACMD_TYPE_DMA_BPB_TRANSFER 的 VDMA 命令时,这种类型的请求对象驻留在 HGSMI 堆中,并完全由 guest 控制。

在 host 上,一个指向该对象的指针最终被传递给\src\VBox\Devices\Graphics\DevVGA_VDMA.cpp 中的如下函数:

以上代码中标注的 Note 1 和 Note 2 处, guest 控制的偏移量 pTransfer-> Src.offVramBuf 和 pTransfer-> Dst.offVramBuf ,与 VRAM 地址相加,没有进行任何验证或边界检查。在之后的 memcpy 中,size 来自一个 guest 可控的变量,pTransfer->cbTransferSize。

以上,获得了  memcpy(VRAM + X, VRAM + Y, Z) ,其中 X,Y,Z 可被 guest 控制。

2. vboxVDMACmdExecBpbTransfer 中存在的越界读写漏洞

VBOXVDMACMD_DMA_PRESENT_BLT 结构体定义如下:

当发送一个 VBOXVDMACMD_TYPE_DMA_PRESENT_BLT 类型的 VDMA 命令时,这种类型的请求对象会驻留在 HGSMI 堆中,并完全由 guest 控制。

在 host 上,一个指向该对象的指针最终被传递给  \src\VBox\Devices\Graphics\DevVGA_VDMA.cpp中的如下函数:

以上代码中标注的 Note 1 处, guest 可控的偏移 pBlt->offDst 和 pBlt->offSrc 与 VRAM 地址相加,没有进行任何验证或边界检查。

请注意,Note 2 中的 Assert 在生产版本中不可用,所以代码可以到达 else 分支。之后调用的 vboxVDMACmdExecBltPerform 在计算的地址之间执行一个memcpy:

通过设置 pDstDesc-> pitch = 1,pDstRectl-> top = 0,可以得到 cbOff = 0 和 cbSize = pDstRectl-> height(这里同样是通过 guest 控制)。最后调用 memcpy(VRAM + X,VRAM + Y,Z),其中 X,Y,Z 可被 guest 控制。

源链接

Hacking more

...