kpatsakis/CVE-2026-36834
GitHub: kpatsakis/CVE-2026-36834
针对 LibRaw 库中 Panasonic RW2 解码器数组越界读取漏洞(CVE-2026-36834)的概念验证项目,包含漏洞分析、复现脚本和补丁链接。
Stars: 0 | Forks: 0
# 摘要
在 `src/decoders/pana8.cpp` 中存在数组越界读取。当未找到 Huffman 表匹配项时,函数 `GetDBit()` 可能返回值 17,但 `huff_coeff[]` 声明时只有 17 个元素(有效索引为 0-16)。这会导致访问 `huff_coeff[17]`,从而触发已由 UBSan 和 AddressSanitizer 确认的未定义行为。
# 影响
处理用户提供的 RW2 文件的应用程序(例如使用 LibRaw 的图像编辑器或照片管理工具)可能会因为打开恶意文件而崩溃,或者可能导致进程内存泄露。
CWE: CWE-125 (Out-of-bounds Read), CWE-129 (Improper Validation of Array Index)
CVSS v3.1: AV:L/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:H (~6.5 Medium)
Git commit: 777f20ae21c611a78021bd051fbbf1e71eae78f2
# 受影响的代码
文件: src/decoders/pana8.cpp
函数: pana8_param_t::DecodeC8()
根本原因在于 `GetDBit()`:
```
uint32_t pana8_param_t::GetDBit(uint64_t a2)
{
for (int i = 0; i < 16; i++)
if ((a2 & hufftable2[i]) == hufftable1[i])
return i;
return uint32_t((hufftable2[16] & a2) == hufftable1[16]) ^ 0x11u;
// When comparison is false: returns 0 ^ 17 = 17
}
```
该返回值随后被直接用作数组索引,且没有进行边界检查:
```
huff_index = int(GetDBit(pixbits)); // can be 17
int32_t v37 = (huff_coeff[huff_index] >> 24) // line 250: OOB
uint32_t hc = huff_coeff[huff_index]; // line 251: OOB
// ... and lines 254, 273
```
确认的调用链(UBSan 输出)
LibRaw::unpack()
-> panasonicC8_load_raw() pana8.cpp:125
-> pana8_decode_loop() pana8.cpp:132
-> pana8_decode_strip() pana8.cpp:155
-> DecodeC8() pana8.cpp:250 <-- 触发 OOB
触发的 UBSan 错误:
pana8.cpp:250 index 17 out of bounds for type 'unsigned int [17]'
pana8.cpp:251 index 17 out of bounds for type 'unsigned int [17]'
pana8.cpp:254 index 17 out of bounds for type 'unsigned int [17]'
pana8.cpp:254 shift exponent -17 is negative
pana8.cpp:273 index 17 out of bounds for type 'unsigned int [17]'
pana8.cpp:303 left shift of negative value -1
# 复现
使用 sanitizers 构建 LibRaw:
```
./configure CXXFLAGS="-fsanitize=address,undefined -g -O1" \
LDFLAGS="-fsanitize=address,undefined"
make -j$(nproc)
```
对任意 Panasonic RW2 文件运行 mutator 脚本:
```
python3 mutate_rw2.py input.rw2 mutated_pana8.rw2
ASAN_OPTIONS=halt_on_error=0:print_stats=1 ./bin/dcraw_emu -v mutated_pana8.rw2
```
# 补丁
https://github.com/LibRaw/LibRaw/commit/02da167e0f819a37dbb7d714e87c5b40df6c5917
标签:C++, CWE-125, 内存安全, 图像处理, 数据擦除, 漏洞分析, 路径探测, 逆向工具