VirtualBox是由德国Innotek公司开发的开源虚拟化技术,目前已成为Sun xVM产品家族的成员。在Windows主机操作系统上使用的时候VirtualBox会安装VBoxDrv.sys内核驱动来控制guest操作系统的虚拟化。该驱动未经任何验证便允许非特权用户以METHOD_NEITHER缓冲模式打开\\.\VBoxDrv设备,这就允许不可信任的用户态代码向驱动传送任意内核地址作为参数。通过特制的输入,恶意用户就可以使用内核中的功能执行任意内核态代码。 发布日期:2008-08-04 更新日期:2008-08-05 受影响系统: Sun xVM VirtualBox 1.6.2 Sun xVM VirtualBox 1.6.0 描述: ---------------------------------------------------------------------------- BUGTRAQ ID: 30481 CVE(CAN) ID: CVE-2008-3431 VirtualBox是由德国Innotek公司开发的开源虚拟化技术,目前已成为Sun xVM产品家族的成员。 在Windows主机操作系统上使用的时候VirtualBox会安装VBoxDrv.sys内核驱动来控制guest操作系统的虚拟化。该驱动未经任何验证便允许非特权用户以METHOD_NEITHER缓冲模式打开\\.\VBoxDrv设备,这就允许不可信任的用户态代码向驱动传送任意内核地址作为参数。通过特制的输入,恶意用户就可以使用内核中的功能执行任意内核态代码。 以下是SUPDrv-win.cpp中用于处理IOCTL请求的函数: /----------- NTSTATUS _stdcall VBoxDrvNtDeviceControl(PDEVICE_OBJECT pDevObj, PIRPpIrp) { PSUPDRVDEVEXT pDevExt = (PSUPDRVDEVEXT)pDevObj->DeviceExtension; PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(pIrp); PSUPDRVSESSION pSession =(PSUPDRVSESSION)pStack->FileObject->FsContext; /* * Deal with the two high-speed IOCtl that takes it's arguments from * the session and iCmd, and only returns a VBox status code. */ ULONG ulCmd = pStack->Parameters.DeviceIoControl.IoControlCode; if ( ulCmd == SUP_IOCTL_FAST_DO_RAW_RUN(1) || ulCmd == SUP_IOCTL_FAST_DO_HWACC_RUN || ulCmd == SUP_IOCTL_FAST_DO_NOP) { KIRQL oldIrql; int rc; /* Raise the IRQL to DISPATCH_LEVEl to prevent Windows fromrescheduling us to another CPU/core. */ Assert(KeGetCurrentIrql() <= DISPATCH_LEVEL); KeRaiseIrql(DISPATCH_LEVEL, &oldIrql);(2) rc = supdrvIOCtlFast(ulCmd, pDevExt, pSession); KeLowerIrql(oldIrql); /* Complete the I/O request. */ NTSTATUS rcNt = pIrp->IoStatus.Status = STATUS_SUCCESS; pIrp->IoStatus.Information = sizeof(rc); __try {(3) *(int *)pIrp->UserBuffer = rc; } __except(EXCEPTION_EXECUTE_HANDLER) { rcNt = pIrp->IoStatus.Status = GetExceptionCode(); dprintf(("VBoxSupDrvDeviceContorl: Exception Code %#x\n", rcNt)); } IoCompleteRequest(pIrp, IO_NO_INCREMENT); return rcNt; } return VBoxDrvNtDeviceControlSlow(pDevExt, pSession, pIrp, pStack); }- -----------/黑客
在(1)处句子检查了IOCTL代码,SUPDrvIOC.h以如下方式定义: /-----------#define SUP_IOCTL_FAST_DO_RAW_RUN SUP_CTL_CODE_FAST(64)/** Fast path IOCtl: VMMR0_DO_HWACC_RUN */#define SUP_IOCTL_FAST_DO_HWACC_RUN SUP_CTL_CODE_FAST(65)/** Just a NOP call for profiling the latency of a fast ioctl call toVMMR0. */#define SUP_IOCTL_FAST_DO_NOP SUP_CTL_CODE_FAST(66)- -----------/网络安全