FFmpeg是FFmpeg团队的一套可录制、转换以及流化音视频的完整解决方案。 Fmpeg在解析畸形的4X电影文件时存在类型转换漏洞,以下是libavformat/4xm.c文件中的有漏洞代码段: [..] 93 static int fourxm_read_header(AVFormatContext *s, 94 AVFormatParameters *ap) 95 { .. 103 [8] int current_track = -1; .. 106 [9] fourxm->track_count = 0; 107 [10] fourxm->tracks = NULL; .. 160 } else if (fourcc_tag == strk_TAG) { 161 /* check that there is enough data */ 162 if (size != strk_SIZE) { 163 av_free(header); 164 return AVERROR_INVALIDDATA; 165 } 166 [1] current_track = AV_RL32(&header[i + 8]); 167 [2] if (current_track + 1 > fourxm->track_count) { 168 fourxm->track_count = current_track + 1; 169 if((unsigned)fourxm->track_count >= UINT_MAX / sizeof(AudioTrack)) 170 return -1; 171 [3] fourxm->tracks = av_realloc(fourxm->tracks, 172 fourxm->track_count * sizeof(AudioTrack)); 173 if (!fourxm->tracks) { 174 av_free(header); 175 return AVERROR(ENOMEM); 176 } 177 } 178 [4] fourxm->tracks[current_track].adpcm = AV_RL32(&header[i + 12]); 179 [5]...
FFmpeg是FFmpeg团队的一套可录制、转换以及流化音视频的完整解决方案。 Fmpeg在解析畸形的4X电影文件时存在类型转换漏洞,以下是libavformat/4xm.c文件中的有漏洞代码段: [..] 93 static int fourxm_read_header(AVFormatContext *s, 94 AVFormatParameters *ap) 95 { .. 103 [8] int current_track = -1; .. 106 [9] fourxm->track_count = 0; 107 [10] fourxm->tracks = NULL; .. 160 } else if (fourcc_tag == strk_TAG) { 161 /* check that there is enough data */ 162 if (size != strk_SIZE) { 163 av_free(header); 164 return AVERROR_INVALIDDATA; 165 } 166 [1] current_track = AV_RL32(&header[i + 8]); 167 [2] if (current_track + 1 > fourxm->track_count) { 168 fourxm->track_count = current_track + 1; 169 if((unsigned)fourxm->track_count >= UINT_MAX / sizeof(AudioTrack)) 170 return -1; 171 [3] fourxm->tracks = av_realloc(fourxm->tracks, 172 fourxm->track_count * sizeof(AudioTrack)); 173 if (!fourxm->tracks) { 174 av_free(header); 175 return AVERROR(ENOMEM); 176 } 177 } 178 [4] fourxm->tracks[current_track].adpcm = AV_RL32(&header[i + 12]); 179 [5] fourxm->tracks[current_track].channels = AV_RL32(&header[i + 36]); 180 [6] fourxm->tracks[current_track].sample_rate = AV_RL32(&header[i+40]); 181 [7] fourxm->tracks[current_track].bits = AV_RL32(&header[i + 44]); [..] [1] 使用来自媒体文件的用户提供数据填充有符型int变量current_track(见[8]) 这个语句检查current_track值是否大于fourxm->track_count。用0初始化了fourxm->track_count变量(见[9]),对current_track提供大于等于0x80000000的值就会导致current_track为负数。如果current_track为负数,if语句总会返回false,无法到达[3]处的缓冲区分配。 [4] 由于用NULL初始化了fourxm->tracks(见[10])且无法到达171行,这导致可利用的空指针引用。可以向NULL + current_track内存位置写入4个字节的用户控制数据。由于current_track值也是用户可控的,还可以向很大的内存地址范围写入4字节的任意数据。 [5] 同[4] [6] 同[4] [7] 同[4]