CVE:CVE-2007-1537
CNNVD:CNNVD-200703-500
Microsoft Windows是美国微软（Microsoft）公司发布的一系列操作系统。
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错误，导致系统崩溃。
solution:Upgrade microsoft windows_2003_server to a higher version than sp1,and avoid the version sp1; Upgrade microsoft windows_xp to a higher version than *:sp2,and avoid the version *:sp2