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]...
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]