CVE-2025-43300 是一个在处理 DNG(数字负片)文件时发生的缓冲区溢出漏洞,原因在于 TIFF 元数据与 JPEG 数据之间的不一致,可导致远程代码执行(RCE)。
DNG 文件
├── TIFF 容器(元数据)
│ ├── 文件头
│ ├── IFD(图像文件目录)
│ │ ├── 标签 277:SamplesPerPixel(声明组件数量)
│ │ ├── 标签 513:JpegOffset(JPEG 起始位置)
│ │ └── 标签 514:JpegLength(JPEG 长度)
│ └── 其他元数据
└── JPEG 数据(实际图像数据)
├── SOI(图像起始)
├── SOF0(帧头)
│ └── 组件数:实际组件数量
└── 压缩数据
// 根本问题:
TIFF 声明:"本图像有 2 个组件" (SamplesPerPixel = 2)
JPEG 内容:"实际上我有 3 个组件" (SOF0 Components = 3)
// 易受攻击的代码(简化版)
int samples = read_tiff_tag(277); // 读取为 2
buffer = malloc(samples * sizeof(component)); // 为 2 分配空间
// 但实际按 JPEG 处理
int components = read_jpeg_sof0(); // 读取为 3
for (int i = 0; i < components; i++) { // 循环 3 次!
buffer[i] = process_component(i); // i=2 时溢出!
}
[1] 打开文件
↓
[2] TIFF 解析器
├─→ 读取 TIFF 文件头
├─→ 定位 IFD
├─→ 读取标签 277(SamplesPerPixel = 2)
└─→ 为 2 个组件分配缓冲区
[3] 定位 JPEG
├─→ 读取标签 513(JPEG 偏移量)
└─→ 跳转到文件中的位置
[4] JPEG 解析器
├─→ 读取 SOF0 标记(0xFFC0)
├─→ 提取组件数量(3)
└─→ 未与 TIFF 进行校验!
[5] 处理过程
├─→ 循环处理 3 个组件
├─→ 缓冲区只有 2 个空间
└─→ 第 3 个组件写入缓冲区之外
[6] 缓冲区溢出
├─→ 覆盖相邻数据
├─→ 可能覆盖返回地址
└─→ 可实现执行流控制
[7] 代码执行
└─→ 攻击者控制程序执行流
栈布局:
+----------------+ ← 栈顶
| 缓冲区 (2 组件)| [组件 0]
| | [组件 1]
+----------------+
| 局部数据 |
+----------------+
| 帧指针 |
+----------------+
| 返回地址 | ← 返回地址
+----------------+
栈布局:
+----------------+
| 缓冲区 (2 组件)| [组件 0]
| | [组件 1]
+----------------+
| 局部数据 | [组件 2] ← 溢出!
+----------------+
| 帧指针 | [被覆盖]
+----------------+
| 返回地址 | [被攻击者控制]
+----------------+