安全研究

安全漏洞
Microsoft Windows Ndistapi本地拒绝服务漏洞

发布日期:2007-03-19
更新日期:2007-03-20

受影响系统:
Microsoft Windows XP SP2
Microsoft Windows Server 2003 SP1
描述:
BUGTRAQ  ID: 23025

Microsoft Windows是微软发布的非常流行的操作系统。

Microsoft Windows的NDISTAPI.sys驱动实现机制上存在漏洞,本地攻击者可能利用此漏洞对系统执行拒绝服务攻击。

Windows的NDISTAPI.sys驱动是内核态组件,但允许非特权用户的访问,因此任意用户态应用程序都可以向这个设备写入数据:

Ndistapi.sys
Windows XP SP2

_; __stdcall NdisTapiDispatch(x, x)
.text:000115E8 _NdisTapiDispatch@8 proc near           ; DATA XREF:
DriverEntry(x,x)+13E#o
.text:000115E8
.text:000115E8 arg_4           = dword ptr  0Ch
.text:000115E8
.text:000115E8                 push    ebp
.text:000115E9                 mov     ebp, esp
.text:000115EB                 push    ebx
.text:000115EC                 push    esi
.text:000115ED                 mov     esi, [ebp+arg_4]
.text:000115F0                 mov     eax, [esi+60h]
.text:000115F3                 movzx   ecx, byte ptr [eax]
.text:000115F6                 sub     ecx, 0
.text:000115F9                 mov     edx, [esi+0Ch]
.text:000115FC                 mov     ebx, [eax+4]
.text:000115FF                 push    edi
.text:00011600                 mov     edi, [eax+8]
.text:00011603                 jz      short loc_1167E
.text:00011605                 dec     ecx
.text:00011606                 dec     ecx
.text:00011607                 jz      short loc_11674
.text:00011609                 sub     ecx, 0Ch
.text:0001160C                 jnz     loc_11697
.text:00011612                 mov     eax, [eax+0Ch]
.text:00011615                 cmp     eax, 8FFF23C0h  ;IOCTL
.text:0001161A                 jz      short loc_11669 ;DoIoctlConnectWork()
.text:0001161C                 cmp     eax, 8FFF23C8h
.text:00011621                 jz      short loc_1165C
{...}
.text:00010B16 ; __stdcall DoIoctlConnectWork(x, x, x, x)
.text:00010B16 _DoIoctlConnectWork@16 proc near        ; CODE XREF:
NdisTapiDispatch(x,x)+85#p
.text:00010B16
.text:00010B16 arg_0           = dword ptr  4
.text:00010B16 arg_4           = dword ptr  8
.text:00010B16 arg_8           = dword ptr  0Ch
.text:00010B16 arg_C           = dword ptr  10h
.text:00010B16
.text:00010B16                 mov     ecx, _DeviceExtension
.text:00010B1C                 push    edi
.text:00010B1D                 mov     edi,
ds:__imp_@KfAcquireSpinLock@4 ; KfAcquireSpinLock(x)
.text:00010B23                 add     ecx, 4Ch
.text:00010B26                 call    edi ; KfAcquireSpinLock(x) ;<=
FLAW KfAcquireSpinLock(x)
.text:00010B28                 cmp     [esp+4+arg_8], 8  ;InputBuffer length
.text:00010B2D                 mov     dl, al
.text:00010B2F                 jb      loc_10BC5
.text:00010B35                 cmp     [esp+4+arg_C], 4  ;OutputBuffer
length
.text:00010B3A                 jb      loc_10BC5
.text:00010B40                 mov     ecx, _DeviceExtension
.text:00010B46                 cmp     dword ptr [ecx+4], 1
.text:00010B4A                 push    ebx
.text:00010B4B                 mov     ebx, [esp+8+arg_4]
.text:00010B4F                 push    esi
.text:00010B50                 mov     esi,
ds:__imp_@KfReleaseSpinLock@8 ; KfReleaseSpinLock(x,x)
.text:00010B56                 jnz     short loc_10B8D
.text:00010B58                 mov     dword ptr [ecx+4], 2
.text:00010B5F                 mov     ecx, _DeviceExtension
.text:00010B65                 mov     eax, [ebx]
.text:00010B67                 mov     [ecx+10h], eax
.text:00010B6A                 mov     ecx, _DeviceExtension
.text:00010B70                 add     ecx, 4Ch
.text:00010B73                 call    esi ; KfReleaseSpinLock(x,x) ;
KfReleaseSpinLock(x,x)

[---]

.text:00010BC5
.text:00010BC5 loc_10BC5:
.text:00010BC5
.text:00010BC5                 mov     eax, 0C0000023h  ; ERROR CODE
.text:00010BCA                 xor     ecx, ecx
.text:00010BCC
.text:00010BCC loc_10BCC:
.text:00010BCC                 mov     edx, [esp+4+arg_0]
.text:00010BD0                 mov     [edx+18h], eax
.text:00010BD3                 mov     [edx+1Ch], ecx
.text:00010BD6                 pop     edi
.text:00010BD7                 retn    10h              ; Return

可见这个例程将IRQL提升到DISPATCH级别,在检查长度之前要求spinlock,之后如果所提供的大小无效的话,例程没有释放所获得的spinlock便返回,因此即使返回到Ring3之后IRQL仍在该线程的DISPATCH级。

最终的结果是用户态线程以DISPATCH级运行。由于在DISPATCH级无法访问分页内存,而在用户态大多数内存都是分页的,因此只要线程执行涉及到访问分页内存的操作,内核都会由于IRQL_LESS_THAN_NOT_EQUAL而出现bugcheck错误,导致系统崩溃。

<*来源:Rubén Santamarta
  
  链接:http://marc.info/?l=bugtraq&m=117433257617993&w=2
*>

建议:
厂商补丁:

Microsoft
---------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:

http://www.microsoft.com/technet/security/

浏览次数:3733
严重程度:0(网友投票)
本安全漏洞由绿盟科技翻译整理,版权所有,未经许可,不得转载
绿盟科技给您安全的保障