CVE-2017-9128复现与分析
字数 1026 2025-08-25 22:58:34

CVE-2017-9128漏洞分析与复现指南

漏洞概述

CVE-2017-9128是libquicktime 1.2.4中的一个堆缓冲区溢出漏洞。该漏洞存在于quicktime_video_width函数中,位于lqt_quicktime.c文件中。攻击者可以通过精心构造的MP4文件导致堆缓冲区越界读取,最终导致应用程序崩溃,实现拒绝服务攻击。

漏洞细节

漏洞函数分析

漏洞函数原型:

int quicktime_video_width(quicktime_t *file, int track)
{
    if((track < 0) || (track >= file->total_vtracks))
        return 0;
    return file->vtracks[track].track->mdia.minf.stbl.stsd.table->width;
}

漏洞触发路径

  1. 访问file->vtracks[track].track->mdia.minf.stbl.stsd.table->width
  2. 结构体指针table未被正确初始化
  3. 导致访问[rax+0x30]时越界读取(堆块大小只有0x20)

调用栈回溯

#0 quicktime_video_width
#1 quicktime_init_maps
#2 quicktime_read_info
#3 do_open
#4 quicktime_open
#5 qt_init
#6 main

环境准备

所需工具

  1. libquicktime 1.2.4源码
  2. POC文件:libquicktime_1.2.4_quicktime_video_width_heap-buffer-overflow.mp4
  3. 调试工具:GDB
  4. 地址消毒剂(AddressSanitizer)

编译安装步骤

  1. 下载libquicktime-1.2.4源码
  2. 配置编译环境:
    ./configure
    make
    make install
    
  3. 如果缺少lqtplay工具,需要安装相关库:
    sudo apt-get install apt-file
    sudo apt-file update
    apt-file search <缺失的头文件>
    

漏洞复现

复现步骤

  1. 使用GDB调试:

    gdb lqtplay
    r libquicktime_1.2.4_quicktime_video_width_heap-buffer-overflow.mp4
    
  2. 设置断点:

    break quicktime_video_width
    
  3. 单步执行观察内存访问异常

预期结果

将看到类似以下ASAN报错:

==10979==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000009d00
READ of size 4 at 0x602000009d00 thread T0
    #0 quicktime_video_width /src/lqt_quicktime.c:998
    #1 quicktime_init_maps /src/lqt_quicktime.c:1633
    ...

漏洞分析

根本原因

  1. 文件解析流程中,当检测到非AVI格式文件时:

    if(!got_avi)
        file->file_type = LQT_FILE_NONE;
    
  2. 导致无法进入AVI处理分支:

    if(file->file_type == LQT_FILE_AVI) {
        quicktime_read_riff(file, &leaf_atom);
        quicktime_import_avi(file); // 此函数包含table初始化代码
    }
    
  3. quicktime_import_avi函数未被调用,导致table指针未被初始化

数据结构链

访问路径涉及的数据结构链:

quicktime_s → vtracks[] → quicktime_video_map_t → track → quicktime_trak_t → mdia → quicktime_mdia_t → minf → quicktime_minf_t → stbl → quicktime_stbl_t → stsd → quicktime_stsd_t → table → quicktime_stsd_table_t → width

POC分析

使用010 Editor分析POC文件,可以看到包含以下box结构:

  • ftype
  • mdat
  • movv

但缺少AVI格式的box,导致无法进入正确的解析路径。

修复建议

  1. 在访问table->width前应检查table指针是否已初始化
  2. 添加对非AVI文件的正确处理逻辑
  3. 更新到修复后的libquicktime版本

参考资料

  1. POC下载:https://github.com/offensive-security/exploitdb-bin-sploits/raw/master/bin-sploits/42148.zip
  2. CVE详情:CVE-2017-9128
  3. libquicktime源码:libquicktime-1.2.4
CVE-2017-9128漏洞分析与复现指南 漏洞概述 CVE-2017-9128是libquicktime 1.2.4中的一个堆缓冲区溢出漏洞。该漏洞存在于 quicktime_video_width 函数中,位于 lqt_quicktime.c 文件中。攻击者可以通过精心构造的MP4文件导致堆缓冲区越界读取,最终导致应用程序崩溃,实现拒绝服务攻击。 漏洞细节 漏洞函数分析 漏洞函数原型: 漏洞触发路径 访问 file->vtracks[track].track->mdia.minf.stbl.stsd.table->width 时 结构体指针 table 未被正确初始化 导致访问 [rax+0x30] 时越界读取(堆块大小只有0x20) 调用栈回溯 环境准备 所需工具 libquicktime 1.2.4源码 POC文件: libquicktime_1.2.4_quicktime_video_width_heap-buffer-overflow.mp4 调试工具:GDB 地址消毒剂(AddressSanitizer) 编译安装步骤 下载libquicktime-1.2.4源码 配置编译环境: 如果缺少 lqtplay 工具,需要安装相关库: 漏洞复现 复现步骤 使用GDB调试: 设置断点: 单步执行观察内存访问异常 预期结果 将看到类似以下ASAN报错: 漏洞分析 根本原因 文件解析流程中,当检测到非AVI格式文件时: 导致无法进入AVI处理分支: quicktime_import_avi 函数未被调用,导致 table 指针未被初始化 数据结构链 访问路径涉及的数据结构链: POC分析 使用010 Editor分析POC文件,可以看到包含以下box结构: ftype mdat movv 但缺少AVI格式的box,导致无法进入正确的解析路径。 修复建议 在访问 table->width 前应检查 table 指针是否已初始化 添加对非AVI文件的正确处理逻辑 更新到修复后的libquicktime版本 参考资料 POC下载:https://github.com/offensive-security/exploitdb-bin-sploits/raw/master/bin-sploits/42148.zip CVE详情:CVE-2017-9128 libquicktime源码:libquicktime-1.2.4