
Подробное раскрытие CVE-2025-66628, описывающее целочисленное переполнение в парсере TIM в ImageMagick, включая первопричину, шаги эксплуатации, оценку воздействия и рекомендации по устранению для 32-битных систем.
| Атрибут | Детали |
|---|---|
| CVE ID | CVE-2025-66628 |
| Вендор | ImageMagick Studio LLC |
| Продукт | ImageMagick |
| Затронутые версии | < 7.1.2-10 |
| Исправленная версия | 7.1.2-10 |
| Тип уязвимости | CWE-190 (Целочисленное переполнение) |
| CVSS v3.1 Score | 7.5 (Высокий) |
| CVSS Vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| Исследователь | Sumit Shah |
Уязвимость целочисленного переполнения существует в функции ReadTIMImage в файле coders/tim.c библиотеки ImageMagick. При обработке файлов изображений TIM (PlayStation) в 32-битных системах непроверенное умножение управляемых пользователем значений ширины и высоты приводит к недостаточному выделению памяти, что вызывает чтение за границами буфера во время обработки пикселей.
Уязвимая логика находится в coders/tim.c:
/* coders/tim.c - TIM Image Parser */
// Управляемые пользователем данные из заголовка TIM-файла
width = ReadBlobLSBShort(image); // 2 байта (0-65535)
height = ReadBlobLSBShort(image); // 2 байта (0-65535)
// УЯЗВИМО: Целочисленное переполнение в 32-битных системах
image_size = 2 * width * height; // Нет проверки на переполнение
// Память выделяется с усечённым размером
pixels = (unsigned char *) AcquireQuantumMemory(image_size, sizeof(*pixels));
// Цикл обрабатывает ПОЛНЫЕ размеры, считывая за пределами буфера
for (y = 0; y < height; y++) {
for (x = 0; x < width; x++) {
pixel_index = (y * width + x) * 2;
pixels[pixel_index] = ReadBlobByte(image);
pixels[pixel_index + 1] = ReadBlobByte(image);
}
}
В 32-битных архитектурах size_t ограничено 32 битами с максимальным значением UINT_MAX = 4 294 967 295.
Когда ширина и высота установлены в максимальные 16-битные беззнаковые значения:
width = 65535 (0xFFFF)
height = 65535 (0xFFFF)
Ожидаемое вычисление:
2 × 65535 × 65535 = 8 589 869 050 байт (~8,5 ГБ)
Фактический результат (32-битное зацикливание):
8 589 869 050 % 4 294 967 296 = 4 294 901 754
Результат после усечения: маленький выделенный буфер
Переполнение заставляет аллокатор памяти резервировать значительно меньший буфер, чем требуется, в то время как цикл обработки по-прежнему итерируется по полной сетке пикселей 65535 × 65535, что приводит к чтению за границами.
Шаг 1: Злоумышленник создаёт TIM-файл с размерами, вызывающими переполнение
[Magic: 0x10]
[Type: 0x02]
[Width: 0xFFFF] # 65535
[Height: 0xFFFF] # 65535
[Pixel Data...]
Шаг 2: Жертва обрабатывает вредоносный файл
convert malicious.tim output.png
Шаг 3: Возникает чтение за границами, приводящее к:
32-битные системы, где size_t является 32-битным. 64-битные системы не затронуты из-за достаточной разрядности целых чисел для представления вычисленного размера без переполнения.
Раскрытие информации (основное): Данные из кучи процесса ImageMagick могут быть прочитаны во время доступа за границами. Эта память может содержать:
Утекшие данные могут быть встроены в преобразованное выходное изображение или извлечены с помощью анализа побочных каналов.
Отказ в обслуживании (вторичное):
Чтение неотображённых областей памяти вызывает SIGSEGV, что приводит к завершению процесса ImageMagick и нарушению работы автоматических конвейеров обработки изображений.
Технические детали предоставлены для проверки. Исполняемый код эксплойта не распространяется.
convert, magick или любой вызов API ImageMagick$ convert malicious.tim output.png
Segmentation fault (core dumped)
Или успешное преобразование с утечкой данных кучи, встроенных в выходной файл.
$ convert malicious.tim output.png
convert: Memory allocation failed `malicious.tim' @ error/tim.c/ReadTIMImage/XXX.
Обновите ImageMagick до версии 7.1.2-10 или новее:
# Проверка текущей версии
convert --version
# Обновление с помощью менеджера пакетов
apt update && apt upgrade imagemagick # Debian/Ubuntu
yum update imagemagick # RHEL/CentOS
brew upgrade imagemagick # macOS
Реализуйте проверку переполнения перед арифметическими операциями:
// Небезопасно
image_size = 2 * width * height;
// Безопасно
if (height != 0 && width > (SIZE_MAX / 2) / height) {
ThrowReaderException(ResourceLimitError, "MemoryAllocationFailed");
}
image_size = 2 * width * height;
Применяйте проверку входных данных и разумные ограничения на значения размеров перед выполнением вычислений.
Эта уязвимость была выявлена с помощью вариантного анализа. После раскрытия аналогичного целочисленного переполнения в декодере BMP ImageMagick был проведён систематический обзор парсеров устаревших форматов. Сопоставление шаблонов непроверенных вычислений width * height привело к обнаружению той же ошибки в парсере TIM.
Декодеры устаревших форматов изображений (TIM, SGI, VIFF и т.д.) представляют собой ценные цели из-за редких аудитов безопасности и использования небезопасной арифметики языка C.
Эта уязвимость была сообщена разработчикам ImageMagick в частном порядке через GitHub Security Advisories. Публичное раскрытие произошло только после выпуска исправления и присвоения CVE. Исследование проводилось с соблюдением принципов ответственного раскрытия.
SUMIT SHAH
Исследователь: SUMIT SHAH