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>
暂无评论