Новости · Безопасность

Next.js: генератор превью-картинок оказался дырой для выполнения кода на сервере

Компания Vercel закрыла критическую уязвимость в Next.js — фреймворке, на котором построены миллионы сайтов. Проблема сидела в функции ImageResponse из модуля next/og: она превращает разметку в SVG-картинку для превью-ссылок (Open Graph) и делает это, не экранируя чужие данные должным образом.

Коротко: CVE-2026-94545 (CVSS 9.5) затрагивает Next.js 16.2.0–16.3.5 в среде выполнения Node.js. Библиотека Satori, которая рендерит разметку в SVG для ImageResponse, не экранировала значения перед вставкой в SVG-вывод — если в картинку попадали чужие данные (например, из параметров запроса), атакующий мог внедрить свою SVG-разметку и выполнить код на сервере. Исправлено в Next.js 16.3.6, вышедшем 22 сентября 2026.

25 сентября 2026 Редакция LoadFile Чтение 5 мин
Картинка разлетается на осколки данных, символизируя сбой генерации SVG-изображения
Содержание
  1. Что произошло
  2. Как SVG превратился в дыру для кода
  3. Кого это касается
  4. Что делать
  5. Источники

Что произошло

22 сентября 2026 компания Vercel, разработчик фреймворка Next.js, выпустила версию 16.3.6 с исправлением критической уязвимости CVE-2026-94545. По оценке CVSS v4.0 ей присвоен рейтинг 9.5 — критический. Брешь сидит в функции ImageResponse из встроенного модуля next/og, который разработчики используют для автоматической генерации превью-картинок ссылок (Open Graph, «og:image») прямо на сервере — без Photoshop и заготовленных файлов.

Уязвимы версии Next.js с 16.2.0 по 16.3.5 включительно — то есть с даты выхода 16.2 (18 марта 2026) до патча. Затронута только среда выполнения Node.js: вариант ImageResponse для Edge Runtime уязвимости не подвержен.

!
Публичных атак пока не зафиксировано

На момент выхода патча (23 сентября 2026) независимые исследователи не сообщали о рабочих эксплойтах «в дикой природе» или атаках на реальные сайты. Но детали уязвимости уже разобраны в нескольких публичных технических разборах, поэтому окно для обновления стоит закрывать быстро.

Как SVG превратился в дыру для кода

ImageResponse работает так: разработчик описывает картинку React-разметкой (JSX) — например, «текст заголовка поверх цветного фона». Next.js передаёт эту разметку библиотеке Satori (разработка той же Vercel), которая превращает JSX в SVG-документ, а затем растрирует его в PNG для готового превью.

Проблема — в том, как Satori собирает промежуточный SVG. Некоторые значения — например, текст заголовка или динамический параметр из URL — попадали в итоговую SVG-разметку без должного экранирования. Если такое значение приходило от пользователя (скажем, страница генерировала og:картинку по параметру ссылки вида /api/og?title=…), атакующий мог составить строку, которая «вырывается» из своего контекста — текстового узла, атрибута или стиля — и становится частью самой разметки SVG. Дальше эта разметка обрабатывается как код, что и даёт выполнение произвольных команд на сервере.

Формат SVG — это, по сути, XML с элементами разметки и возможностью встраивать скрипты и обработчики событий, поэтому недостаточно экранированный ввод в SVG исторически остаётся источником похожих уязвимостей — от подмены содержимого до выполнения кода. Разбор самого формата и того, почему в нём в принципе может «прятаться» код, — в нашем гайде чем открыть SVG и как он устроен.

В версии 16.3.6 Vercel обновила Satori до 0.33.5, добавив корректное экранирование значений перед их вставкой в SVG-вывод. Дополнительно в Next.js 15.5.26 добавлено усиление защиты и для линейки 15.5.

Кого это касается

Риск реален только для приложений, которые одновременно выполняют два условия: используют Node.js-версию ImageResponse (не Edge Runtime) и передают в генерацию картинки данные, на которые может повлиять пользователь — заголовок статьи из CMS, параметр запроса, имя профиля и подобное. Такой паттерн типичен для динамических og-превью — их специально и придумали, чтобы каждая страница или пост получали уникальную картинку в соцсетях без ручной работы дизайнера.

Если сайт использует ImageResponse только с фиксированными, «зашитыми» в код текстами — риск ниже, но обновиться стоит в любом случае: код мог со временем обрасти новыми полями, о которых забыли.

Что делать

  1. Обновите Next.js до версии 16.3.6 или новее (для линейки 15.5 — до 15.5.26). Проверить версию в проекте: npm ls next.
  2. Найдите в проекте все места, где вызывается ImageResponse из next/og, и проверьте, какие данные попадают в разметку JSX — особенно значения из query-параметров, заголовков запроса или пользовательского контента.
  3. До обновления временно уберите из генерации картинок любые значения, на которые может повлиять посетитель, или замените их на статичные плейсхолдеры.
  4. Если сайт развёрнут через Vercel или другую платформу с автосборкой — пересоберите и разверните проект заново после обновления пакета, чтобы патч попал в прод.

Тема недоверенных данных в генерируемых файлах — не новая: похожим образом устроены и атаки через встроенные SVG-скрипты, о которых мы писали в материале SVG-стеганография и вредонос во флагах. Принцип один: любой формат, который умеет «содержать код» — SVG, XML, макросы в документах — требует осторожной обработки чужого ввода.

Источники

Данные приведены на 25 сентября 2026 по материалам The Hacker News, Checkmarx и security-advisory Vercel/Next.js. Номер CVE, рейтинг CVSS и версии указаны по первоисточникам.

Читайте также