Версии Imager до 1.032 для Perl имеют чтение кучи за пределами границ встроенного средства чтения Imager::File::SGI через 16-битный литерал RLE, запускаемый в read_rgb_16_rle.
read_rgb_16_rle защищает каждый литерал с помощью if (count > data_left), но count — это количество пикселей, а каждая 16-битная выборка занимает два байта. Цикл копирования считывает inp[0] * 256 + inp[1] и продвигает два байта на пиксель, поэтому выполнение с data_left / 2 < count <= data_left проходит защиту, но потребляет 2 * count байт и считывает за конец буфера. На 8-битный путь это не влияет, поскольку здесь один пиксель равен одному байту.
Чтение созданного изображения SGI через Imager->read вызывает перечитывание, прежде чем парсер отклонит искаженное изображение, что может привести к сбою процесса.
Показать оригинальное описание (EN)
Imager versions before 1.032 for Perl have a heap out-of-bounds read in the bundled Imager::File::SGI reader via a 16-bit RLE literal run in read_rgb_16_rle. read_rgb_16_rle guards each literal run with if (count > data_left), but count is a pixel count while every 16-bit sample consumes two bytes. The copy loop reads inp[0] * 256 + inp[1] and advances two bytes per pixel, so a run with data_left / 2 < count <= data_left passes the guard yet consumes 2 * count bytes and reads past the end of the buffer. The 8-bit path is unaffected because there one pixel is one byte. Reading a crafted SGI image through Imager->read triggers the over-read before the parser rejects the malformed image, which can crash the process.
Характеристики атаки
Последствия
Строка CVSS v3.1