当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2013-025444

漏洞标题:Appserve SoundAir处理畸形mp3文件时拒绝服务漏洞

相关厂商:Appserve

漏洞作者: blast

提交时间:2013-06-08 13:38

修复时间:2013-09-06 13:38

公开时间:2013-09-06 13:38

漏洞类型:拒绝服务

危害等级:低

自评Rank:2

漏洞状态:未联系到厂商或者厂商积极忽略

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2013-06-08: 积极联系厂商并且等待厂商认领中,细节不对外公开
2013-09-06: 厂商已经主动忽略漏洞,细节向公众公开

简要描述:

Appserve SoundAir 处理畸形mp3文件时拒绝服务漏洞

详细说明:

可能有错误,我是这么理解的:mp3是按块来存放数据的,其中每块以“AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM”的形式来标记(每个字母代表1位),通常A=1,也就是说可以通过检测前11位为11111111 111XXXXX来确定mp3文件的块位置。
E 是 Bitrate index , F 是 SampleRate index , G 是Padding标识
而每块的长度可以通过 FrameLen = int((144 * BitRate / SampleRate ) + Padding); 确定。
通过增大最后一块的BitRate,减小SampleRate,但是不放置音频数据,就可能使得播放器分配内存时分配的数据的总大小小于FrameLen计算出来的大小,SoundAir就出现了这个问题。

006A64E6  3.  50            3push    eax                             ; úArg1
006A64E7 3. E8 342DEFFF 3call 00599220 ; àhlSound.00599220
006A64EC 3. 8BF0 3mov esi, eax ; 计算节长,esi=节长
006A64EE 3. 8D4C24 4C 3lea ecx, [local.11] ; local11给ecx
006A64F2 3. 51 3push ecx ; Arg2 =ecx (040dfc88)
006A64F3 3. 03F3 3add esi, ebx ; esi=节长+ebx (也就是FF帧的末尾)
006A64F5 3. 56 3push esi ; Arg1 = esi
006A64F6 3. E8 052CEFFF 3call 00599100 ; àhlSound.00599100
;eax= 节的长度
;ebx=节的起始位置
;esi=节的终止位置
;程序会比较节的终止位置1字节是否为0xff,但是如果节长度并不正确,就会导致读取时读出buffer之外,造成一次存取违例,程序崩溃。
;出错时:
;eax=00000481
;ebx=06aafe0e
;esi=06ab028f
;这儿ebx+eax=06ab028f,但是节到6AB0000就结束了(见证明)


Address   Hex dump          Command                                          Comments
00599100 ú$ 83EC 30 sub esp, 30 ; hlSound.00599100(guessed Arg1,Arg2)
00599103 3. 56 push esi
00599104 3. 8B7424 38 mov esi, dword ptr [arg.1]
00599108 3. 803E FF cmp byte ptr [esi], 0FF
;比较传入的第一个参数是否为0xff(MP3的帧标记)
0059910B 3. 74 07 je short 00599114
;相等则跳转,进入解析流程
0059910D 3. 33C0 xor eax, eax
0059910F 3. 5E pop esi
00599110 3. 83C4 30 add esp, 30
00599113 3. C3 retn ;返回 (return 0)
;-------

漏洞证明:

f3.jpg


f2.jpg


测试用例:
http://pan.baidu.com/share/link?shareid=1683742065&uk=1443095466
危害也没啥,因为程序会记录最后打开的目录,如果目录下面的文件不删掉,程序一打开就会崩溃。

修复方案:

读取某个地址前检查该地址是否存在

版权声明:转载请注明来源 blast@乌云


漏洞回应

厂商回应:

未能联系到厂商或者厂商积极拒绝