当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2015-0145684

漏洞标题:驱动LDrvPro存在任意指令执行漏洞(可用于提权场景)

相关厂商:160.com

漏洞作者: iometer

提交时间:2015-10-10 12:41

修复时间:2016-01-11 15:32

公开时间:2016-01-11 15:32

漏洞类型:非授权访问/认证绕过

危害等级:高

自评Rank:15

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-10-10: 细节已通知厂商并且等待厂商处理中
2015-10-13: 厂商已经确认,细节仅向厂商公开
2015-10-16: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航
2015-12-07: 细节向核心白帽子及相关领域专家公开
2015-12-17: 细节向普通白帽子公开
2015-12-27: 细节向实习白帽子公开
2016-01-11: 细节向公众公开

简要描述:

驱动人生驱动程序LDrvPro.sys/LDrvPro64.sys, 存在任意地址写入漏洞,写入的地址可控,可以实现内核任意指令执行目的.
影响的操作系统WindowsXP~Win10, 无论x86或是x64;

详细说明:

驱动LDrvPro基于minifilter,在其FilterMessage例程中,对于0x12号消息的处理极其不严谨:将UserMode给定的数据缓存到KernelMode的NonPagePool上,并将该pool的地址返回给UserMode——这个过程,没有校验输出缓冲区及其大小,导致任意地址写入漏洞.
此类漏洞,最直接的利用就是UserMode的程序将shellcode投递给内核驱动执行,完全绕开Ring3与Ring0的界限;shellcode的开发者不必开发一个带"正规签名"的驱动,完全无视DSE, 实现各种非授权访问系统数据.
以下是代码简要说明:

typedef struct _DTL_MESSAGE {
ULONG MajorFunction;
ULONG MinorFuntion;
UCHAR Data[0];
}DTL_MESSAGE, *PDTL_MESSAGE;
NTSTATUS
FilterMessage(
PVOID ConnectionCookie,
PDTL_MESSAGE InputBuffer,
ULONG InputBufferSize,
PULONG OutputBuffer,
ULONG OutputBufferSize,
PULONG ReturnOutputBufferLength
)
{
if ( InputBuffer && InputBufferSize >= 4 )
{
if ( InputBuffer->MajorFunction == 0x12 )
{
PUCHAR pool = ExAllocatePoolWithTag(NonPagedPool, InputBufferSize + 0x38, 'shal'); //perfect
PUCHAR EXP_BUF = pool + 0x38;
memcpy(EXP_BUF, InputBuffer->Data, InputBufferSize - sizeof(DTL_MESSAGE));
if ( OutputBuffer )
{
*ReturnOutputBufferLength = InputBufferSize - sizeof(DTL_MESSAGE);
*OutputBuffer = (PVOID)EXP_BUF;//o(^▽^)o
}
return STATUS_SUCCESS;
}
}
//return result;
}
NTSTATUS __stdcall DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
FltRegisterFilter( DriverObject, &FilterRegistration, &FilterHandle );
FltStartFiltering( FilterHandle );
FltBuildDefaultSecurityDescriptor( &sd, FLT_PORT_ALL_ACCESS );
RtlInitUnicodeString( &PortName, L"\\LDrvProMsgPort{B25BADC1-E0FA-4ce3-8B5C-B2FD37681443}");
InitializeObjectAttributes( &ObjectAttributes,
&PortName,
OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,NULL, sd);
FltCreateCommunicationPort( FilterHandle,
&FilterPort,
&obja,
NULL,
FilterConnect,
FilterDisconnect,
FilterMessage,//EXPLOIT
2 );
FltFreeSecurityDescriptor(sd);
}

漏洞证明:

//示例程序:执行0xEB 0xFE实现内核线程死循环;
//下载链接 http://pan.baidu.com/s/1ntjEtwX

修复方案:

严格校验输入和输出缓冲区地址及大小.

版权声明:转载请注明来源 iometer@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2015-10-13 15:12

厂商回复:

已经确认存在漏洞并进行修复

最新状态:

暂无