logo Luckylo

Блог

07.12.2025

Обнаружена уязвимость в React и Next.js. Критический баг CVE-2025-55182 (часто его называют React2Shell/React4Shell).

CVE-2025-55182

Что случилось и почему это важно.

В начале декабря 2025 года команда React опубликовала security-advisory: в реализациях React Server Components обнаружена критическая ошибка, позволяющая атакующему отправить специально сформированный HTTP-запрос к серверному endpoint’у RSC и добиться выполнения произвольного кода на сервере. Уязвимы React 19.0.0, 19.1.0, 19.1.1 и 19.2.0 в пакетах react-server-dom-webpack, react-server-dom-parcel и react-server-dom-turbopack.

Ключевая проблема — небезопасная десериализация входящих данных в протоколе Flight. Серверная часть React принимает бинарный/структурированный payload, восстанавливает из него дерево компонентов и ссылки на серверные функции, но при этом доверяет содержимому больше, чем должна. Достаточно аккуратно сконструировать запрос так, чтобы десериализатор «собрал» структуру, приводящую к выполнению атакующего кода в процессе Node.js (или в среде, где крутится серверный рендеринг).

Почему это выглядит страшно:

  1. Атака предаутентификационная. Эксплуатация возможна без логина и токенов — нужен только сетевой доступ к публичному домену приложения.
  2. Дефолтные конфигурации уязвимы. Исследователи показали, что даже только что созданный проект create-next-app на уязвимых версиях React/Next.js можно атаковать без каких-либо нестандартных настроек или ошибок в бизнес-логике.
  3. Поверхность атаки огромна. React 19 и Next.js 15/16 уже используются в производстве у крупных компаний и в тысячах обычных SaaS/маркетинговых проектов; оценки некоторых вендоров говорят о десятках процентов облачных окружений с потенциально уязвимыми инстансами.

Кого именно задевает уязвимость

Уязвимость не «во всём React», а именно в серверной части React Server Components. Это значит:

Задеваются:

  1. Next.js-проекты, использующие App Router + React 19 + Server Components / Server Actions;
  2. другие фреймворки/бандлеры, внедряющие RSC: современные конфиги React Router RSC, Waku, плагины RSC для Vite и Parcel и т.п.

Не задеваются:

  1. чисто клиентские React-SPA без SSR и RSC;
  2. Next.js с Pages Router на React 18;
  3. полностью статически экспортированные сайты, где сервер не обрабатывает RSC-запросы.

Но важно понимать, что современный Next.js по умолчанию создаёт App Router-проекты с включёнными Server Components. Многие команды даже не отдают себе отчёта, что у них уже используется RSC: это просто идёт «в комплекте» со стандартным шаблоном. Поэтому безопаснее считать любой продакшен на Next.js 15/16 потенциально уязвимым, пока вы явно не проверили версии и конфигурацию.

Что может сделать атакующий

При успешной эксплуатации CVE-2025-55182 атакующий получает выполнение произвольного кода в контексте вашего серверного процесса. Типичные последствия:

  1. чтение/модификация данных в БД, если у приложения есть доступ;
  2. кража секретов из переменных окружения и конфигов: API-ключи, JWT-секреты, доступы к платёжным шлюзам и облакам;
  3. установка бэкдора, запуск криптомайнера;
  4. использование скомпрометированного инстанса как точки опоры для атак на другие сервисы в вашей инфраструктуре.

Отдельный риск: уже есть публичные PoC-эксплойты, массовое сканирование началось буквально в первые сутки после публикации advisory, а крупные облака (AWS, Google Cloud и др.) фиксируют реальные попытки эксплуатации со стороны группировок, в том числе связанных с государственными актёрами.

Какие есть патчи

React выпустил исправления для всех затронутых веток: 19.0.1, 19.1.2 и 19.2.1, где логика декодирования Flight-payload переработана и больше не допускает опасной десериализации.

Next.js, в свою очередь, обновил все поддерживаемые линии:

  1. для Next.js 15 доступны патч-релизы: 15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7;
  2. для Next.js 16 — патч 16.0.7;
  3. если вы сидите на canary-сборках Next.js 14 (≥14.3.0-canary.77) с поддержкой React 19/RSC — рекомендуется откатиться на последний стабильный 14.x, где RSC-имплементация ещё не включает уязвимый код.

Параллельно Vercel и облачные провайдеры задеплоили временные фильтры трафика (WAF-правила, сигнатуры для IDS/IPS), но сами подчёркивают: это только дополнительный слой защиты, а основное средство — обновление зависимостей и повторный деплой приложений.

Уроки для команд

Эта история очень наглядно показывает несколько вещей:

  1. фронтенд-фреймворк с серверными возможностями (RSC, Server Actions) наследует классические backend-уязвимости — RCE, небезопасная десериализация, атаки на внутренние протоколы;
  2. SCA-сканеры и мониторинг CVE по зависимостям теперь must-have даже для «просто фронта»;
  3. нужна формализованная процедура реагирования: кто следит за advisory React/Next.js, кто оценивает затронутые сервисы, кто отвечает за быстрый патч-релиз и ротацию секретов.

И даже при наличии таких багов ущерб сильно ограничивается, если вы соблюдаете принцип минимально необходимых привилегий: контейнеры изолированы, у Next.js-сервиса только нужные доступы, секреты лежат в secret-manager’е, а не в «толстом» .env. Тогда даже критический RCE не превращается автоматически в полный захват инфраструктуры.

Что делать владельцам проектов на Next.js 14, 15 и 16

Ниже — практические шаги по версиям. Я ориентируюсь на официальные advisory React и Next.js плюс сводки от Vercel и крупных вендоров.

Если у вас проект на Next.js 14

Проверить, затронут ли вы вообще

Открой package.json:

  1. если "next": "14.x" (стабильные 14-е релизы) и вы сидите на React 18 — конкретно CVE-2025-55182 вас не касается, потому что уязвима реализация RSC в React 19;
  2. если "next": "14.3.0-canary.77" или выше canary, и/или вы вручную подвезли React 19 и RSC-пакеты, проект может быть уязвим.

Проверьте код:

  1. используете ли вы App Router c серверными компонентами (app/ с export const dynamic, server actions, async-компоненты и т.п.);
  2. есть ли прямое использование react-server-dom-* пакетов.

Рекомендованные действия

Если вы на стабильном Next.js 14 + React 18:

  1. всё равно обновитесь до последнего патча 14.x, чтобы иметь актуальные баг-фиксы и security-улучшения не по этому CVE, а в целом;
  2. убедитесь, что вы не тянете React 19 через peerDependencies/overrides, и не используете экспериментальный RSC-стек.

Если вы на canary-ветке 14 с React 19 / RSC:

  1. Зафиксируйте состояние (теги в Git, бэкапы).
  2. Откатитесь на стабильный 14.x согласно официальной рекомендации React/Next:
    
    npm install next@14 react@18 react-dom@18
    
    и приведите код к поддерживаемому API, если использовали экспериментальные фичи.
  3. Пересоберите и задеплойте проект.
  4. На всякий случай проверьте логи на наличие странных запросов к внутренним RSC-endpoint’ам за последние дни.

Если у вас Next.js 15

Определяем конфигурацию

В package.json: "next": "15.x" — это ветка, которая по умолчанию уже рассчитана на React 19 (особенно App Router).

Посмотрите, как устроен проект:

  1. если вы используете App Router (директория app/) и серверные компоненты — считайте проект затронутым, пока не убедитесь, что стоите на патч-версии Next и React;
  2. если у вас только Pages Router на React 18 — риск по данному CVE значительно ниже, но многие команды мигрировали часть функционала в App Router, даже не заметив.

Обновление до безопасной версии

Рекомендованный путь (на момент написания) — обновиться до актуальной патч-версии из вашей минорки или сразу до 15.5.7 (или новее, если уже вышло). Список безопасных патчей: 15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7.

Пример для npm:


npm install next@15.5.7 react@19.2.1 react-dom@19.2.1

(точные версии React берём из официального advisory; сейчас это 19.0.1/19.1.2/19.2.1 — выбирайте последнюю доступную).

Дальше:

  1. Обновите eslint-config-next до совместимой версии.
  2. Запустите тесты, линтер, E2E (если есть).
  3. Пересоберите и задеплойте прод.

Минимизация последствий после обновления:

  1. Проверьте логи (reverse-proxy, WAF, приложение) на аномальные POST/GET к внутренним RSC-endpoint’ам за период с публикации CVE.
  2. выполните ротацию всех чувствительных секретов, которые могли быть доступны из этого сервиса (ключи БД, JWT-секреты, ключи платежей, доступы к S3/VK Cloud и т.п.);
  3. при наличии SOC/безопасника заведите инцидент и зафиксируйте артефакты.

Если у вас Next.js 16

Next.js 16 — текущая активная LTS-ветка, она тоже базируется на React 19 и App Router по умолчанию, поэтому попадает в зону риска.

Вам нужно:

  1. Обновить Next.js минимум до 16.0.7 — это первый патч, в который уже встроен исправленный React/Flight.
  2. Обновить react и react-dom до последних патчей 19.x, указанных в advisory.
  3. Пересобрать и задеплойть.

Пример:


npm install next@16.0.7 react@19.2.1 react-dom@19.2.1

Усиление защиты вокруг

Параллельно с обновлением:

  1. Проверьте, что перед приложением есть WAF/Firewall (у Vercel уже включён свой Firewall с сигнатурами для этой уязвимости, но для self-hosted решений стоит настроить правила отдельно).
  2. Ограничьте входящий трафик только нужными портами и доменами.
  3. Убедитесь, что контейнер/сервер с Next.js имеет минимально необходимые права в сети и к БД.

Постинцидентные шаги (такие же, как для 15-й ветки)

  1. Анализ логов на необычные запросы/ошибки в RSC-маршрутах.
  2. Ротация секретов при малейших признаках компрометации.
  3. Актуализация внутренних playbook’ов по реагированию на CVE.

Счастливого кодинга! 🚀