CVE:CVE-2009-1274
CNNVD:CNNVD-200904-184
xine是一款免费的媒体播放器，支持多种格式。
Xine-lib在解析Quicktime电影文件的畸形STTS原子时存在整数溢出漏洞，本地或远程攻击者可以利用这个漏洞以使用xine库应用程序的权限执行任意代码。以下是/src/demuxers/demux_qt.c中的有漏洞代码段： [...] 840 static qt_error parse_trak_atom (qt_trak *trak, 
841 unsigned char *trak_atom) { ... 1535 } 
else if (current_atom == STTS_ATOM) { 1536 1537 /* there should only be one of these atoms */ 1538 
xine是一款免费的媒体播放器，支持多种格式。
Xine-lib在解析Quicktime电影文件的畸形STTS原子时存在整数溢出漏洞，本地或远程攻击者可以利用这个漏洞以使用xine库应用程序的权限执行任意代码。以下是/src/demuxers/demux_qt.c中的有漏洞代码段：
[...]
 840 static qt_error parse_trak_atom (qt_trak *trak,
 841                 unsigned char *trak_atom) {
 ...
1535    } else if (current_atom == STTS_ATOM) {
1536
1537      /* there should only be one of these atoms */
1538      if (trak->time_to_sample_table) {
1539        last_error = QT_HEADER_TROUBLE;
1540        goto free_trak;
1541      }
1542
1543 [1]  trak->time_to_sample_count = _X_BE_32(&trak_atom[i + 8]);
1544
1545      debug_atom_load("     qt stts atom (time-to-sample atom): %d 
            entries\n" ,
1546        trak->time_to_sample_count);
1547
1548 [2]  trak->time_to_sample_table = (time_to_sample_table_t *)calloc(
1549        trak->time_to_sample_count+1, sizeof(time_to_sample_table_t));
1550      if (!trak->time_to_sample_table) {
1551        last_error = QT_NO_MEMORY;
1552        goto free_trak;
1553      }
1554
1555      /* load the time to sample table */
1556 [3]  for (j = 0; j < trak->time_to_sample_count; j++) {
1557 [4]    trak->time_to_sample_table[j].count =
1558          _X_BE_32(&trak_atom[i + 12 + j * 8 + 0]);
1559 [5]    trak->time_to_sample_table[j].duration =
1560          _X_BE_32(&trak_atom[i + 12 + j * 8 + 4]);
1561        debug_atom_load("       %d: count = %d, duration = %d\n" ,
1562          j, trak->time_to_sample_table[j].count,1563          trak->time_to_sample_table[j].duration);
1564      }
1565      trak->time_to_sample_table[j].count = 0; /* terminate with zero*/
1566    }
1567  }
[...]
[1] 使用媒体文件中的用户提供数据填充无符型int变量trak->time_to_sample_count。
[2] 在1548行和1549行，由于通过trak->time_to_sample_count+1计算出calloc()的第一个参数，因此可能出现整数溢出。用户提供的trak->time_to_sample_count值UINT_MAX(0xffffffff)会触发整数溢出，因此仅分配0字节缓冲区。
[3] 将trak->time_to_sample_count值用作了这个for()循环的计数器。 
[4] 将quicktime电影文件中的用户控制数据拷贝到了之前分配的堆缓冲区(见[2])。由于将j用作了数组索引，for()循环会一直执行到 j < trak->time_to_sample_count，因此可以用用户控制数据覆盖堆缓冲区。
[5] 同[4]
solution:Upgrade xine xine-lib to a higher version than 1.1.0,1.1.1,1.1.10,1.1.10.1,1.1.11,1.1.11.1,1.1.12,1.1.13,1.1.14,1.1.15,1.1.16.1,1.1.16.2,and avoid the version 1.1.0,1.1.1,1.1.10,1.1.10.1,1.1.11,1.1.11.1,1.1.12,1.1.13,1.1.14,1.1.15,1.1.16.1,1.1.16.2