React2Shell - критическая RCE-уязвимость в React Server Components и Next.js. Что произошло и как быстро пофиксить

В конце 2025 года разработчики выявили уязвимость React2Shell (CVE-2025-55182/CVE-2025-66478), которая позволяет удалённо выполнять произвольный код на серверах, где запущены приложения на React Server Components (в том числе Next.js 15–16).

Уязвимости сразу присвоили CVSS 10.0, максимальный уровень критичности.

В статье разберём:

  • что такое React2Shell;

  • какие проекты под угрозой;

  • как проверить свою версию;

  • как правильно обновиться;

  • что делать, если приложение было доступно до фикса;

  • рекомендации по защите в продакшене.


Что такое React2Shell

React2Shell - это цепочка уязвимостей в реализации React Server Components (RSC), которая позволяет сформировать специальный запрос и добиться выполнения произвольного кода на сервере.

При этом атака не требует аутентификации, достаточно публичного доступа к RSC-эндпоинту.

Используются особенности протокола сериализации RSC и недостатки обработки "ссылок" на серверные функции.


Кто уязвим

Под угрозой находятся все приложения, использующие RSC:

  • Next.js версии 15.0.0–16.0.6 (включая некоторые canary-релизы 14.x)

  • React-проекты, использующие react-server-dom-webpack

  • Проекты на Vite/Parcel/Turbopack, если подключены RSC

  • Любые фреймворки, где есть RSC

Не уязвимы:

  • классические SPA на React (чистый client-side bundle)

  • Next.js 12–13 (если без App Router и RSC)

  • Next.js 14 без включённого RSC или ниже 14.3.0-canary.76


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

1. Проверка версии Next.js

npm ls next

или

yarn why next

Если версия между 15.0.0 и 16.0.6 включительно - обновляться обязательно.

2. Проверка зависимостей RSC-библиотек

npm ls react-server-dom-webpack

Если версия старше react 19.0.0 до патча - обновляться.


Как пофиксить: пример обновления

1. Обновление Next.js

Vercel выпустил безопасные версии: 15.5.7, 16.0.7, а также исправления во всех LTS-ветках.

npm:

npm install next@latest react@latest react-dom@latest --save

yarn:

yarn add next@latest react@latest react-dom@latest

pnpm:

pnpm add next@latest react@latest react-dom@latest

После обновления пересоберите проект:

npm run build

2. Обновление React Server DOM (если проект не на Next.js)

Если RSC используется вручную:

npm install react-server-dom-webpack@latest react@latest react-dom@latest

Что делать, если приложение было доступно до фикса

Даже если вы обновились, рекомендуется:

  1. Ротировать секреты

    • JWT секреты

    • API-ключи

    • OAuth-ключи

    • Ключи доступа к базе данных

    • AWS/GCP токены

  2. Пересобрать контейнеры и перекатить инстансы

  3. Проверить логи на подозрительные запросы


Дополнительная защита

Даже после обновления можно добавить меры безопасности.

1. Ограничить доступ к серверным функциям - в Next.js можно использовать middleware:

// middleware.ts
export function middleware(req) {
  const ua = req.headers.get('user-agent') || "";
  if (ua.includes("curl") || ua.includes("wget")) {
    return new Response("Forbidden", { status: 403 });
  }
}

Это не стопроцентная защита, но снижает вероятность автоматизированных атак.

2. Защитить специфические эндпоинты Cloudflare WAF или Nginx:

Nginx:

location ~* _rsc {
    deny all;
}

Cloudflare WAF rule:

URI Path contains "_rsc" → Block

Итоги

React2Shell - один из самых критичных инцидентов в истории React/Next.js.

Чтобы защитить свой проект:

  • обновить Next.js / React до патч-версии

  • пересобрать приложение

  • ротировать секреты

  • добавить WAF/дополнительные проверки

  • проверить логи

Комментарии (0)

Войдите, чтобы оставить комментарий