国外安全技术高手谈卡巴斯基存在隐患

互联网 | 编辑: 杨剑锋 2007-06-18 09:30:00转载 一键看全文

用户层指针验证不足

用户层指针验证不足

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

提示:试试键盘 “← →” 可以实现快速翻页 

一键看全文

本文导航

相关阅读

每日精选

点击查看更多

首页 手机 数码相机 笔记本 游戏 DIY硬件 硬件外设 办公中心 数字家电 平板电脑