Может ли имя изображения запустить команды на сервере?

Pillow — самая распространённая библиотека для работы с изображениями в Python. Уязвимость CVE-2026-112900 позволяет атакующему добиться выполнения системных команд на сервере, если тот открывает EPS-файл с именем, которое контролирует злоумышленник. Опасность связана не с содержимым изображения: безвредный EPS может стать проблемой из-за имени файла.
Может ли имя изображения запустить команды на сервере?
Изображение носит иллюстративный характер

Pillow применяют в формах загрузки, сервисах для аватаров и миниатюр, обработке документов и PDF, а также в проектах машинного обучения. По оценке OX Security, чьё расследование привлекло внимание к уязвимостям, библиотеку скачивают около 436 миллионов раз в месяц. Выпуск Pillow 13.0.0 от 16 октября устраняет проблемы четырёх уровней серьёзности; две исправленные уязвимости сопровождающие относят к критическим. Известных случаев эксплуатации этих дефектов нет.
Открывая EPS, Pillow передаёт имя файла программе Ghostscript, которая преобразует изображение в пиксели. Библиотека предварительно не проверяет имя, а Ghostscript способен воспринять специально составленную строку как инструкцию и обратиться к другому файлу с командами. В предупреждении разработчиков сказано: «Уязвимость запускается именем файла, а не содержимым документа PostScript».
Реальный риск возникает, например, если сервер принимает загрузки и сохраняет исходное имя пользователя либо формирует имя файла из полученных от него данных. Дефект затрагивает версии Pillow от 2.6.0 до 12.3.0. Для атаки на узле должна быть установлена программа gs: без Ghostscript Pillow не сможет открыть EPS. Разработчики присвоили проблеме умеренную степень серьёзности, поскольку атакующему нужно контролировать имя. Запись CVE, присвоенная GitHub, оценивает риск в 9,2 балла из 10; аналитики CISA не сообщают об эксплуатации.
Релиз исправляет и другие проблемы. Среди них — отдельная ошибка работы с памятью: после смены режима изображения библиотека могла повторно использовать устаревшие данные. В декодировании JPEG также нашли два переполнения. Первое относится к формату FlashPix (FPX): специально подготовленный файл может привести к выполнению команды при одном вызове Image.open(), если установлен необязательный пакет olefile. Pillow распознаёт такие файлы по содержимому, а не по расширению, поэтому обработка недоверенной загрузки способна запустить атаку без дополнительных действий пользователя.
Вторая ошибка JPEG связана с созданием миниатюр для lossless JPEG и обозначена CVE-2026-112403. Подготовленное изображение может вызвать переполнение буфера и аварийное завершение программы; в предупреждении разработчиков речь идёт о сбое, а не о выполнении кода. Уязвимость «обнаружила Anthropic с помощью Claude при исследовании безопасности программного обеспечения с открытым исходным кодом; Ada Logics вручную подтвердила результат». Это часть более широкой работы Anthropic, в ходе которой нашли сотни дефектов в таких библиотеках.
Уязвимость TIFF, CVE-2026-112393, присутствует в Pillow с 2013 года. Переполнение возникает, когда сжатое TIFF-изображение сохраняют в памяти, а не в файл на диске. Так может работать сервис, который перекодирует загруженную картинку и возвращает результат. По данным разработчиков, исследователям удалось вызвать сбой процесса; выполнить код они смогли лишь с помощью другой, отдельной уязвимости, раскрывавшей адреса в памяти. Запись изображения в настоящий файл на диске не затронута. Для TIFF-ошибки GitHub также выставил 9,2 из 10, а аналитики CISA отметили наличие публичного подтверждения концепции атаки.
Оценка GitHub в 9,2 балла относится к уязвимостям EPS, TIFF и созданию JPEG-миниатюр. Она не отражает всех условий, необходимых для эксплуатации: например, зависимости от установленного Ghostscript или конкретного способа обработки файла. Поэтому оценки сопровождающих Pillow варьируются от умеренной до критической.
Как защитить сервис
Установите Pillow 13.0.0 или более новую версию и пересоберите контейнеры, пакеты wheels и базовые образы, в которых могла остаться старая библиотека:
pip install -U "Pillow>=13.0.0"
В Pillow 13 прекращена поддержка Python 3.10, поэтому такие установки нужно перевести на Python 3.11 или новее. Пока обновление невозможно, на серверах, принимающих недоверенные файлы, следует отключить gs и не передавать в Image.open() пользовательское имя EPS. Для JPEG не вызывайте draft() и thumbnail() на недоверенных файлах; альтернативы — сначала вызвать load() либо передать reducing_gap=None. Сохранение пользовательского TIFF во временный буфер, например io.BytesIO, следует считать чувствительной операцией.


Новое на сайте

Ссылка