fuzz模糊测试libexif详细解析
字数 1427 2025-08-29 08:30:06

libexif模糊测试详细解析

libexif介绍

libexif是一个用于解析、编辑和保存EXIF数据的C语言库。它支持EXIF 2.1标准以及2.2标准中的大多数标签。EXIF(Exchangeable Image File Format)是数码相机使用的元数据格式,包含拍摄参数、时间、GPS位置等信息。

漏洞介绍

CVE-2009-3895是libexif 0.6.18版本中的一个严重漏洞,位于libexif/exif-entry.c文件的exif_entry_fix函数(也称为标记修复例程)中。该漏洞是一个基于堆的缓冲区溢出漏洞,远程攻击者可以通过构造特殊的EXIF图像造成拒绝服务或可能执行任意代码。

环境搭建

libexif环境搭建

  1. 下载libexif 0.6.14源码:

    wget https://sourceforge.net/projects/libexif/files/libexif/0.6.14/libexif-0.6.14.tar.gz
    tar -xzvf libexif-0.6.14.tar.gz
    
  2. 安装依赖:

    sudo apt-get install autopoint libtool gettext libpopt-dev
    
  3. 编译安装:

    autoreconf -fvi  # 自动生成Makefile
    ./configure --prefix="路径" --disable-dls
    make
    make install
    

exif环境搭建

  1. 编译安装exif工具:

    autoreconf -fvi
    ./configure --prefix="/path/to/install" --disable-dls
    make
    make install
    
  2. 如果报错缺少popt,安装依赖:

    sudo apt-get install libpopt-dev
    

模糊测试过程

初始测试与问题发现

  1. 使用AFL++的afl-clang-lto重新编译libexif和exif工具
  2. 开始模糊测试,几分钟后发现程序崩溃
  3. 通过调试发现调用栈:exif_entry_fix -> exif_entry_realloc导致报错
  4. 进一步分析发现是realloc分配地址不正确导致的中止
  5. 发现使用的0.6.18版本存在问题,改用0.6.14版本重新测试

正确测试方法

  1. 使用0.6.14版本重新编译
  2. 模糊测试1小时后获得3个有效崩溃样本
  3. 建议使用正常编译的代码分析崩溃样本,避免插桩代码对分析造成干扰

漏洞分析

调用链二分析

崩溃路径:main -> exif_data_load_data -> exif_data_load_data_content -> memcpy

关键点:

  1. exif_data_alloc是自定义的堆分配函数
  2. 多次调用memcpy,最后一次在0x21位置出现一字节溢出
  3. 漏洞成因:缺少对size大小和堆大小的检测,导致缓冲区溢出

调用链一分析

崩溃路径:main -> exif_loader_get_data -> exif_data_load_data -> exif_get_sshort

关键点:

  1. 访问不存在地址buf
  2. offset值为0xffffffff
  3. 检查条件offset+6+2 < 0x7c3满足,导致buf加上0xffffffff访问非法地址
  4. 漏洞成因:缺少对offset的有效性检查

EXIF和IFD基础知识

  1. IFD(Image File Directory):图像文件目录,EXIF数据的组织结构
  2. EXIF标签:描述图像属性的键值对
  3. exif_ifd_from_string:将字符串转换为IFD类型的函数
  4. exif_data_load_data_content:从数据块中读取EXIF信息并按条目存储

修复建议

  1. 对于调用链一:

    • 添加对offset的有效性检查
    • 确保offset不为负值
  2. 对于调用链二:

    • 添加对size大小和堆大小的检测
    • 确保memcpy操作不会超出分配的内存范围

总结

通过模糊测试libexif库,发现了两个关键的漏洞路径:一个是由于缺少offset检查导致的非法内存访问,另一个是由于缺少边界检查导致的堆缓冲区溢出。这两个漏洞都可以通过精心构造的EXIF图像文件触发,可能导致拒绝服务或任意代码执行。修复方案主要是添加适当的边界检查和参数验证。

libexif模糊测试详细解析 libexif介绍 libexif是一个用于解析、编辑和保存EXIF数据的C语言库。它支持EXIF 2.1标准以及2.2标准中的大多数标签。EXIF(Exchangeable Image File Format)是数码相机使用的元数据格式,包含拍摄参数、时间、GPS位置等信息。 漏洞介绍 CVE-2009-3895是libexif 0.6.18版本中的一个严重漏洞,位于 libexif/exif-entry.c 文件的 exif_entry_fix 函数(也称为标记修复例程)中。该漏洞是一个基于堆的缓冲区溢出漏洞,远程攻击者可以通过构造特殊的EXIF图像造成拒绝服务或可能执行任意代码。 环境搭建 libexif环境搭建 下载libexif 0.6.14源码: 安装依赖: 编译安装: exif环境搭建 编译安装exif工具: 如果报错缺少popt,安装依赖: 模糊测试过程 初始测试与问题发现 使用AFL++的afl-clang-lto重新编译libexif和exif工具 开始模糊测试,几分钟后发现程序崩溃 通过调试发现调用栈: exif_entry_fix -> exif_entry_realloc 导致报错 进一步分析发现是realloc分配地址不正确导致的中止 发现使用的0.6.18版本存在问题,改用0.6.14版本重新测试 正确测试方法 使用0.6.14版本重新编译 模糊测试1小时后获得3个有效崩溃样本 建议使用正常编译的代码分析崩溃样本,避免插桩代码对分析造成干扰 漏洞分析 调用链二分析 崩溃路径: main -> exif_data_load_data -> exif_data_load_data_content -> memcpy 关键点: exif_data_alloc 是自定义的堆分配函数 多次调用memcpy,最后一次在0x21位置出现一字节溢出 漏洞成因:缺少对size大小和堆大小的检测,导致缓冲区溢出 调用链一分析 崩溃路径: main -> exif_loader_get_data -> exif_data_load_data -> exif_get_sshort 关键点: 访问不存在地址buf offset值为0xffffffff 检查条件 offset+6+2 < 0x7c3 满足,导致buf加上0xffffffff访问非法地址 漏洞成因:缺少对offset的有效性检查 EXIF和IFD基础知识 IFD(Image File Directory):图像文件目录,EXIF数据的组织结构 EXIF标签:描述图像属性的键值对 exif_ifd_from_string :将字符串转换为IFD类型的函数 exif_data_load_data_content :从数据块中读取EXIF信息并按条目存储 修复建议 对于调用链一: 添加对offset的有效性检查 确保offset不为负值 对于调用链二: 添加对size大小和堆大小的检测 确保memcpy操作不会超出分配的内存范围 总结 通过模糊测试libexif库,发现了两个关键的漏洞路径:一个是由于缺少offset检查导致的非法内存访问,另一个是由于缺少边界检查导致的堆缓冲区溢出。这两个漏洞都可以通过精心构造的EXIF图像文件触发,可能导致拒绝服务或任意代码执行。修复方案主要是添加适当的边界检查和参数验证。