Безлимитные аккаунты
Подробнее
Журнал Gerwin
Журнал Gerwin

CVE-2025-55182 (React4Shell): Анализ уязвимости и исправление в Next.js

Руководство по устранению уязвимости React4Shell. Команды для обновления React/Next.js и временные меры защиты
CVE-2025-55182 (React4Shell): Анализ уязвимости и исправление в Next.jsCVE-2025-55182 (React4Shell): Анализ уязвимости и исправление в Next.js

В декабре 2025 года стала известна критическая уязвимость CVE-2025-55182 (псевдоним React4Shell или React2Shell). Она находится в механизме React Server Components (RSC) – новом способе React выполнять часть кода на сервере.

Уязвимость обнаружил исследователь Лахлан Дэвидсон, и 3 декабря React-команда выпустила исправления.

Проблема позволяет любому злоумышленнику без входа в систему отправить на сервер специальный HTTP-запрос и добиться выполнения кода на сервере.

Учитывая популярность React/Next.js (десятки миллионов сайтов, включая Netflix и Airbnb), масштабы возможных атак очень велики. AWS Security зафиксировала активную сканирующую атаку групп из Китая сразу после публикации уязвимости.

Поэтому необходимо срочно обновиться.

Уязвимость React4Shell (CVE-2025-55182) позволяет удалённо выполнить произвольный код на сервере без аутентификации
Уязвимость React4Shell (CVE-2025-55182) позволяет удалённо выполнить произвольный код на сервере без аутентификации

Что за уязвимость и чем опасна

React Server Components (RSC) – это технология, появившаяся в React 18 (2020), которая даёт возможность запускать функции и формировать части страницы на сервере, а не в браузере. При этом React-клиент отправляет "запрос" на сервер (через специальный протокол Flight), сервер выполняет React-функцию и возвращает результат. CVE-2025-55182 возникает в шаге «десериализации» полученных данных: React неправильно обрабатывает входящий payload и позволяет внедрить вредоносные объекты.

Говоря простыми словами, злоумышленник может подделать запрос таким образом, что сервер «поверит» ему и выполнит любой код – например, запустит команду ОС или скрипт JavaScript от имени сервера. Примером атаки может быть выполнение команды whoami на сервере или чтение файлов. В одном из опубликованных PoC злоумышленник делает POST-запрос типа:

curl -X POST http://your-server/formaction \
-F '$ACTION_REF_0=' \
-F '$ACTION_0:0={"id":"child_process#execSync","bound":["whoami"]}'

...и в ответ получает результат выполнения whoami на сервере. Подобные цепочки (child_process.execSync, vm.runInThisContext, fs.readFileSync и т.д.) позволяют выполнять команды, запускать JS-код и читать или записывать файлы на сервере. Причём запрос проходит до любой аутентификации или авторизации – это удалённое выполнение кода без авторизации (RCE, CVSS 10.0).

Важно: уязвимость активна только если вы используете серверные React-компоненты (RSC). Если приложение работает только на клиенте (обычный React без серверной части) или вы отключили RSC, его можно считать не затронутым. Но по умолчанию в новых проектах (например, в Next.js App Router) RSC включены. Даже если вы прямо не пишите серверных функций, фреймворк может автоматически их генерировать, и тогда вы всё равно уязвимы.

Затронутые версии React и Next.js

Уязвимость присутствует в React Server Components версий 19.0.0, 19.1.0, 19.1.1 и 19.2.0. Конкретно это пакеты react-server-dom-webpack, react-server-dom-parcel и react-server-dom-turbopack версии 19.0.0–19.2.0. Исправления включены в версии 19.0.1, 19.1.2 и 19.2.1.

Уязвимость также затрагивает Next.js: в Next.js 15-х и 16-й версий (с App Router по умолчанию используется RSC). Изначально для Next.js был выпущен отдельный идентификатор CVE-2025-66478, но его быстро признали дубликатом CVE-2025-55182.

Уязвимые версии Next.js: 15.0.4, 15.1.8, 15.2.5, 15.3.5, 15.4.7, 15.5.6 и 16.0.6. Соответственно, исправления вышли в Next.js 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7 и 16.0.7. Пользователям рекомендовано обновить Next.js до этих или более новых версий (или до последней версии канала, если вы на 14.х надо откатиться).

Кроме того, уязвимые серверные React-компоненты входят в состав некоторых библиотек и фреймворков на базе React. Среди них:

  • React Router (experimental RSC)
  • Redwood SDK (rwsdk)
  • Waku
  • RSC-плагины Vite (@vitejs/plugin-rsc)
  • Parcel (@parcel/rsc)

Если вы используете эти фреймворки, проверьте их зависимые версии RSC. В React Router, например, при активации экспериментального режима RSC тоже может срабатывать эта уязвимость. Если ваше приложение вообще не использует ни один из перечисленных компонентов/плагинов — скорее всего, оно невосприимчиво к React4Shell.

Как проверить уязвимость

Чтобы убедиться, уязвим ли ваш проект, проверьте в package.json зависимости и версии React/Next.js:

  • Если у вас React 19.х и есть зависимость от react-server-dom-* версии из диапазона 19.0.0-19.2.0, уязвимость есть.
  • Если вы используете Next.js 15.х или 16.x c App Router (создавали проект через create-next-app без явного отключения RSC) — уязвимость тоже может быть.
  • Некоторые сервисы сканируют облака: по данным Wiz Research уязвимые Next.js/React найдены в ~39% облачных сред, но если ваш сервер стоит локально, важно проверить именно ваши пакеты.

Можно на время тестирования запустить приложение и попытаться выполнить простую команду через RSC. Например, добавить на сервер заглушку-функцию или endpoint и послать на него curl, как в примере выше. Но проще и правильнее сразу обновить библиотеки.

Как защититься и устранить уязвимость

1. Срочно обновите зависимости

Самый эффективный способ защиты — установить защищённые версии React и Next.

  • Для React обновите пакеты до версий 19.0.1 или выше. Например:
    npm install react@19.0.1 react-dom@19.0.1 react-server-dom-webpack@19.0.1
    

    (или просто @latest, если проект позволяет). Это включает исправление для CVE-2025-55182. В React 19.1.2 и 19.2.1 уязвимость уже отсутствует.
  • Для Next.js обновитесь до патчей:
    npm install next@16.0.7
    

    ИЛИ, если вы используете 15.х:
    npm install next@15.5.7
    

    (для конкретного мажора подберите последнюю рекомендованную: 15.1.9, 15.2.6 и т.д. – см. официальный блог). Это обновление закрывает как основную уязвимость, так и её дубликат в Next.js. Если вы по каким-то причинам тестировали бету Next.js 14.3.0+ (canary), откатитесь на стабильную версию 14.х.
  • Дополнительные фреймворки: Если вы используете React Router с экспериментальным RSC, Expo, Redwood SDK, Waku или плагины Vite/Parcel для RSC, следуйте инструкциям разработчиков: обновите react-server-dom-... и сами фреймворки до последних версий. Например, для React Router:
    npm install react@latest react-dom@latest react-server-dom-parcel@latest react-server-dom-webpack@latest @vitejs/plugin-rsc@latest
    

    Для Expo/Redwood/Waku обычно достаточно обновить их до последних сборок или обновить react-server-dom-webpack.

После обновлений перезапустите сборку и приложение, убедитесь, что нет старых версий пакетов. Проверьте, что в node_modules нет версий 19.0.0-19.2.0.

2. Используйте защиту на уровне сети

Пока вы обновляете код, рекомендуется включить WAF/NGFW-правила, блокирующие характерные атаки React4Shell.

Многие облачные провайдеры уже предоставляют это автоматически или по запросу:

  • Akamai, Cloudflare, AWS, Google Cloud, Vercel и др. выпустили правила для своих веб-фильтров (WAF). Убедитесь, что они активированы и обновлены. Например, Cloudflare по умолчанию защищает клиентов (включая бесплатных) через свой WAF, а AWS WAF требует ручного включения специального набора правил.
  • Kaspersky NGFW: в Kaspersky интегрирован модуль защиты от React4Shell — соответствующие сигнатуры уже в составе NGFW. Если вы используете Kaspersky для сети, обновите его и включите защиты по CVE-2025-55182.
  • Другие WAF/IDS: провайдеры уже делятся правилами обнаружения (например, в виде блоков подозрительных POST-запросов). Можно самостоятельно добавить фильтр на основе рекомендаций Securelist.

Главное помнить, что любая сетевая защита — это временная мера: она даёт время на обновление, но не заменяет патчинг.

3. Проверка после обновления

Убедитесь, что уязвимость действительно устранена: обновите своё приложение и выполните тестовые запросы. Если ваш стек подразумевает клиент-серверную составляющую, попытайтесь повторить curl-тест (как выше) или используйте сканеры CVE. Отсутствие выполнения команд и сообщений об ошибках после обновления будет говорить об успехе.

4. Ограничьте доступ (временно)

До обновления можно ограничить доступ к серверным эндпоинтам: например, закрыть их с помощью сети (firewall), отключить RSC в конфигурации (если возможно) или настроить аутентификацию. Однако это часто сложно сделать быстро, поэтому приоритет всё же — как можно скорее обновить библиотеки.

Подведение итогов

CVE-2025-55182 — это очень серьёзная уязвимость в React Server Components, позволяющая выполнять любой код на сервере без проверки. Она актуальна для множества современных проектов на React и Next.js.

Главные шаги защиты — срочно обновить React и Next.js до безопасных версий, а также учесть рекомендации вендоров (Cloudflare, AWS, Akamai и т.д.), которые уже реализовали защитные правила. После обновления и настройки WAF убедитесь, что приложение работает корректно и атаки блокируются.

Безопасность сервера и данных — это приоритет. Не откладывайте обновления и следите за новыми сообщениями разработчиков React/Next.js. Подробную информацию о CVE-2025-55182 можно найти в официальных источниках и блогах безопасности (Kaspersky, Habr, AWS).

Источники

Еще нет аккаунта в Gerwin AI?

Пора исправлять ситуацию