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

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

  第二电脑网导读:ystemProcessesAndThreads信息类被调用的时候就从某些进程中截断线程列表。这是一种潜在的机制,用户层可以接受进程以及所有运行在系统中的程序的线程列表,这就提供给KAV一种隐藏用户层线程的手段。KAV中存在这样一段代码——这件事本身就是不可思议的;在用户层隐藏正在运行着的代码这种行为是跟rootkits相联系的,这不是杀毒软件应该有的功能。
  正文:

隐藏用户层的线程

然而,KAV的关联错误还不仅仅止于NtOpenProcess。KAV关联的另一个系统服务是NtQuerySystemInformation。这个例行程序被修改成当SystemProcessesAndThreads信息类被调用的时候就从某些进程中截断线程列表。这是一种潜在的机制,用户层可以接受进程以及所有运行在系统中的程序的线程列表,这就提供给KAV一种隐藏用户层线程的手段。KAV中存在这样一段代码——这件事本身就是不可思议的;在用户层隐藏正在运行着的代码这种行为是跟rootkits相联系的,这不是杀毒软件应该有的功能。

撇去隐藏运行代码这个潜在的威胁不谈,它还存在很多安全漏洞:

它使用用户层的NtQuerySystemInformation输出缓存——实际上内核层已经占用了这部分,但它不能防御恶意用户层的程序对该缓存的修改或释放。该项函数没有SEH框架,因此用户层的应用有可能导致KAV对空的内存进行操作。

这其中没有对返回的输出缓存的偏移地址进行验证,也就不能确定偏移地址是不是指向输出缓存之外的内存。显然这会造成问题,因为返回的数据结构实际上是子结构的一个列表,加一个偏移地址相当于给那个结构的地址加上了一个特殊构架,以便访问下一个结构。用户层可以修改这个偏移地址,让它实际上指向内核内存。由于钩子函数有时会把数据写入到它认为的用户输出缓存,那么黑客就有了一个有趣的、可以用来从非授权的用户层获得内核权限的方法。

.text:F8224430 ; NTSTATUS __stdcall KavNtQuerySystemInformation(	SYSTEM_INFORMATION_CLASS SystemInformationClass,	PVOID SystemInformation,	ULONG SystemInformationLength,	PULONG ReturnLength).text:F8224430 KavNtQuerySystemInformation proc near   ; DATA XREF: sub_F82249D0+17Bo.text:F8224430.text:F8224430 var_10          = dword ptr -10h.text:F8224430 var_C           = dword ptr -0Ch.text:F8224430 var_8           = dword ptr -8.text:F8224430 SystemInformationClass= dword ptr  4.text:F8224430 SystemInformation= dword ptr  8.text:F8224430 SystemInformationLength= dword ptr  0Ch.text:F8224430 ReturnLength    = dword ptr  10h.text:F8224430 arg_24          = dword ptr  28h.text:F8224430.text:F8224430    mov     eax, [esp+ReturnLength].text:F8224434    mov     ecx, [esp+SystemInformationLength].text:F8224438    mov     edx, [esp+SystemInformation].text:F822443C    push    ebx.text:F822443D    push    ebp.text:F822443E    push    esi.text:F822443F    mov     esi, [esp+0Ch+SystemInformationClass].text:F8224443    push    edi.text:F8224444    push    eax.text:F8224445    push    ecx.text:F8224446    push    edx.text:F8224447    push    esi.text:F8224448    call    OrigNtQuerySystemInformation.text:F822444E    mov     edi, eax.text:F8224450    cmp     esi, SystemProcessesAndThreadsInformation ;.text:F8224450               ; Not the process / thread list API?.text:F8224450               ; Return to caller.text:F8224453    mov     [esp+10h+ReturnLength], edi.text:F8224457    jnz     ret_KavNtQuerySystemInformation.text:F822445D    xor     ebx, ebx.text:F822445F    cmp     edi, ebx        ;.text:F822445F               ; Nothing returned?.text:F822445F               ; Return to caller.text:F8224461    jl      ret_KavNtQuerySystemInformation.text:F8224467    push    ebx.text:F8224468    push    9.text:F822446A    push    8.text:F822446C    call    sub_F8216730.text:F8224471    test    al, al.text:F8224473    jz      ret_KavNtQuerySystemInformation.text:F8224479    mov     ebp, g_KavDriverData.text:F822447F    mov     ecx, [ebp+0Ch].text:F8224482    lea     edx, [ebp+48h].text:F8224485    inc     ecx.text:F8224486    mov     [ebp+0Ch], ecx.text:F8224489    mov     ecx, ebp.text:F822448B    call    ds:ExInterlockedPopEntrySList.text:F8224491    mov     esi, eax.text:F8224493    cmp     esi, ebx.text:F8224495    jnz     short loc_F82244B7.text:F8224497    mov     eax, [ebp+10h].text:F822449A    mov     ecx, [ebp+24h].text:F822449D    mov     edx, [ebp+1Ch].text:F82244A0    inc     eax.text:F82244A1    mov     [ebp+10h], eax.text:F82244A4    mov     eax, [ebp+20h].text:F82244A7    push    eax.text:F82244A8    push    ecx.text:F82244A9    push    edx.text:F82244AA    call    [ebp+arg_24].text:F82244AD    mov     esi, eax.text:F82244AF    cmp     esi, ebx.text:F82244B1    jz      ret_KavNtQuerySystemInformation.text:F82244B7.text:F82244B7 loc_F82244B7:              ; CODE XREF: KavNtQuerySystemInformation+65j.text:F82244B7    mov     edi, [esp+10h+SystemInformation].text:F82244BB    mov     dword ptr [esi], 8.text:F82244C1    mov     dword ptr [esi+4], 9.text:F82244C8    mov     [esi+8], ebx.text:F82244CB    mov     [esi+34h], ebx.text:F82244CE    mov     dword ptr [esi+3Ch], 1.text:F82244D5    mov     [esi+10h], bl.text:F82244D8    mov     [esi+30h], ebx.text:F82244DB    mov     [esi+0Ch], ebx.text:F82244DE    mov     [esi+38h], ebx.text:F82244E1    mov     ebp, 13h.text:F82244E6.text:F82244E6 LoopThreadProcesses:       ; CODE XREF: KavNtQuerySystemInformation+ECj.text:F82244E6    mov     dword ptr [esi+40h], 4 ;.text:F82244E6               ; Loop through the returned list of processes and threads..text:F82244E6               ; For each process, we shall check to see if it is a.text:F82244E6               ; special (protected) process.  If so, then we might.text:F82244E6               ; decide to remove its threads from the listing returned.text:F82244E6               ; by setting the thread count to zero..text:F82244ED    mov     [esi+48h], ebx.text:F82244F0    mov     [esi+44h], ebp.text:F82244F3    mov     eax, [edi+SYSTEM_PROCESSES.ProcessId].text:F82244F6    push    ebx.text:F82244F7    push    esi.text:F82244F8    mov     [esi+4Ch], eax.text:F82244FB    call    KavCheckProcess.text:F8224500    cmp     eax, 7.text:F8224503    jz      short CheckNextThreadProcess.text:F8224505    cmp     eax, 1.text:F8224508    jz      short CheckNextThreadProcess.text:F822450A    cmp     eax, ebx.text:F822450C    jz      short CheckNextThreadProcess.text:F822450E    mov     [edi+SYSTEM_PROCESSES.ThreadCount], ebx ;                              ; Zero thread count out (隐藏进程线程).text:F8224511.text:F8224511 CheckNextThreadProcess:    ; CODE XREF: KavNtQuerySystemInformation+D3j.text:F8224511               ; KavNtQuerySystemInformation+D8j ....text:F8224511    mov     eax, [edi+SYSTEM_PROCESSES.NextEntryDelta].text:F8224513    cmp     eax, ebx.text:F8224515    setz    cl.text:F8224518    add     edi, eax.text:F822451A    cmp     cl, bl.text:F822451C    jz      short LoopThreadProcesses

连载:国外高手谈卡巴斯基存隐患(三)》由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Server/Safe/2008-12-14/6552.html


关键字:

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

站内搜索: 高级搜索

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