BUGTRAQ  ID: 32822
MPlayer是一款基于Linux的媒体播放程序,支持多种媒体格式。
MPlayer的libmpdemux/demux_vqf.c文件中的demux_open_vqf()函数在处理特制的TwinVQ文件时存在栈溢出漏洞。以下是libmpdemux\demux_vqf.c文件中的有漏洞代码段:
[...]
24 static demuxer_t* demux_open_vqf(demuxer_t* demuxer) {
...
49       char chunk_id[4];
50       unsigned chunk_size;
51 [1]   hi->size=chunk_size=stream_read_dword(s); /* include itself */
52       stream_read(s,chunk_id,4);
53       if(*((uint32_t *)&chunk_id[0])==mmioFOURCC('C','O','M','M'))
54       {
55 [2]     char buf[chunk_size-8];
56         unsigned i,subchunk_size;
57 [3]     if(stream_read(s,buf,chunk_size-8)!=chunk_size-8) return NULL;
...
86         i+=subchunk_size+4;
87         while(i<chunk_size-8)
88         {
89           unsigned slen,sid;
90 [4]       char sdata[chunk_size];
91           sid=*((uint32_t *)&buf[i]); i+=4;
92 [5]       slen=be2me_32(*((uint32_t *)&buf[i])); i+=4;
93           if(sid==mmioFOURCC('D','S','I','Z'))
94           {
95            hi->Dsiz=be2me_32(*((uint32_t *)&buf[i]));
96            continue; /* describes the same info as size of DATA chunk */
97           }
98 [6]       memcpy(sdata,&buf[i],slen); sdata[slen]=0; i+=slen;
[...]
[1] 从媒体文件获得的用户控制数据填充无符int变量chunk_size。
[2] 使用chunk_size值计算栈缓冲区buf的长度。
[3] 用户控制数据填充buf。
[4] 再次将chunk_size值用作另一个栈缓冲区sdata的长度标识符。
[5] 用户控制值填充无符型int变量slen。
[6] memcpy()函数将slen字节的用户控制数据从buf拷贝到栈缓冲区sdata。由于slen、源数据及目标缓冲区sdata的大小都是受控的,这可能导致可利用的栈溢出。
MPlayer 1.x
 MPlayer
-------
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:
<a href=http://svn.mplayerhq.hu/mplayer?view=rev&revision=28150 target=_blank>http://svn.mplayerhq.hu/mplayer?view=rev&revision=28150</a>
<a href=http://svn.mplayerhq.hu/mplayer?view=rev&revision=28149 target=_blank>http://svn.mplayerhq.hu/mplayer?view=rev&revision=28149</a>
                       
                       
        
          
暂无评论