微点主动防御(version20080924及以下)多个拒绝服务漏洞及内核BUG

作者:MJ0011

国庆无聊在家,下了一个0924版的微点,从它的HOOK一个个看起,看了4个就发现两个有问题~~再看看,发现有问题的函数几乎是一半对一半~ 多达十几处。还只是简单看看地结果~太挫了

现在说一说其中两个~微点赶紧改吧:D

(1),驱动对ZwOpenEvent的HOOK存在拒绝服务安全漏洞,任何权限用户可以使安装了微点的系统蓝屏

问题在于微点的Hook驱动mp110013.sys对用户态调用ZwOpenEvent传入参数检查不充分导致的

mp110013.sys(版本1.2.10126.0, CheckSum = 0x0000FDB7 , TimeStamp = 0x4859C30E)

偏移0XBAE处实际是其对ZwOpenEvent的HOOK实际处理部分(首先经过一个HOOK引擎mp110003.sys转发)。

ZwOpenEvent的原型是:

NTSTATUS
ZwOpenEvent(
OUT PHANDLE EventHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes
);

微点只对ObjectAttributes做了ProbeForRead检查,没有对该结构内部成员 的缓存地址做有效检查,就直接使用系统函数RtlUnicodeStringToAnsiString将该结构的 ObjectAttributes->ObjectName转换为ANSI字符,因此只要RING3的程序对该域填充错误地址,就可以引发系统访问 无效内存蓝屏

由于该函数的Hook函数中使用了结构化异常处理,因此传0之类的地址是无法引发蓝屏的,但只要传入任何一个无效的内核地址(例如0x80000000),就可以使微点蓝屏

下面是引发蓝屏的测试代码:

HMODULE hlib = LoadLibrary(“ntdll.dll”);
PVOID p = GetProcAddress(hlib , “ZwOpenEvent”);

OBJECT_ATTRIBUTES oba ;
oba.ObjectName = (PUNICODE_STRING)0x80000000 ;

__asm{
lea eax ,oba
push eax
push 0
push 0
call p
}

运行了这段代码后,系统即蓝屏重启,适用于任何安装了微点的系统任何用户权限。

我编写了一个测试程序”BSOD_MP.exe”,在装有20080924及以下版本的微点的系统,运行程序后点”done”,系统即会蓝屏。

测试程序下载:http://mj0011.ys168.com 漏洞演示目录下BSOD_mp.rar

(2).驱动对ZwOpenThread的HOOK处理存在漏洞,可能导致系统其他组件工作不正常

在同样版本的mp110013.sys中,对于ZwOpenThread的处理存在BUG,可能导致任意调用该函数的其他驱动程序或系统组件失败!

在对ZwOpenThread的HOOK中,微点的驱动没有判断系统上个模式,而是直接使用 ProbeForRead函数去校验ZwOpenThread的参数: ObjectAttributes,这样做的结果会导致在驱动中使用该函数的驱动,只要使用了这个参数,调用这个函数就会返回失败。 STATUS_ACCESS_DEIND

正确的做法应该是先判断当前线程的前个模式,如果是UserMode,再做有效性校验。

这个函数在驱动中用得不多,但也不是没有,属于微软有文档的函数,例如在Sandboxie的驱动中就有用到这个,如果这个函数失败,沙箱内的进程在执行某些操作的时候,就可能出错,甚至导致系统崩溃。

====================================================

综上来看,微点的驱动开发者对如何校验用户态参数还是有一些概念的,可惜的是,不仅理解不深,而且还会出现一些粗心大意的毛病~象SSDT HOOK这样直面用户态程序的驱动代码,还是要慎之慎之~~

另外这也暴露出,微点的测试流程不够专业,驱动测试不够重视,如果发布前使用BSODHook等Driver Test工具跑一跑,就不会出现如(1)中那样弱智的错误了~

相关日志

发表评论