CVE-2025-43300:iOS/macOS DNG 图像处理内存损坏
概述
CVE-2025-43300 是 Apple 图像处理框架中的一个严重内存损坏漏洞,影响 iOS 18.6.1 及 macOS 系统。该漏洞存在于 RawCamera.bundle 内的 JPEG 无损解压缩代码中,由 DNG 文件中 TIFF 元数据与 JPEG 流参数不一致触发。
漏洞详情
根本原因
漏洞源于 DNG(Digital Negative)文件中的元数据/流不一致:
- SamplesPerPixel 元数据(TIFF 头中)指示预期的颜色分量数
- SOF3 分量数(JPEG 无损流中)指定实际的数据分量数
- 当这两个值不同时,分配与处理出现错位
内存损坏流程
1. 解析器从 TIFF 元数据读取 SamplesPerPixel(例如 2 个分量)
2. 系统分配缓冲区:宽度 × 高度 × 2 个分量
3. JPEG 解码器读取 SOF3 分量数(例如 1 个分量)
4. 解码器基于不一致的假设写入数据
5. 写入的数据多于分配的空间,发生缓冲区溢出
攻击向量
- 零点击漏洞:无需用户交互
- 自动处理:通过查看、导入或接收 DNG 文件触发
- 跨平台影响:影响 iOS 和 macOS 系统
- 内存损坏:可导致应用程序崩溃或潜在代码执行
工具概述
本仓库包含两个 Python 工具,用于分析和复现 CVE-2025-43300:
1. DNG 漏洞分析器(dng_vulnerability_analyzer.py)
目的:分析 DNG 文件结构以识别漏洞条件
主要特性:
- 解析 TIFF/DNG 文件结构,包括 IFD 和 SubIFD
- 定位 SamplesPerPixel 元数据标签
- 识别 JPEG 无损 SOF3 标记及分量数
- 检测元数据/流不一致
- 报告用于修改的精确字节偏移
用法:
python3 dng_vulnerability_analyzer.py <dng_file>
输出:
- 文件结构分析
- 元数据标签位置及值
- JPEG 流分量信息
- 漏洞评估
- 用于构造 PoC 的具体偏移量
2. 安全十六进制修改器(hex_modifier.py)
目的:通过安全地修改特定字节来创建概念验证文件
主要特性:
- 在修改前验证期望的字节值
- 创建 SHA256 哈希以追踪文件
- 生成二进制差异报告
- 实现安全检查以防意外损坏
- 支持手动和自动 PoC 创建
用法:
# 使用已知的脆弱偏移创建 PoC
python3 hex_modifier.py create-poc <input.dng>
# 手动修改字节
python3 hex_modifier.py modify <input.dng> <offset> <old_byte> <new_byte> <output.dng>
# 生成差异报告
python3 hex_modifier.py diff <original.dng> <modified.dng>
PoC 创建过程
步骤 1:分析目标文件
python3 dng_vulnerability_analyzer.py IMGP0847.DNG
这将识别:
- SamplesPerPixel 元数据位置
- JPEG SOF3 分量数位置
- 当前值及建议修改
步骤 2:创建脆弱样本
PoC 需要两个特定的字节修改:
- 增加 SamplesPerPixel 元数据(通常从 1 改为 2)
- 减少 SOF3 分量数(通常从 2 改为 1)
python3 hex_modifier.py create-poc IMGP0847.DNG
步骤 3:验证 PoC
python3 dng_vulnerability_analyzer.py vuln_poc_IMGP0847.dng
确认不一致存在且漏洞被触发。
PoC 为何有效
技术机制
-
分配阶段:
- 图像解析器读取 SamplesPerPixel = 2
- 为 2 个分量像素数据分配缓冲区
- 缓冲区大小 = image_width × image_height × 2
-
处理阶段:
- JPEG 无损解码器遇到 SOF3 且只有 1 个分量
- 解析逻辑对实际与预期数据大小产生混淆
- 尝试基于不一致的假设写入数据
-
内存损坏:
- 向缓冲区写入的数据多于最初分配的量
- 缓冲区溢出破坏相邻内存区域
- 导致应用程序崩溃或潜在代码执行
文件格式细节
DNG 文件采用 TIFF 容器格式,内嵌 JPEG 无损流:
- TIFF 元数据描述图像属性及颜色信息
- JPEG 流包含压缩的像素数据
- 信任关系存在于元数据与流内容之间
- 验证缺口允许不一致的值进入处理代码
影响评估
严重性:严重
- CVSS 评分:高(零点击、内存损坏、影响广泛)
- 受影响系统:iOS 18.6.1、具有类似图像处理功能的 macOS 系统
- 攻击向量:网络/本地文件传输
- 用户交互:无需
- 范围:所有处理 DNG 文件的设备
真实场景
- 带 DNG 文件的电子邮件附件
- AirDrop 传输
- 云端照片同步
- 网络下载摄影师样本
- 即时通讯应用媒体分享
缓解措施与补丁
厂商响应
- 已在 iOS 18.6.2 中修复:Apple 实施了正确的元数据验证
- macOS 更新:对 macOS 图像处理应用了类似修复
- 根本原因:增加了元数据与流参数之间的一致性检查
建议的缓解措施
- 更新系统:安装 iOS 18.6.2 或更高版本
- 输入验证:在自定义解析器中验证元数据一致性
- 边界检查:实施严格的缓冲区大小验证
- 模糊测试:定期测试文件格式解析器
文件结构与技术细节
TIFF/DNG 结构
TIFF 头 → IFD 链 → SubIFD → 图像数据
├── 元数据标签(SamplesPerPixel、Compression 等)
├── JPEG 无损流(SOF3 标记)
└── 像素数据(压缩)
关键漏洞位置
- SamplesPerPixel 标签:IFD 结构中的 TIFF 标签 0x0115
- SOF3 标记:JPEG 无损帧起始标记(0xFFC3)
- 分量数:SOF3 标记偏移 +9 字节
- 关键不匹配:标签值 ≠ 分量数
测试指南
安全测试环境
- 使用隔离系统:虚拟机或专用测试设备
- 创建快照:在测试 PoC 文件之前
- 监控崩溃:检查系统日志和崩溃报告
- 网络隔离:防止意外的文件共享
预期行为
- 脆弱系统:应用程序崩溃、内存损坏错误
- 已修补系统:优雅的错误处理或正确处理
- 日志指示:内存访问违规、段错误
技术参考
文件格式文档
- TIFF 6.0 规范:标签结构和 IFD 格式
- DNG 规范:Adobe Digital Negative 格式
- JPEG 标准:无损压缩(ITU-T T.87)
安全研究
- 内存损坏技术:缓冲区溢出基础
- 文件格式模糊测试:自动化漏洞发现
- 解析器安全:输入验证最佳实践
免责声明:本研究仅用于教育和防御性安全目的。用户应遵守适用法律和道德准则。
注意
崩溃触发需要大约 1-3 分钟。玩得开心。
对于 PoC,你可以运行 open vuln_file.dng 来运行该文件,或者仅预览它即可执行。