我的第一个CVE是一个2.3
问题位于src/VBox/Devices/Graphics/DevVGA_VBVA.cpp:740-743的ASSERT_GUEST_MSG_RETURN处,其中尺寸检查使用了||(或)而不是&&(与)。客户机可以提供width=0x80000001, height=16,由于height <= 2048,检查会通过。然后在第745-746行:
cbPointerData = ((((SafeShape.u32Width + 7) / 8) * SafeShape.u32Height + 3) & ~3)
+ SafeShape.u32Width * 4 * SafeShape.u32Height;
第748行的后续检查(cbPointerData <= cbShape - 24)会以截断后的值(80 <= 104)通过。主机通过RTMemAlloc分配80字节,从客户机VRAM复制80字节,然后将尺寸2,147,483,649 × 16与80字节缓冲区一起传递给pfnVBVAMousePointerShape,该函数会使用巨大的尺寸处理光标形状。
主机正在根据溢出后的尺寸计算AND掩码扫描线宽度,并读取超出80字节堆缓冲区的内容。
崩溃1 — NULL指针写入(GUI显示线程):
ExceptionCode=0xc0000005 ExceptionAddress=VirtualBoxVM.dll+0x000267a2
ExceptionInformation[0]=1 (WRITE) ExceptionInformation[1]=0x0000000000000000 (NULL)
rsi=0x80000001 (POISON_WIDTH) r13=0x10 (POISON_HEIGHT=16) rcx=0x0 (NULL dest)
崩溃2 — 堆越界读取(EMT/主线程):
ExceptionCode=0xc0000005 ExceptionAddress=VBoxC.dll+0x000d1194
ExceptionInformation[0]=0 (READ) ExceptionInformation[1]=0x00000263cefe8fd0
rax=0x80000001 (POISON_WIDTH) r12=0x10000001 ((WIDTH+7)/8 = AND扫描线宽度)
r13=0x10 (POISON_HEIGHT=16) r8=0x80000001 (POISON_WIDTH)
由于主机是64位系统,我认为这不是一个可利用的问题。对于“利用”,请在客户机上执行以下操作:
# 客户机:编译并加载
cd /path/to/poc
make
sudo insmod gfx1_exploit.ko