一、背景介绍
LibTIFF 是一个用来读写标签图像文件格式(简写为TIFF)的库。这个库还包含一些命令行工具用来处理TIFF文件。它以源代码方式分发,并且可以在多种平台上以二进制构建的方式出现。LibTIFF软件由Sam Leffler在Silicon Graphics工作期间编写。
1.1 漏洞描述
在LibTIFF4.0.10版本中,tiffcrop工具的invertImage()函数没有正确处理色彩深度为2和4的情况,导致堆缓冲区溢出。
1.2 受影响的系统版本
LibTIFF4.0.10
二、环境搭建
1.下载源码
https://download.osgeo.org/libtiff/tiff-4.0.10.zip
2.按默认选项编译
三、漏洞分析
tiff-4.0.10/tools/tiffcrop.c文件中,invertImage()函数的代码有几个问题,该函数用于反转bilevel或grayscale类型TIFF图像的明暗值。在第9206行,可以看到一个switch语句用于处理各种色彩深度的情况。
但注意在case 2语句中,由于某些未知原因,在处理bps值2和4的情况时,反转比特位的方法和32,16,8和1不同。这里循环迭代处理4个像素,同时还进行了宽度迭代,最后在移位操作时导致了堆缓冲区溢出。
所以在这里,将所有位反转使用255-x =~x这样的方法更容易,下面是修复方案。
四、漏洞利用
使用libtiff中的tiffcrop工具反转图像色彩空间,导致DoS:
tiffcrop -I data poc.tiff out.tiff