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 );...
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>