BUGTRAQ ID: 30718
CNCAN ID:CNCAN-2008081802
VLC Media Player是一款流行的媒体播放程序。
VLC Media Player处理TTA文件存在缓冲区溢出错误,远程攻击者可以利用漏洞以应用程序权限执行任意指令。
问题存在于如下代码中:
\modules\demux\tta.c
#define TTA_FRAMETIME 1.04489795918367346939
.
.
.
int i_seektable_size = 0, i;
.
.
.
/* Read the metadata */
es_format_Init( &fmt, AUDIO_ES, VLC_FOURCC( 'T', 'T', 'A', '1' ) );
fmt.audio.i_channels = GetWLE( &p_header[6] );
fmt.audio.i_bitspersample = GetWLE( &p_header[8] );
[1] fmt.audio.i_rate = GetDWLE( &p_header[10] );
p_sys->i_datalength = GetDWLE( &p_header[14] );
p_sys->i_framelength = TTA_FRAMETIME * fmt.audio.i_rate;
[2] p_sys->i_totalframes = p_sys->i_datalength / p_sys->i_framelength +
((p_sys->i_datalength % p_sys->i_framelength) ? 1 : 0);
p_sys->i_currentframe = 0;
[3] i_seektable_size = sizeof(uint32_t)*p_sys->i_totalframes;
p_seektable = (uint8_t *)malloc( i_seektable_size );
stream_Read( p_demux->s, p_seektable, i_seektable_size );
p_sys->pi_seektable = (uint32_t *)malloc(i_seektable_size);
for( i = 0; i < p_sys->i_totalframes; i++ )
[4] p_sys->pi_seektable[i] = GetDWLE( &p_seektable[i*4] );
[1] - 这里可以设置i_rate为1
[2] - i_framelength = 1 (查询常数定义, 它为 ~1),
so i_totalframes = i_datalength
[3] - 因为可设置i_datalength为2^30并且因为i_totalframes = i_datalength, 乘法会溢出。
[4] - i_totalframes为正数(最高位没有设置), 因此循环可达2^30次, 覆盖堆中的所有数据。
VideoLAN VLC media player 0.8.6 i
目前没有解决方案提供:
<a href=http://www.videolan.org/ target=_blank>http://www.videolan.org/</a>
暂无评论