Запись за границы выделенного блока памяти в библиотеке OpenJPEG даёт повредить память процесса одним специально собранным файлом изображения. Проблема затрагивает Pillow, библиотеку работы с изображениями для Python. Готовые пакеты Pillow (wheel - собранный пакет Python для установки через менеджер пакетов) с версии 11.1.0 по 12.3.0 несут уязвимую копию кодека JPEG 2000 внутри себя. Обновление системной библиотеки в таком случае не помогает: кодек загружается из пакета.
Запись за границы буфера при разборе JPEG 2000
Кодек OpenJPEG разбирает файл JPEG 2000 по служебным маркерам, небольшим структурам внутри самого файла, которые задают параметры декодирования. Маркер таблицы длины пакетов заранее задаёт размер массива индексов, а маркер начала фрагмента несёт однобайтовый номер фрагмента. Этот номер декодер не сверяет с размером массива, поэтому значение из файла уводит запись за границу выделенного блока. Рядом, в соседней ветке того же кода, такая проверка есть, здесь её нет.
Атака идёт по сети: достаточно, чтобы приложение открыло присланный файл. Учётные данные не нужны, участие пользователя не требуется. Сложность атаки уведомление оценивает как высокую, поскольку файл нужно собрать с корректными служебными маркерами. Уровень High по классификации GitHub, численную оценку CVSS источник не приводит. В базе OSV запись идёт под номером OSV-2025-219, идентификатор CVE не присвоен.
На обычной сборке переполнение не остаётся незамеченным: встроенная в glibc проверка кучи прерывает процесс аварийно, и один файл останавливает долгоживущий рабочий процесс. Автор отчёта пошёл дальше и показал управление потоком исполнения. При определённой раскладке кучи перезапись задевает структуру с указателями на функции обратного вызова, после чего вызывается адрес, выбранный из файла. Готового эксплойта он не построил: для этого нужны выкладка кучи по сети и обход ASLR (рандомизации адресного пространства). Сведений об эксплуатации в реальных атаках нет, файл эксплойта к уведомлению не приложен.
Исправление вышло в Pillow 13.0.0. Оно приходит как правка к исходникам OpenJPEG, которую сборочный скрипт накладывает при сборке пакета. Уязвимы версии OpenJPEG 2.5.3 и 2.5.4; 2.5.2 и более ранние безопасны, потому что дефект появился в изменении кода от 25 июня 2024 года. Отдельного релиза OpenJPEG с исправлением нет: правка датирована 10 февраля 2026 года, а последняя метка библиотеки - 2.5.4 от 20 сентября 2025 года.
Двоичная библиотека остаётся в пакете 13.0.0, и по имени файла нельзя судить, закрыта ли уязвимость. Сканирование помечает эту версию как исправленную предварительно: правка затрагивает нужный файл исходников, но байты собранной библиотеки отдельно не проверялись. Подтвердить исправление можно двумя способами: пересобрать кодек после правки либо приложить подписанную аттестацию сборки.
Встроенные копии OpenJPEG в других репозиториях
Уязвимая копия встречается не только в Pillow. Точные совпадения исходного файла с уязвимой ревизией нашлись во встроенных копиях в репозиториях opencv, catboost, ydb, ytsaurus и Genesis. Само совпадение означает лишь наличие уязвимого кода в дереве исходников. Прежде чем говорить о риске, нужно показать, что релизная сборка действительно собирает эту копию. Модифицированные форки, потребители пакетов и достижимость при разборе реальных данных проверяются отдельно.
Отдельная находка касается воспроизводимости сборки. Сборочные скрипты Pillow берут архив OpenJPEG по изменяемому адресу и не сверяют неизменяемую контрольную сумму. Поэтому целостность архива остаётся неподтверждённой даже при совпадении содержимого с уязвимой веткой. Закрепление контрольной суммы или подписанной аттестации источника сделало бы цепочку воспроизводимой.
Обновление и ограничение форматов
Обновите Pillow до 13.0.0. В приложениях, принимающих файлы извне, задавайте набор допустимых форматов явным параметром formats и проверяйте формат по содержимому файла, а не по расширению или заголовку Content-Type: Image.open определяет формат по первым байтам и доходит до кодека JPEG 2000 даже у файла с именем avatar.png. Для встроенных копий обновите OpenJPEG или перенесите upstream-правку в свою сборку. После пересборки просканируйте артефакты заново: совпадение имени библиотеки не доказывает ревизию исходников.
Значимость уязвимости высока для обработчиков загрузок, генераторов превью и конвейеров предпросмотра, то есть там, где чужой файл доходит до декодера без проверки. Полностью закрывает проблему только сборка с исправленным кодеком. Ограничение форматов уменьшает поверхность атаки, но сам дефект не устраняет.