14 октября 2026 Vercel выпустил внеплановый security-релиз Next.js: v16.4.1 (Active LTS) и v15.5.28 (Maintenance LTS) в одном батче.[1] Обновление (07.11.2026): 16.4.1 больше не минимум - ноябрьский security-релиз 3 ноября выпустил v16.4.5 и v15.5.29 с ещё семью адвизори, ставьте их вместо версий ниже.[2] Это не рутинный патч. Он закрывает два Critical unauthenticated RCE (удалённое выполнение кода без аутентификации) и один High denial-of-service - и для тех, кто крутит Next.js на собственном сервере, это сильнейший триггер к обновлению за последнее время.[1]

Если вы хостите Next.js сами, суть проста: Vercel патчит свою платформу за вас - свой сервер вы патчите сами. На Vercel фикс ложится в их инфраструктуру, и вы можете даже не заметить. На VPS, которым вы управляете, уязвимый код - это процесс, который вы запустили через PM2, и ничего не обновит его, пока не обновите вы. Этот гайд - прочтение релиза глазами self-hostера: что реально затрагивают три адвизори, как проверить, открыто ли ваше приложение, и точный порядок апгрейда, который закрывает дыры без поломки рабочего деплоя.

Что закрывает релиз

Security-апдейт покрывает три уязвимости - все в upstream-зависимостях, все анонсированы в посте от 14 октября.[1]

Critical - Unauthenticated RCE в use cache-функциях, возвращающих typed arrays (GHSA-673q-mjm6-r5xr). Уязвимость в приложениях на App Router с Cache Components может привести к unauthenticated remote code execution, когда use cache-функция возвращает несколько typed arrays.[1] Связанный upstream-адвизори - GHSA-xqc2-xf4c-x3h3 (React).[1] Известного workaround’а нет - рекомендация Vercel - обновляться немедленно, «даже если в вашем приложении нет похожих функций».[1]

Critical - Unauthenticated RCE в Image Optimization API при использовании SVG (CVE-2026-96889 / GHSA-2464-fhr4-w9xw). Memory-related уязвимость в upstream-библиотеке, используемой для Image Optimization, может привести к remote code execution, когда Next.js работает на glibc-based Linux.[1] Workaround, если обновиться прямо сейчас нельзя, - убедиться, что версия sharp, используемая Next.js, 0.35.5 или новее; апгрейд Next.js до пропатченных версий заставляет пакетные менеджеры автоматически подтянуть исправленный sharp.[1]

High - Denial of Service в App Router через Server Actions (GHSA-p3m5-59mp-jv5r). Специально сформированные запросы к приложению на App Router хотя бы с одним Server Action вызывают чрезмерную нагрузку на CPU, которая блокирует обработку дальнейших запросов в том же процессе - denial of service.[1] Связанный upstream-адвизори - GHSA-h3gv-c5rc-p453 (React).[1] Приложения на Pages Router или без Server Actions не уязвимы к этой конкретной дыре.[1]

Угол self-hosting: Vercel патчит сам - self-host патчишь сам

Причина, по которой этот релиз заслуживает отдельного гайда для self-hostеров, - асимметрия в том, как фикс до вас доходит.

На Vercel пропатченная версия Next.js раскатывается по их инфраструктуре, а пути Image Optimization и Server Actions работают в среде, которую контролирует Vercel. Ваше приложение может оказаться защищённым в момент обновления платформы, без каких-либо действий с вашей стороны.

На вашем VPS ничего из этого не происходит. Версия Next.js - это то, что зафиксировано в вашем package.json и lockfile, процесс - тот, что вы запустили через node .next/standalone/server.js под PM2, а бинарь sharp - тот, что подтянула ваша сборка. Ничего не патчит себя само. Уязвимый код остаётся живым, пока вы не запустите апгрейд, не пересоберёте и не перезапустите процесс. Этот разрыв - между публикацией релиза и тем, как ваш сервер реально начинает крутить исправленную версию - и есть окно для атакующего, и закрыть его - целиком ваша задача.

Это тот же путь деплоя, что мы разобрали в гайде по деплою на VPS: сборка с output: 'standalone', копирование артефакта, запуск под PM2, проксирование через nginx. Security-патч не меняет эту механику - он лишь делает шаг «пересобрать и перезапустить» неопциональным.

Как проверить, уязвимы ли вы

Перед апгрейдом стоит понять, каких из трёх путей касается ваше приложение. Вот практический чек-лист.

1. Используете ли вы use cache с typed arrays? RCE в GHSA-673q-mjm6-r5xr затрагивает приложения на App Router с Cache Components, где use cache-функция возвращает несколько typed arrays.[1] Если вы перешли на Cache Components (рекомендованный дефолт с 16.4, разобран в нашем гайде по Cache Components), поищите в коде 'use cache' и проверьте, не возвращает ли какая-то кэшируемая функция typed arrays вроде Uint8Array, Int32Array или Float64Array. Но учтите предупреждение Vercel: обновляйтесь, даже если считаете, что таких функций у вас нет - поверхность срабатывания шире, чем кажется по наивному grep’у.[1]

2. Используете ли вы Image Optimization API с SVG? RCE в CVE-2026-96889 / GHSA-2464-fhr4-w9xw срабатывает, когда Next.js работает на glibc-based Linux и обрабатывает SVG через Image Optimization.[1] Если ваше приложение отдаёт пользовательские или сторонние SVG через next/image - вы на открытом пути. Проверьте версию sharp: npm ls sharp должен показать 0.35.5 или новее.[1] Большинство Linux-VPS - glibc-based, так что это актуально широко.

3. Используете ли вы Server Actions? DoS в GHSA-p3m5-59mp-jv5r затрагивает приложения на App Router хотя бы с одним Server Action.[1] Если у вас есть любая функция с "use server" - вы в зоне поражения. Если вы на Pages Router или без Server Actions - этот конкретный адвизори к вам не относится.[1]

Честный ответ для большинства self-hosted Next.js-приложений: вы, скорее всего, в зоне хотя бы одной из этих дыр. App Router - дефолт, Server Actions распространены, а Image Optimization с SVG легко задеть, не осознавая этого. Цена апгрейда низкая; цена ошибки в оценке своей экспозиции - нет.

Порядок апгрейда для self-hosted приложения

Вот последовательность, которая закрывает дыры с минимальным риском. Она предполагает стандартную standalone-сборку + PM2 из гайда по деплою.

Шаг 1 - Зафиксируйте и установите пропатченную версию. Для линейки 16.x - next@16.4.1; для 15.x - next@15.5.28.[1]

npm install next@16.4.1   # для 16.x
# или
npm install next@15.5.28  # для 15.x

Шаг 2 - Проверьте sharp. Убедитесь, что подтянулась исправленная версия: npm ls sharp должен показать 0.35.5 или новее.[1] Если lockfile всё ещё держит старый sharp, апгрейд Next.js должен подтянуть исправленный, но проверьте это явно - именно эта зависимость несёт RCE в Image Optimization.

Шаг 3 - Пересоберите standalone-артефакт. Запустите обычную сборку (npm run build с output: 'standalone'), которая перегенерирует .next/standalone. Именно этот шаг запекает пропатченный код и исправленный бинарь sharp в то, что вы деплоите.

Шаг 4 - Задеплойте и перезапустите процесс. Скопируйте новый артефакт на сервер и перезапустите PM2, чтобы работающий процесс подхватил пропатченную сборку:

pm2 restart next-app

Перезапуск обязателен - работающий процесс держит старый код в памяти, пока вы его не перезапустите. Если у вас несколько PM2-инстансов - перезапустите все.

Шаг 5 - Прогоните smoke-тест. Откройте роуты, которые задействуют затронутые пути: страницу, рендерящую use cache-функцию, изображение через next/image (особенно SVG) и Server Action. Убедитесь, что они отвечают нормально и процесс остаётся здоровым под нагрузкой.

Чего не делать

  • Не ждите «удобного» окна обслуживания. Две из дыр - unauthenticated RCE, и у use cache-дыры нет workaround’а.[1] Окно экспозиции - это время между публичным релизом и вашим перезапуском. Закрывайте его сейчас.
  • Не полагайтесь только на workaround с sharp. Пин sharp >= 0.35.5 смягчает RCE в Image Optimization, но ничего не делает для use cache-RCE, у которого workaround’а нет вообще.[1] Workaround - это временная мера, а не замена апгрейду.
  • Не пропускайте перезапуск. Установить пакет и пересобрать недостаточно - работающий PM2-процесс нужно перезапустить, чтобы он загрузил пропатченный код.

Коротко

Next.js v16.4.1 (и v15.5.28 для линейки 15.x) вышел 14 октября 2026 как внеплановый security-релиз, закрывающий два Critical unauthenticated RCE - в use cache-функциях, возвращающих typed arrays (GHSA-673q-mjm6-r5xr, без workaround’а) и в Image Optimization API с SVG на glibc Linux (CVE-2026-96889 / GHSA-2464-fhr4-w9xw, workaround: sharp >= 0.35.5) - плюс High DoS в App Router Server Actions (GHSA-p3m5-59mp-jv5r).[1] На Vercel платформа патчит себя сама; на вашем VPS патч - это вы. Проверьте, используете ли вы use cache с typed arrays, Image Optimization с SVG или Server Actions, затем обновитесь, проверьте sharp, пересоберите standalone-артефакт, перезапустите PM2 и прогоните smoke-тест. Механика апгрейда не изменилась с гайда по деплою на VPS - изменилась только срочность.

Источники

  1. Next.js - “Next.js Security Update for Upstream Vulnerabilities” (14 октября 2026: v16.4.1 Active LTS + v15.5.28 Maintenance LTS; GHSA-673q-mjm6-r5xr Critical RCE в use cache typed arrays, без workaround’а; CVE-2026-96889 / GHSA-2464-fhr4-w9xw Critical RCE в Image Optimization с SVG на glibc Linux, workaround sharp >= 0.35.5; GHSA-p3m5-59mp-jv5r High DoS в App Router Server Actions; связанные upstream-адвизори GHSA-xqc2-xf4c-x3h3 и GHSA-h3gv-c5rc-p453; команды установки next@16.4.1 / next@15.5.28). https://nextjs.org/blog/nextjs-security-update-october-14-2026 - checked 2026-10-15
  2. Next.js - «November 2026 Security Release» (2026-11-03: v16.4.5 Active LTS + v15.5.29 Maintenance LTS заменяют 16.4.1 / 15.5.28; семь адвизори). https://nextjs.org/blog/november-2026-security-release - проверено 2026-11-07