Avast!杀毒软件aavmKer4.sys驱动IOCTL处理本地权限提升漏洞

受影响系统:

ALWIL Software Avast! Antivirus 5.0
ALWIL Software Avast! Antivirus 4.8

不受影响系统:

ALWIL Software Avast! Antivirus 5.0.418

描述:


BUGTRAQ  ID: 38363

Avast! Antivirus是ALMIL公司开发的杀毒软件。

Avast!杀毒软件所使用的aavmker4.sys内核驱动在处理某些IOCTL请求时存在错误,本地用户可以通过特制的0xb2d60030 IOCTL请求破坏内核内存,导致内核崩溃或执行任何代码。

aavmker4.sys内核驱动的0xb2d60030 IOCTL调用未经充分验证便接受了用户输入,以下是aavmker4.sys的反汇编(avast! 4.8,文件版本4.8.1356.0):

[..]
.text:00010E46 [1]  cmp    eax, 0B2D60030h ; vulnerable IOCTL
.text:00010E4B      jz     loc_10EEF
[..]
.text:00010EEF    loc_10EEF:
.text:00010EEF      cmp    byte_1262C, 0
.text:00010EF6      jz     short loc_10F0C
[..]
.text:00010F0C    loc_10F0C:
.text:00010F0C [2]  mov    edi, [ebx+0Ch]
.text:00010F0F [3]  cmp    esi, 878h       ; InputBufferSize == 0x878?
.text:00010F15      jz     short loc_10F21
[..]

[1] 有漏洞的IOCTL  
[2] EDI指向了用户控制的IOCTL输入数据
[3] IOCTL输入数据的大小必须等于0x878

[..]
.text:00010F21    loc_10F21:
.text:00010F21      and    [ebp+var_4], 0
.text:00010F25      cmp    dword ptr [edi], 0
.text:00010F28      jz     loc_10FC5
.text:00010F2E [4]  mov    esi, [edi+870h]
.text:00010F34      mov    [ebp+v34_uc], esi
.text:00010F37      mov    eax, ds:MmUserProbeAddress
.text:00010F3C [5]  cmp    esi, [eax]      ; user space or kernel space?
.text:00010F3E      jnb    short loc_10F46
[..]

[4] 如果输入大小等于0x878,从用户提供的IOCTL输入数据获得指针值并保存在ESI中
[5] 检查ESI指向用户空间还是内核空间

[..]
.text:00010F46    loc_10F46:
.text:00010F46      push   esi             ; VirtualAddress
.text:00010F47 [6]  call   ds:MmIsAddressValid
.text:00010F4D      test   al, al
.text:00010F4F      jz     short loc_10F5F
.text:00010F51      lea    eax, [esi+8]
.text:00010F54      push   eax             ; VirtualAddress
.text:00010F55 [7]  call   ds:MmIsAddressValid
.text:00010F5B      test   al, al
.text:00010F5D      jnz    short loc_10F65
[..]

[6] + [7] 如果ESI指向了内核空间中的地址,检查ESI和ESI+8是否指向有效的内存地址

[..]
.text:00010F65    loc_10F65:
.text:00010F65 [8]  mov    eax, [esi]
.text:00010F67      mov    [ebp+v32_uc], eax
.text:00010F6A [9]  mov    esi, [esi+4]
.text:00010F6D      mov    [ebp+var_4C], esi
.text:00010F70 [10] xor    [ebp+v32_uc], 55667788h
.text:00010F77 [11] xor    esi, 11223344h
.text:00010F7D      mov    [ebp+var_4C], esi
.text:00010F80      mov    eax, dword_125E8
.text:00010F85 [12] cmp    eax, [ebp+v32_uc] ; check pattern1
.text:00010F88      jnz    short loc_10F93
.text:00010F8A      mov    eax, dword_125EC
.text:00010F8F [13] cmp    eax, esi        ; check pattern2
.text:00010F91      jz     short loc_10F99
[..]

[8] + [9] 如果地址有效,使用用户所定义的空间地址的数据填充EAX和ESI

第一个值(EAX)与0x55667788做异或(见[10]))然后与dword_125E8的0x85B8DA8F(见[12])做比较。

.data:000125E8 dword_125E8     dd 85B8DA8Fh  

第二个值(ESI)与0x11223344做异或(见[11])然后与dword_125EC的0x198E3FE(见[13])做比较。

.data:000125EC dword_125EC     dd 198E3FEh

如果均匹配,就会执行以下代码:

[..]
.text:00010F99    loc_10F99:
.text:00010F99      xor    edx, edx
.text:00010F9B      mov    eax, [ebp+v34_uc]
.text:00010F9E      mov    [eax], edx
.text:00010FA0      mov    [eax+4], edx
.text:00010FA3      lea    esi, [edi+4]    ; src
.text:00010FA6      mov    ecx, 21Ah       ; len
.text:00010FAB      mov    edi, [eax+18h]  ; dst
.text:00010FAE [14] rep movsd              ; memcpy
[..]

在[14]使用以下参数调用memcpy函数:

memcpy (EDI, ESI, ECX);

EDI (dst):该值从用户定义的内核空间地址获得
ESI (src):指向用户控制的IOCTL输入数据
ECX (len):0x21A

如果攻击者能够临时的在内核空间中用户定义的地址存储用户控制的数据,就可以绕过[5]处的检查,memcpy()调用会导致可利用的内存破坏。

<*来源:Tobias Klein
  
  链接:http://secunia.com/advisories/38677/
        http://marc.info/?l=bugtraq&m=126698563003303&q=p3
*>

建议:


厂商补丁:

ALWIL Software
————–
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:

http://forum.avast.com/index.php?topic=55484.0

发表评论?

0 条评论。

发表评论