
Next.js выкатил экстренный патч: два RCE, и один без обходного пути
20 августа Vercel сделали то, чего раньше не делали: предупредили о security-релизе заранее. Мол, двадцать шестого выйдут 16.3.3 и 15.5.24, там одна критическая уязвимость, готовьтесь.
А 25 числа выкатили релиз на день раньше. И уязвимостей в нём стало две.
Дыра первая: картинки
GHSA-2xp9-vwfh-vxw4, CVSS 9.5. Неаутентифицированное удалённое выполнение кода в Image Optimization API при обработке AVIF.
Цепочка такая: next/image отдаёт оптимизацию картинок в sharp, sharp для AVIF дёргает libheif, а в libheif дыра (GHSA-g89c-p67h-r497). Скармливаешь оптимизатору специально собранный AVIF - получаешь выполнение кода. Без логина, без пользовательского действия, без привилегий. Просто запрос.
Ключевое, что стоит понять: это про входной формат, а не про выходной. Если у вас в images.formats нет AVIF - это ничего не значит. Дыра срабатывает на декодировании того, что пришло. То есть под ударом всё, где оптимизатору можно подсунуть чужой файл: щедрые remotePatterns, пользовательские загрузки, картинки из внешней CMS.
Как починили? Никак. AVIF-оптимизацию просто выключили - до тех пор, пока не подтянется фикс в апстриме. Честное инженерное решение: не можем починить чужую библиотеку, значит перестаём её звать.
Затронутые версии — с 10.0.0 до 15.5.23 и с 16.0.0 до 16.3.2.
Прочитайте ещё раз: с десятой. Это не «обновите прод». Это «вспомните все сайты, которые вы когда-либо сдали и забыли».
Дыра вторая: Windows
CVE-2026-75604, CVSS 9.0, класс CWE-22 - выход за пределы каталога. Та самая вторая, из-за которой релиз и сдвинули.
Условия срабатывания:
- сервер крутится на файловой системе Windows;
- в приложении одновременно живут Pages Router и App Router;
- Cache Components не включены.
Совпало всё три - неаутентифицированный RCE. Linux и macOS не затронуты вообще. Нашёл исследователь под ником B0RI.
И вот главная строчка адвизори, ради которой я это пишу:
There is no known workaround for affected Windows-hosted applications.
Обходного пути нет. Не «есть, но неудобный». Не «отключите фичу». Нет.
Про «обходного пути нет»
Мы все врём себе про воркэраунды. Приходит CVE, ты читаешь митигацию, выключаешь какой-нибудь флажок, вешаешь правило на WAF, ставишь задачу «обновиться нормально» в бэклог - и она там мирно живёт до следующего аудита. Воркэраунд - это разрешение не делать работу сегодня.
Когда его нет, решение принимается за минуту. Не потому что ты стал ответственнее, а потому что кончились варианты.
Неловкий момент
В заметке про выход 16.3 я писал: обновляйтесь, но главную фичу пока не включайте. И среди аргументов был такой - на self-hosted cacheComponents может уронить серверный рендер целиком.
Теперь смотрим на условия второй дыры. «Pages Router и App Router без Cache Components».
То есть отсутствие той самой фичи, которую я советовал не включать, входит в набор предусловий уязвимости.
Хочется сказать «ну кто ж знал», но правильнее сказать по-другому: совет не включать сырую фичу был верным, и он всё равно оставил людей в уязвимой конфигурации. Это не ошибка в рассуждении. Это нормальное свойство безопасности - она не складывается из отдельно правильных решений. Ты можешь принять три обоснованных решения подряд и оказаться ровно в той точке, где тебя ждут.
И нет, я не предлагаю сейчас в панике включать Cache Components как митигацию. Во-первых, Vercel прямым текстом пишут, что воркэраундов нет - значит и этот не проверен. Во-вторых, менять архитектуру кеширования под давлением CVE - отличный способ поменять одну проблему на три. Обновляйтесь. Не умничайте.
Что делать сегодня
npm install next@16.3.3 # для ветки 16.3, Active LTS
npm install next@15.5.24 # для ветки 15.5, Maintenance LTS
Дальше по списку, в порядке убывания срочности:
- Windows-хостинг с Pages + App Router - прямо сейчас. Это не задача на спринт, это задача на вечер. Обходного пути нет.
- Всё остальное, где есть
next/image- то есть практически всё. Особенно там, гдеremotePatternsразрешает чужие домены или пользователи что-то загружают. - Пройтись по старым проектам. Не по тем, что в мониторинге, а по тем, которых в мониторинге нет. Порог - версия 10. У меня набралось несколько клиентских сайтов, которые я не трогал больше года и которые прекрасно работали ровно до момента, когда я пошёл смотреть в их
package.json. - Проверить, что вы вообще узнаёте о таких вещах. Если про этот патч вы читаете в блоге у парня из Челябинска, а не из своего канала алертов - чинить надо не Next.js.
Последний пункт, по-моему, важнее первых трёх. Один патч поставить легко. Проблема в том, что следующий выйдет, а вы о нём не услышите.
И одна хорошая новость
Программа предварительных анонсов, которую Vercel запустили в июле, - правильная штука. Да, предупреждение за неделю подсвечивает атакующим, что скоро будет интересно. Но альтернатива - узнавать о критической дыре одновременно с теми, кто её уже эксплуатирует.

Комментарии