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]...
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>