安全研究
安全漏洞
MPlayer demux_mov.c任意指针引用漏洞
发布日期:2008-01-31
更新日期:2008-02-06
受影响系统:
MPlayer MPlayer 1.0 rc2描述:
BUGTRAQ ID: 27499
CVE(CAN) ID: CVE-2008-0485
MPlayer是一款基于Linux的媒体播放程序,支持多种媒体格式。
MPlayer的libmpdemux/demux_mov.c文件在解析MOV文件头时存在数组索引错误。在mov_demux.c文件的1768行,未经任何检查变直接从文件读取了数据填充了chunkmap结构的数组,然后在mov_build_index()函数(150行),使用了trak->chunkmap[i].first字段用作了chunks堆数组的索引,这就允许攻击者在某些内存位置写入sdid和spc值,造成堆指针破坏。如果覆盖了函数指针或关键数据的话,这可能允许攻击者执行代码。
此外,攻击者还可以欺骗解析器,导致没有为trak->chunks所指向的数组分配内存,在1301行初始化为0,这样攻击者就可以绕过限制写入任意内存地址。出现这种情况是由于用于写操作的结构是如下方式声明的:
/-----------
typedef struct {
unsigned int sample; // number of the first sample in the chunk
unsigned int size; // number of samples in the chunk
int desc; // for multiple codecs mode - not used
off_t pos;
} mov_chunk_t;
- -----------/
因此,desc和size为受控字段,就可以在i*sizeof(chunk_t)+4和i*sizeof(chunk_t)+8内存地址写入任意i值(177和178行)。
/-----------
1755 case MOV_FOURCC('s','t','s','c'): {
1756 int temp = stream_read_dword(demuxer->stream);
1757 int len = stream_read_dword(demuxer->stream);
1758 int ver = (temp << 24);
1759 int flags = (temp << 16) | (temp << 8) | temp;
1760 int i;
1761 mp_msg(MSGT_DEMUX, MSGL_V,
1762 "MOV: %*sSample->Chunk mapping table! (%d blocks)
(ver:%d,flags:%d)\n", level, "",
1763 len, ver, flags);
1764 // read data:
1765 trak->chunkmap_size = len;
1766 trak->chunkmap = calloc(len, sizeof(mov_chunkmap_t));
1767 for (i = 0; i < len; i++) {
1768 trak->chunkmap[i].first = stream_read_dword(demuxer->stream) - 1;
1769 trak->chunkmap[i].spc = stream_read_dword(demuxer->stream);
1770 trak->chunkmap[i].sdid = stream_read_dword(demuxer->stream);
1771 }
1772 break;
1773 }
150 void mov_build_index(mov_track_t* trak,int timescale){
151 int i,j,s;
152 int last=trak->chunks_size;
153 unsigned int pts=0;
154
169 mp_msg(MSGT_DEMUX, MSGL_V, "MOV track #%d: %d chunks, %d
samples\n",trak->id,trak->chunks_size,trak->samples_size);
170 mp_msg(MSGT_DEMUX, MSGL_V, "pts=%d scale=%d
time=%5.3f\n",trak->length,trak->timescale,(float)trak->length/(float)trak->timescale);
171
172 // process chunkmap:
173 i=trak->chunkmap_size;
174 while(i>0){
175 --i;
176 for(j=trak->chunkmap[i].first;j<last;j++){
177 trak->chunks[j].desc=trak->chunkmap[i].sdid;
178 trak->chunks[j].size=trak->chunkmap[i].spc;
179 }
180 last=trak->chunkmap[i].first;
181 }
- -----------/
攻击者可以通过构建包含有特制stsc原子的媒体文件导致在特定的内存地址写入任意值,从而执行任意代码。
<*来源:Felipe Manzano
Anibal Sacco
链接:http://marc.info/?l=bugtraq&m=120215812711142&w=2
http://secunia.com/advisories/28779/
http://www.mplayerhq.hu/design7/news.html
http://security.gentoo.org/glsa/glsa-200803-16.xml
*>
测试方法:
警 告
以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!
建议:
厂商补丁:
Gentoo
------
Gentoo已经为此发布了一个安全公告(GLSA-200803-16)以及相应补丁:
GLSA-200803-16:MPlayer: Multiple buffer overflows
链接:http://security.gentoo.org/glsa/glsa-200803-16.xml
所有MPlayer用户都应升级到最新版本:
# emerge --sync
# emerge --ask --oneshot --verbose ">=media-video/mplayer-1.0_rc2_p25993"
MPlayer
-------
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:
http://www.mplayerhq.hu/MPlayer/patches/url_fix_20080120.diff
http://www.mplayerhq.hu/MPlayer/patches/demux_mov_fix_20080129.diff
http://www.mplayerhq.hu/MPlayer/patches/demux_audio_fix_20080129.diff
浏览次数:2847
严重程度:0(网友投票)
绿盟科技给您安全的保障
