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环境搭建
-
下载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 -
安装依赖:
sudo apt-get install autopoint libtool gettext libpopt-dev -
编译安装:
autoreconf -fvi # 自动生成Makefile ./configure --prefix="路径" --disable-dls make make install
exif环境搭建
-
编译安装exif工具:
autoreconf -fvi ./configure --prefix="/path/to/install" --disable-dls make make install -
如果报错缺少popt,安装依赖:
sudo apt-get install libpopt-dev
模糊测试过程
初始测试与问题发现
- 使用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图像文件触发,可能导致拒绝服务或任意代码执行。修复方案主要是添加适当的边界检查和参数验证。