Новости
Pillow 12.3.0 закрыл 13 уязвимостей в разборе изображений и PDF
Ещё одна библиотека обработки картинок получила пачку патчей: как крошечный файл мог исчерпать память сервера.
libvips — быстрый движок обработки изображений, на котором держится популярная Node.js-библиотека sharp: через неё делают превью и меняют формат загруженных картинок десятки тысяч сайтов. В середине июля 2026 года в libvips исправили сразу четыре уязвимости в коде, разбирающем файлы GIF, TIFF и VIPS. Проблема острее обычного: уязвимую версию sharp по сей день поставляет фреймворк Next.js — и соответствующий тикет в его репозитории всё ещё открыт.

Коротко: в движке обработки изображений libvips исправлены четыре уязвимости (CVE-2026-33327, CVE-2026-33328, CVE-2026-35590, CVE-2026-35591) в загрузчиках GIF, TIFF и VIPS. Через libvips работает Node.js-библиотека sharp — версии до 0.35.0 уязвимы; в них специально сформированная картинка может обрушить процесс или обратиться к чужой памяти. Опаснее всего то, что уязвимую sharp всё ещё тянет за собой Next.js. Мера — обновить sharp до 0.35.x (сейчас 0.35.3, libvips 8.18.3).
libvips — это библиотека с открытым кодом для быстрой обработки изображений: она открывает, конвертирует и масштабирует десятки форматов, экономно расходуя память. Напрямую её почти никто не запускает — чаще всего libvips работает «под капотом» у других инструментов. Самый заметный из них — sharp, стандарт де-факто для обработки картинок в мире Node.js: именно sharp генерирует миниатюры и переводит форматы в бесчисленных веб-приложениях.
17 июля 2026 года в базе GitHub Advisory появился бюллетень GHSA-f88m-g3jw-g9cj, который свёл воедино четыре уязвимости, найденные и уже исправленные в libvips. По данным авторов, все они затрагивают sharp как зависимость, потому что libvips встроен в него статически. Пакет sharp закрыл проблему в версии 0.35.0 (вышла 10 июня 2026), а текущая рекомендованная версия — 0.35.3 (1 июля 2026) с обновлённым libvips 8.18.3.
Все четыре ошибки — из класса проблем с памятью при разборе входного файла: библиотека доверяет размерам и счётчикам, записанным внутри самого изображения, и при подделанных значениях либо выходит за границы буфера, либо запрашивает непомерный объём памяти. Срабатывает такой код в момент, когда картинку только парсят, — до того, как её кто-то увидит. Бюллетень указывает три уязвимых загрузчика:
| Загрузчик | Формат и суть |
|---|---|
TIFF (VipsForeignLoadTiff) | Ключевая из четырёх — CVE-2026-35591: в версиях libvips до 8.18.1 загрузчик неверно определял число цветовых каналов в JPEG- или JPEG2000-плитке внутри TIFF; буфер выделялся под одно число каналов, а данные писались под другое — это запись за границей кучи. Оценка — CVSS 7.0 («высокая»), исправлено в libvips 8.18.2 |
GIF (VipsForeignLoadNsgif) | Ошибка безопасности памяти при разборе кадров анимированного GIF |
VIPS (VipsForeignLoadVips) | Проблема в разборе собственного формата библиотеки .vips, включая переполнение при вычислении размеров |
Практический итог у всех один: на входе — небольшой «битый» файл GIF, TIFF или .vips, на выходе — аварийное завершение процесса (отказ в обслуживании) или обращение к памяти за пределами буфера, что в худшем случае ведёт к утечке данных или выполнению кода. По оценке исследователей, наибольшему риску подвержены серверные Node.js-сервисы, которые автоматически обрабатывают чужие загруженные изображения.
Отдельная причина, по которой история важна прямо сейчас, — цепочка зависимостей. sharp попадает в проекты не только напрямую: его тянут за собой веб-фреймворки, и крупнейший из них — Next.js, где sharp отвечает за оптимизацию изображений. 22 июля 2026 года в репозитории Next.js завели тикет #96064: релиз next@16.2.11 подтягивает sharp 0.34.5 — то есть уязвимую версию из этого же бюллетеня. На момент публикации заметки тикет остаётся открытым.
sharp и libvips обычно стоят «невидимо» — на стороне сайта или сервиса, куда вы загружаете фото. Если такой сервис можно вывести из строя одним специально сформированным изображением, страдает не только он: под угрозой и другие пользователи, чьи файлы обрабатывает тот же сервер. Обновление библиотеки закрывает эту точку входа.
Надёжная мера одна — привести версии в порядок. Порядок действий зависит от того, как именно вы соприкасаетесь с sharp и libvips:
npm install sharp@latest) и переразверните сервис.overrides в npm, resolutions в Yarn или overrides/pnpm.overrides в pnpm — указав sharp ≥ 0.35.0.Случай с libvips — очередное напоминание: сама по себе обработка изображения может быть опасной, даже если его всего лишь уменьшают или переводят в другой формат, а не открывают вручную. Это уже не первая подобная история за месяц: незадолго до этого патчи от отказа в обслуживании выпускали для библиотеки Pillow, движка ImageMagick и низкоуровневой libtiff. Закономерность одна: чем богаче формат и чем больше кода в его разборщике, тем выше шанс наткнуться на ошибку при обработке намеренно «битых» данных.
Практический вывод простой: держите в актуальном состоянии инструменты, через которые проходят чужие файлы, и не считайте картинку заведомо безобидной. Если хотите глубже разобраться в форматах изображений, помогут наши разборы — например, чем открыть WebP, — а выбрать безопасный способ поменять формат помогут онлайн-конвертеры файлов.