
react CVE-2025-55182
Степень серьёзности: Критическая — CVSS 10.0
CWE: CWE-502 (Десериализация недоверенных данных)
Производитель: Meta (Facebook)
Раскрыта: 3 декабря 2025 года
CVE-2025-55182 — это уязвимость максимальной степени серьёзности, позволяющая неаутентифицированному злоумышленнику выполнять удалённый код (RCE) в React Server Components (RSC); ей присвоено название React2Shell. Дефект заключается в том, как React декодирует полезные нагрузки, отправляемые на эндпоинты React Server Function через Flight protocol. Злоумышленник может отправить единственный особым образом сформированный HTTP POST-запрос на уязвимый сервер и выполнить произвольный код — без учётных данных и без участия пользователя.
Приложения, которые не предоставляют явных эндпоинтов Server Function, по-прежнему уязвимы, если они поддерживают React Server Components.
| Пакет | Уязвимые версии | Исправленные версии |
|---|---|---|
react-server-dom-webpack | 19.0.0, 19.1.0, 19.1.1, 19.2.0 | ≥ 19.0.1 / 19.1.2 / 19.2.1 |
react-server-dom-parcel | 19.0.0, 19.1.0, 19.1.1, 19.2.0 | ≥ 19.0.1 / 19.1.2 / 19.2.1 |
react-server-dom-turbopack | 19.0.0, 19.1.0, 19.1.1, 19.2.0 | ≥ 19.0.1 / 19.1.2 / 19.2.1 |
Затронутые фреймворки (при использовании уязвимых пакетов React): Next.js 15.x / 16.x (App Router), React Router, Waku, RedwoodSDK, Parcel RSC, Vite RSC plugin.
Векторная строка: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
React Server Components используют двоичный сетевой формат под названием Flight protocol для потоковой передачи деревьев компонентов с сервера на клиент. Этот же протокол обслуживает Server Functions (ранее Server Actions) — вызываемые эндпоинты, принимающие сериализованные аргументы из браузера.
Уязвимость находится в десериализаторе: когда React обрабатывает Flight-полезную нагрузку, его можно обманом заставить создавать произвольные объекты на стороне сервера, что приводит к полному RCE. Поскольку Flight-эндпоинт доступен по умолчанию всегда, когда включён RSC, и поскольку на уровне протокола отсутствует аутентификационный барьер, для эксплуатации достаточно лишь сетевого доступа к серверу.
Включённый шаблон CVE-2025-55182.yaml использует три взаимодополняющих метода обнаружения.
Отправляет минимальный POST-запрос с заголовком Content-Type: text/x-component на корневой путь. Уязвимый (или доступный) RSC-сервер отвечает с тем же content-type и телом Flight-потока, строки которого начинаются с буквенно-цифровых идентификаторов строк, за которыми следует двоеточие (например, 0:, 1:), или со специальных символов ссылок React ($L, $S, $I, $@).
POST / HTTP/1.1
Content-Type: text/x-component
Accept: text/x-component, */*
Условие совпадения: HTTP 200 + заголовок text/x-component + регулярное выражение Flight-потока в теле ответа.
Next.js помечает RSC-запросы с помощью заголовка RSC: 1 и параметра запроса ?_rsc=. Этот запрос имитирует браузерный prefetch, чтобы подтвердить доступность Flight-эндпоинта App Router.
GET /?_rsc=1 HTTP/1.1
Accept: text/x-component
RSC: 1
Next-Router-State-Tree: %5B%22%22%2C%7B%7D%5D
Условие совпадения: HTTP 200 + заголовок text/x-component.
Отправляет минимальную некорректно сформированную Flight-полезную нагрузку вместе с заголовком Next-Action (механизм, используемый для вызова Server Functions). Уязвимый сервер пытается десериализовать полезную нагрузку; даже ответ с ошибкой, содержащий RSC-специфичные заголовки, подтверждает, что эндпоинт существует.
POST / HTTP/1.1
Content-Type: text/x-component
Next-Action: 0000000000000000000000000000000000000000
Условие совпадения: HTTP 200/400/500 + заголовок text/x-component или x-action-revalidated.
Сканирует локальные файлы *.json (например, package-lock.json, yarn.lock) на предмет имён уязвимых пакетов в сочетании с регулярным выражением для версий, соответствующим 19.0.0, 19.1.0, 19.1.1 или 19.2.0. Полезно для аудита репозиториев или CI-конвейеров без отправки какого-либо сетевого трафика.
# Install / update Nuclei
go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
nuclei -target CVE-2025-55182.yaml -u https://target.example.com
nuclei -target CVE-2025-55182.yaml -l targets.txt
nuclei -target CVE-2025-55182.yaml -target ./path/to/project
nuclei -target CVE-2025-55182.yaml -u https://target.example.com -v -je results.json
nuclei -target CVE-2025-55182.yaml -u https://target.example.com -rl 10 -timeout 10
Немедленно обновитесь до исправленной версии:
# npm
npm install react-server-dom-webpack@latest
# yarn
yarn upgrade react-server-dom-webpack react-server-dom-parcel react-server-dom-turbopack
# pnpm
pnpm update react-server-dom-webpack react-server-dom-parcel react-server-dom-turbopack
Минимальные безопасные версии для каждой ветки:
| Ветка | Минимальная безопасная версия |
|---|---|
| 19.0.x | 19.0.1 |
| 19.1.x | 19.1.2 |
| 19.2.x | 19.2.1 |
Временные меры снижения риска (если немедленное обновление невозможно):
text/x-component для входящих POST-запросов (правила Google Cloud Armor общедоступны для этого CVE).package-lock.json, node_modules или SBOM.Этот шаблон предназначен исключительно для авторизованного тестирования безопасности и оценки уязвимостей. Запуск его против систем, которыми вы не владеете или на тестирование которых у вас нет явного письменного разрешения, может быть незаконным. Авторы не несут ответственности за неправомерное использование.
| Показатель | Значение |
|---|
| Вектор атаки | Сеть |
| Сложность атаки | Низкая |
| Требуемые привилегии | Отсутствуют |
| Взаимодействие с пользователем | Не требуется |
| Область действия | Изменена |
| Конфиденциальность | Высокая |
| Целостность | Высокая |
| Доступность | Высокая |
| Общая оценка | 10.0 (Критическая) |