Уязвимость Pillow позволяет выполнить команды операционной системы через имя загружаемого EPS-файла — даже если само изображение не содержит вредоносного кода. Проблема затрагивает версии библиотеки с 2.6.0 по 12.3.0, а для российских команд это прямой повод проверить сервисы загрузки аватаров, генерации превью, PDF-конвейеры и ML-пайплайны на Python.
Как сообщает The Hacker News, ошибка получила идентификатор CVE-2026-112900 и связана с обработкой EPS. Pillow передаёт имя файла внешней утилите Ghostscript, которая превращает PostScript-изображение в пиксели. Если приложение сохраняет или формирует имя файла из контролируемых пользователем данных, Ghostscript может интерпретировать это имя не как путь, а как инструкцию для обращения к другому файлу с командами.
Ключевая деталь здесь неприятна именно своей приземлённостью: атакующему не обязательно прятать эксплойт внутри картинки. Достаточно безобидного EPS и удачно подобранного имени. Поэтому расширение файла, антивирусная проверка содержимого или запрет «подозрительных» PostScript-конструкций сами по себе не закрывают сценарий. Уязвимыми оказываются точки загрузки, где исходное имя пользователя сохраняют как есть, склеивают из него путь или передают дальше в Image.open().
Эксплуатация CVE-2026-112900 требует ещё одного условия: на хосте должен быть установлен исполняемый файл gs, то есть Ghostscript. Без него Pillow не умеет открывать EPS этим способом. Разработчики Pillow оценили риск как умеренный, поскольку атакующему нужен контроль над именем файла. В записях CVE от GitHub та же проблема получила 9,2 балла из 10. Формально это расхождение в оценках, по сути — напоминание, что CVSS не знает архитектуру конкретного сервиса и привычки его разработчиков.
Исправление вошло в Pillow 13.0.0, выпущенную 16 октября. Это не одиночный патч, а крупный пакет обновлений с проблемами всех уровней серьёзности, включая две критические по классификации сопровождающих библиотеки. По оценке OX Security, Pillow скачивают около 436 млн раз в месяц. Библиотека давно стала инфраструктурной зависимостью: она встречается в веб-приложениях, инструментах для документов, бэкендах маркетплейсов, сервисах модерации и проектах машинного обучения — часто транзитивно, без явного упоминания в основном коде.
В релизе исправлены и другие опасные сценарии. Один из них касается FlashPix: специально подготовленный файл мог привести к запуску команды уже при единственном вызове Image.open(), если в окружении установлен дополнительный пакет olefile. Pillow определяет такой файл по содержимому, а не по расширению, поэтому переименование загрузки в JPG не является защитой. Отдельная ошибка CVE-2026-112403 вызывает переполнение буфера при создании миниатюры из специально сформированного JPEG без потерь; в опубликованном описании речь идёт о сбое процесса, а не о подтверждённом выполнении кода.
Ещё одна давняя проблема, CVE-2026-112393, присутствовала в Pillow с 2013 года. Она проявляется, когда сервис сохраняет сжатое TIFF-изображение в буфер памяти, например в io.BytesIO, чтобы сразу отдать результат клиенту. Исследователи добились падения процесса и показали возможность выполнить код только в связке с отдельной ошибкой, раскрывающей адреса в памяти. Запись на обычный файл на диске этому сценарию не подвержена. Уязвимость Pillow в EPS, ошибки TIFF и обработки JPEG наглядно показывают старую проблему: обработчик «просто картинок» часто запускается на границе с недоверенными данными и заслуживает того же внимания, что парсер архивов или офисных документов.
Практический минимум для команд — обновить зависимость до Pillow 13.0.0, пересобрать контейнеры, колёса и базовые образы, где могла остаться старая версия. Есть важное ограничение: Pillow 13 больше не поддерживает Python 3.10, поэтому зависшим на этой версии интерпретатора придётся сначала перейти на Python 3.11 или новее. До обновления разумно убрать Ghostscript с серверов, обрабатывающих недоверенные загрузки, не передавать пользовательские имена EPS-файлов в Pillow и избегать draft() и thumbnail() для недоверенных JPEG. Для TIFF стоит отдельно проверить путь, где результат сохраняется в память, а не на диск.
Эта история не про экзотический формат EPS, который якобы никому не нужен. Она про стоимость неявных зависимостей и вспомогательных бинарников в серверном окружении: библиотека Python вызывает Ghostscript, а безопасный на вид загрузчик превращается в потенциальную точку удалённого выполнения кода. Следующий аудит стоит начать не с поиска слова Pillow в репозитории, а с инвентаризации всех мест, где сервис открывает пользовательские файлы. Детали релиза и описания исправлений доступны у .


