
Out-of-bounds array read in LibRaw
Existe uma leitura de array fora dos limites em src/decoders/pana8.cpp. A função GetDBit() pode retornar o valor 17 quando nenhuma correspondência na tabela Huffman é encontrada, mas huff_coeff[] é declarado com apenas 17 elementos (índices válidos 0-16). Isso resulta no acesso a huff_coeff[17], desencadeando comportamento indefinido confirmado pelo UBSan e AddressSanitizer.
Aplicações que processam arquivos RW2 fornecidos pelo usuário, como editores de imagem ou ferramentas de gerenciamento de fotos que utilizam LibRaw, podem travar ou potencialmente vazar memória do processo ao abrir um arquivo malicioso.
CWE: CWE-125 (Leitura Fora dos Limites), CWE-129 (Validação Incorreta de Índice de Array) CVSS v3.1: AV:L/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:H (~6.5 Médio)
Git commit: 777f20ae21c611a78021bd051fbbf1e71eae78f2
Arquivo: src/decoders/pana8.cpp Função: pana8_param_t::DecodeC8()
A causa raiz está em 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;
// Quando a comparação é falsa: retorna 0 ^ 17 = 17
}
O valor retornado é então usado diretamente como índice de array sem verificação de limites:
huff_index = int(GetDBit(pixbits)); // pode ser 17
int32_t v37 = (huff_coeff[huff_index] >> 24) // linha 250: OOB
uint32_t hc = huff_coeff[huff_index]; // linha 251: OOB
// ... e linhas 254, 273
Cadeia de chamadas confirmada (saída do 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 acionado
Erros do UBSan acionados: 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
Compile o LibRaw com sanitizers:
./configure CXXFLAGS="-fsanitize=address,undefined -g -O1" \
LDFLAGS="-fsanitize=address,undefined"
make -j$(nproc)
Execute o script mutator em qualquer arquivo RW2 Panasonic:
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