连载:国外高手谈卡巴斯基存隐患(二)

时间:2008-12-14 06:16:28  来源:第二电脑网上收集  作者:

  第二电脑网导读:过与固定值0x7fff0000相对照来判定用户地址是否合法。在大多数x86系统上,这个地址是低于最高用户地址的(即0x7FFEFFFF)。但是,把用户地址空间固定这种做法并不明智。例如,有个可以在boot.ini文件中进行设置的boot参数"/3GB",能改变默认的地址空间分配方式,即将2GB内核、2GB用户空间修改成1GB内核、3GB用户空间。如果运行KAV的系统被设置了/3GB,那么只要参数地址是位于用...
  正文:

用户层指针验证不足

KAV安装的很多关联(甚至还包括很多定制的系统服务)都不断出现对系统来说很致命的漏洞。例如,KAV修改过的NTOpenProcess试图通过与固定值0x7fff0000相对照来判定用户地址是否合法。在大多数x86系统上,这个地址是低于最高用户地址的(即0x7FFEFFFF)。但是,把用户地址空间固定这种做法并不明智。例如,有个可以在boot.ini文件中进行设置的boot参数"/3GB",能改变默认的地址空间分配方式,即将2GB内核、2GB用户空间修改成1GB内核、3GB用户空间。如果运行KAV的系统被设置了/3GB,那么只要参数地址是位于用户地址空间的前2GB里,任何对NtOpenProcess的调用(比如Win32的OpenProcess)都会随机失败。

.text:F82237B0 ; NTSTATUS __stdcall KavNtOpenProcess(PHANDLE ProcessHandle,	ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes,	PCLIENT_ID ClientId).text:F82237B0 KavNtOpenProcess proc near              ; DATA XREF: sub_F82249D0+BFo....text:F8223800    cmp     eax, 7FFF0000h  ; eax = ClientId.text:F8223805    jbe     short loc_F822380D.text:F8223807.text:F8223807 loc_F8223807:                           ; CODE XREF: KavNtOpenProcess+4Ej.text:F8223807    call    ds:ExRaiseAccessViolation

比较合适的、进行此项验证的方法应该是:使用带有SEH框架的ProbeForRead存档函数。这种功能在地址是非合法用户的地址的时候,会自动阻止其访问。

另外,很多KAV的定制系统服务都没有好好地验证用户层的指针自变量,而黑客们正可以利用这些自变量来使系统崩溃。

.text:F8222BE0 ; int __stdcall KAVService10(int,PVOID OutputBuffer,int).text:F8222BE0 KAVService10    proc near               ; DATA XREF: .data:F8227D14o.text:F8222BE0.text:F8222BE0 arg_0           = dword ptr  4.text:F8222BE0 OutputBuffer    = dword ptr  8.text:F8222BE0 arg_8           = dword ptr  0Ch.text:F8222BE0.text:F8222BE0    mov     edx, [esp+OutputBuffer].text:F8222BE4    push    esi.text:F8222BE5    mov     esi, [esp+4+arg_8].text:F8222BE9    lea     ecx, [esp+4+arg_8].text:F8222BED    push    ecx             ; int.text:F8222BEE    mov     eax, [esi]      ; 未验证的用户层指针访问.text:F8222BF0    mov     [esp+8+arg_8], eax.text:F8222BF4    push    eax             ; 输出缓存长度.text:F8222BF5    mov     eax, [esp+0Ch+arg_0].text:F8222BF9    push    edx             ; 输出缓存.text:F8222BFA    push    eax             ; int.text:F8222BFB    call    sub_F821F9A0    ;                                           ; 该例行程序从内部假设所有的指针参数都是合法的。.text:F8222C00    mov     edx, [esi].text:F8222C02    mov     ecx, [esp+4+arg_8].text:F8222C06    cmp     ecx, edx.text:F8222C08    jbe     short loc_F8222C13.text:F8222C0A    mov     eax, 0C0000173h.text:F8222C0F    pop     esi.text:F8222C10    retn    0Ch.text:F8222C13 ; ---------------------------------------------------------------------------.text:F8222C13.text:F8222C13 loc_F8222C13:              ; CODE XREF: KAVService10+28j.text:F8222C13    mov     [esi], ecx.text:F8222C15    pop     esi.text:F8222C16    retn    0Ch.text:F8222C16 KAVService10    endp.text:F8222C20 KAVService11    proc near               ; DATA XREF: .data:F8227D18o.text:F8222C20.text:F8222C20 arg_0           = dword ptr  4.text:F8222C20 arg_4           = dword ptr  8.text:F8222C20 arg_8           = dword ptr  0Ch.text:F8222C20.text:F8222C20    mov     edx, [esp+arg_4].text:F8222C24    push    esi.text:F8222C25    mov     esi, [esp+4+arg_8].text:F8222C29    lea     ecx, [esp+4+arg_8].text:F8222C2D    push    ecx.text:F8222C2E    mov     eax, [esi]      ; 非合法用户层指针的访问.text:F8222C30    mov     [esp+8+arg_8], eax.text:F8222C34    push    eax.text:F8222C35    mov     eax, [esp+0Ch+arg_0].text:F8222C39    push    edx.text:F8222C3A    push    eax.text:F8222C3B    call    sub_F8214CE0    ; 这段例行程序在内部假设所有的指针参数都是合法的                                          ; 所有的指针参数都是合法的.text:F8222C40    test    eax, eax.text:F8222C42    jnz     short loc_F8222C59.text:F8222C44    mov     ecx, [esp+4+arg_8].text:F8222C48    mov     edx, [esi].text:F8222C4A    cmp     ecx, edx.text:F8222C4C    jbe     short loc_F8222C57.text:F8222C4E    mov     eax, STATUS_INVALID_BLOCK_LENGTH.text:F8222C53    pop     esi.text:F8222C54    retn    0Ch.text:F8222C57 ; ------------------------------------------------------------------------.text:F8222C57.text:F8222C57 loc_F8222C57:              ; CODE XREF: KAVService11+2Cj.text:F8222C57    mov     [esi], ecx.text:F8222C59.text:F8222C59 loc_F8222C59:              ; CODE XREF: KAVService11+22j.text:F8222C59    pop     esi.text:F8222C5A    retn    0Ch.text:F8222C5A KAVService11    endp
"连载:国外高手谈卡巴斯基存隐患(二)"由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Server/Safe/2008-12-14/6553.html


关键字:

关于《连载:国外高手谈卡巴斯基存隐患(二)》文章的评论

站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td