VirtualBox VBoxDrv.sys驅動本地權限漏洞
【綠盟科技授權,賽迪發佈,謝絕任何網站轉載,違者,賽迪網將保留追究其法律責任的權利!】
【賽迪網-IT技術報道】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)- -----------/ |
同一文件中還定義了SUP_CTL_CODE_FAST()宏:
/-----------#define SUP_CTL_CODE_FAST(Function) CTL_CODE(FILE_DEVICE_UNKNOWN,(Function) | SUP_IOCTL_FLAG, METHOD_NEITHER, FILE_WRITE_ACCESS)- -----------/ |
這時可以知道所使用的通訊方式為METHOD_NEITHER,然後在(2)處將supdrvIOCtlFast()的返回值保存到了rc中,在(3)處未經任何有效性檢查便將rc中的值直接寫入到了用戶態所發送的緩衝區指針。在這種情況下,就可以對IOCTL提供內核地址,向supdrvIOCtlFast()的返回值寫入內核空間記憶體中的任意地址,以任意修改內核代碼或內核指針,之後在ring 0環境中執行任意代碼。
<*來源:Anibal Sacco
鏈接:http://marc.info/?l=bugtraq&m=121788371725717&w=2
http://secunia.com/advisories/31361/
http://sunsolve.sun.com/search/printfriendly.do?assetkey=1-66-240095-1
*>
建議:
----------------------------------------------------------------------------
廠商補丁:
Sun
---
Sun已經為此發佈了一個安全公告(Sun-Alert-240095)以及相應補丁:
Sun-Alert-240095:A Security Vulnerability in 'VBoxDrv.sys' driver of Sun xVM VirtualBox 1.6 may lead to Arbitrary Code Execution or Denial of Service (DoS)
鏈接:http://sunsolve.sun.com/search/printfriendly.do?assetkey=1-66-240095-1
(