漏洞起因
异常条件处理失败错误
危险等级
低
影响系统
Microsoft Windows XP Professional SP3
Microsoft Windows XP Professional SP2
Microsoft Windows XP Home SP3
Microsoft Windows XP Home SP2
不受影响系统
危害
远程攻击者可以利用漏洞使应用程序崩溃。
攻击所需条件
攻击者必须构建恶意音频文件,诱使用户解析。
漏洞信息
Microsoft Windows是一款流行的操作系统。
Microsoft MPEG负责解析3层MPEG音频流的代码处理AVI文件存在漏洞。在l3codeca.acm DriverProc (sub_3D522940)函数负责选择用于解析各种AVI文件的ture函数,此函数接收5个参数,由于第三个参数是函数,它会调用用于编码AVI的true函数,如果第三个函数为0x604E,就会调用sub_3D522940:
.text:3D522C60 mov eax, [esp+uMsg]
.text:3D522C64 cmp eax, 600Ah
.text:3D522C69 ja loc_3D522CF0
.text:3D522C6F jz short loc_3D522CDE
.text:3D522C71 lea ecx, [eax-1] ; switch 10 cases
.text:3D522C74 cmp ecx, 9
.text:3D522C77 ja loc_3D522DA8 ; default
.text:3D522C77 ; jumptable 3D522C7D cases 2,5
.text:3D522C77 ; jumptable 3D522D07 cases 1-13,17-64
.text:3D522C7D jmp ds:off_3D522DD8[ecx*4] ; switch jump
.text:3D522C84
.text:3D522C84 loc_3D522C84: ; DATA XREF: .text:off_3D522DD8o
.text:3D522C84 mov eax, 1 ; jumptable 3D522C7D cases 1,6
.text:3D522C89 retn 14h
.text:3D522C8C ; —————————————————————————
.text:3D522C8C
.text:3D522C8C loc_3D522C8C: ; CODE XREF: DriverProc+1Dj
.text:3D522C8C ; DATA XREF: .text:off_3D522DD8o
.text:3D522C8C mov eax, [esp+lParam2] ; jumptable 3D522C7D case 3
.text:3D522C90 mov ecx, [esp+hDriver]
.text:3D522C94 push eax ; int
.text:3D522C95 push ecx ; hDriver
.text:3D522C96 call sub_3D521D00
.text:3D522C9B retn 14h
.text:3D522C9E ; —————————————————————————
…
.text:3D522D84
.text:3D522D84 loc_3D522D84: ; CODE XREF: DriverProc+A7j
.text:3D522D84 ; DATA XREF: .text:off_3D522E00o
.text:3D522D84 mov edx, [esp+lParam2] ; jumptable 3D522D07 case 67
.text:3D522D88 mov eax, [esp+hWndParent]
.text:3D522D8C push edx
.text:3D522D8D push eax
.text:3D522D8E call sub_3D522940
.text:3D522D93 retn 14h
sub_3D522940负责解析MPEGLAYER3WAVEFORMAT (在AVI中为strf),如果WAVEFORMATEX结构中的wFormatTag值(MPEGLAYER3WAVEFORMAT结构的子集)等于0x0055,表示音频流为MP3类型:
.text:3D522A9F mov [ebp+0Ch], ecx
.text:3D522AA2 cmp word ptr [edi], 55h
.text:3D522AA6 jnz loc_3D522B2C
如果流类型为MP3,就会为WAVEFORMATEX结构字段进行一些计算,先读取nSamplesPerSec的值,然后由于此字段值为变量会给定1152(0×480)或576 (0×240):
10 .text:3D522AAC mov ecx, [edi+4] ; nSamplesPerSec
.text:3D522AAF xor edx, edx
.text:3D522AB1 mov eax, ecx
.text:3D522AB3 div dword ptr [esi+4]
.text:3D522AB6 mov edx, 5DC0h
.text:3D522ABB cmp edx, ecx
.text:3D522ABD sbb ebx, ebx
.text:3D522ABF xor edx, edx
.text:3D522AC1 and ebx, 240h
.text:3D522AC7 add ebx, 240h
在把WAVEFORMATEX结构的nAvgBytesPerSec位与0×480或0×240相乘后,nSamplesPerSec字段的值会与得出的结果相除。
.text:3D522AD1 mov eax, [edi+8] ; nAvgBytesPerSec
.text:3D522AD4 imul eax, ebx
.text:3D522AD7 div ecx
问题就在这里,因为没有对这些字段进行控制。进一步反汇编可以看到WAVEFORMATEX结构的nBlockAlign值会除以之前除后的结果,如果之前相除值为0,那么就会触发除零错误:
.text:3D522AD9 mov edi, [ebp+8] ; nBlockAlign
.text:3D522ADC xor edx, edx
.text:3D522ADE mov ecx, eax
.text:3D522AE0 mov eax, edi
.text:3D522AE2 div ecx crash point
测试方法
http://www.exploit-db.com/exploits/15096/
厂商解决方案
目前没有详细解决方案提供:
http://www.microsoft.com/
漏洞提供者
Abysssec
0 条评论。