CVE:CVE-2008-1737
CNNVD:CNNVD-200804-425
Sophos Anti-Virus是英国Sophos公司的一套适用于多种操作系统的反病毒软件。该软件可实时侦测和清除病毒、间谍软件、木马和蠕虫，确保台式机和笔记本电脑的全面网络保护。
Sophos杀毒软件的NtCreateKey函数没有正确地验证参数，本地攻击者可能利用此漏洞导致程序不可用。
相关的代码如下：
/-----------
int __cdecl NtCreateKeyHook(PHANDLE pKeyHandle,
ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES ObjectAttributes,
ULONG TitleIndex,PUNICODE_STRING Class,
ULONG CreateOptions,
PULONG Disposition)
[...]
.text:0001C01C  push    4               ; Alignment
.text:0001C01E  push    18h             ; Length
.text:0001C020  mov     esi, [ebp+ObjectAttributes]
.text:0001C023  push    esi             ; Address
.text:0001C024  call    ds:ProbeForRead
- -----------/
这里检查ObjectAttributes指向有效的地址：
/-----------
.text:0001C02A  mov     eax, [esi+OBJECT_ATTRIBUTES.RootDirectory]
.text:0001C02D  mov     [ebp+Handle], eax
.text:0001C030  mov     esi, [esi+OBJECT_ATTRIBUTES.ObjectName]
.text:0001C033  mov     [ebp+pUnicodeString], esi
- -----------/
现在从OBJECT_ATTRIBUTES得到句柄和指向UNICODE_STRING结构的指针：
/-----------
.text:0001C095  push    4
.text:0001C097  push    8
.text:0001C099  push    esi
.text:0001C09A  mov     ebx, ds:ProbeForRead
.text:0001C0A0  call    ebx             ; ProbeForRead, it checks the
pointer before the dereference.
.text:0001C0A2  mov     eax, dword ptr [esi+UNICODE_STRING.Length]
.text:0001C0A4  mov     dword ptr [ebp+stUnicodeString.Length], eax
.text:0001C0A7  mov     esi, [esi+UNICODE_STRING.Buffer]   ; And gets
from the UNICODE_STRING structure
; a pointer to the unicode buffer.
.text:0001C0AA  mov     [ebp+stUnicodeString.Buffer], esi
.text:0001C0AD  push    2               ; Alignment
.text:0001C0AF  shr     eax, 10h
.text:0001C0B2  push    eax             ; Length
.text:0001C0B3  push    esi             ; Address
.text:0001C0B4  call    ebx             ; ProbeForRead
- -----------/
尽管执行了检查，但仍存在问题：
/-----------
.text:0001C0B6  push    gdwValue
.text:0001C0BC  lea     eax, [ebp+stUnicodeString]
.text:0001C0BF  push    eax
.text:0001C0C0  push    [ebp+Object]
.text:0001C0C3  call    sub_1cb40
- -----------/
函数没有正确地检查UNICODE_STRING结构的Length字段，在执行检查时ProbeForRead未经任何验证便接收到了结构的长度字段用作参数，因此如果将这个字段设置为0的话，即使传送了无效的地址ProbeForRead也不会生成任何异常，在试图访问无效地址时会崩溃。
/-----------
sub_1cb40
[...]
.text:0001CB5E  xor     esi, esi
.text:0001CB60  mov     [ebp+ms_exc.disabled], esi
.text:0001CB63  mov     edi, [ebp+pUnicodeString]
.text:0001CB66  mov     eax, [edi+UNICODE_STRING.Buffer]
- -----------/
在以下位置发生崩溃：
/-----------
.text:0001CB69  cmp     word ptr [eax], '\'  ; Reference the first
pointed byte
- -----------/
solution:Upgrade sophos anti-virus to a higher version than 7.0.5,and avoid the version 7.0.5