
Воспроизводимый proof-of-concept для CVE-2026-36834, демонстрирующий чтение за пределами массива в декодере Panasonic RW2 библиотеки LibRaw, с мутационным скриптом и воспроизведением сбоя на основе санитайзера.
В src/decoders/pana8.cpp обнаружено чтение за границами массива. Функция GetDBit() может вернуть значение 17, если не найдено совпадение в таблице Хаффмана, однако huff_coeff[] объявлен только с 17 элементами (допустимые индексы 0-16). Это приводит к обращению к huff_coeff[17], что вызывает неопределённое поведение, подтверждённое UBSan и AddressSanitizer.
Приложения, обрабатывающие предоставленные пользователем файлы RW2, такие как редакторы изображений или инструменты управления фотографиями, использующие LibRaw, могут аварийно завершиться или потенциально раскрыть память процесса при открытии вредоносного файла.
CWE: CWE-125 (Чтение за границами), CWE-129 (Некорректная проверка индекса массива) CVSS v3.1: AV:L/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:H (~6.5 Средний)
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;
// Когда сравнение ложно: возвращает 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
// ... и строки 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 triggered
Ошибки 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
Соберите LibRaw с санитайзерами:
./configure CXXFLAGS="-fsanitize=address,undefined -g -O1" \
LDFLAGS="-fsanitize=address,undefined"
make -j$(nproc)
Запустите скрипт-мутатор для любого файла Panasonic RW2:
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