Исследование магистерской диссертации по CVE-2025-55182 (React2Shell). Модульная платформа эксплуатации с 6 сценариями атак (удалённое выполнение кода (RCE), эксфильтрация, дефейс), интерактивный обратный shell и полная уязвимая лаборатория для изучения Prototype Pollution и Insecure Deserialization в React Server Components.
Небезопасная десериализация + загрязнение прототипа в React Server Components
Неаутентифицированное удаленное выполнение кода через Server Actions Next.js
Затрагивает: React 19.0.0 - 19.2.0 · Исправление: React 19.0.1 / 19.1.2 / 19.2.1 (3 декабря 2025 года)
Демонстрация продвинутого эксплойта - базовые команды RCE, интерактивная оболочка и множественные векторы атак на уязвимое приложение Next.js
Этот репозиторий содержит моё исследование магистерской диссертации по CVE-2025-55182, критической (CVSS v3.1: 10.0) уязвимости удаленного выполнения кода в React Server Components.
Уязвимость возникает из-за небезопасного механизма десериализации в протоколе React Flight. При обработке серверных действий (Server Actions) Next.js десериализует входящие multipart-полезные нагрузки без надлежащей проверки. Злоумышленник может сформировать вредоносную нагрузку, которая загрязняет цепочку прототипов и внедряет произвольный JavaScript, выполняющийся на сервере через конструктор Function (и далее через child_process.execSync()).
Примечание о CVE-2025-66478: Компания Vercel выпустила параллельный CVE для отслеживания влияния этой же уязвимости на Next.js. Поскольку Next.js использует React в виде вендорной копии (vendored), многие сканеры зависимостей не обнаруживают его автоматически как уязвимый. Национальная база данных уязвимостей США (NVD) официально отклонила CVE-2025-66478 как дубликат CVE-2025-55182, хотя она продолжает упоминаться в информационном бюллетене безопасности самой Vercel.
Последующие уязвимости: Команда React впоследствии раскрыла две дополнительные проблемы, присутствовавшие в начальных версиях исправлений (19.0.1, 19.1.2, 19.2.1): CVE-2025-55184 (отказ в обслуживании, CVSS 7.5) и CVE-2025-55183 (раскрытие исходного кода, CVSS 5.3). Пользователям следует обновиться до версии 19.0.2, 19.1.3 или 19.2.2, чтобы устранить все три уязвимости.
| Аспект | Описание |
|---|---|
| Четыре модуля атаки | Удаление проектов, дефейс веб-сайта, кража переменных окружения, отключение серверов |
| Интерактивная оболочка | Постоянная оболочка со специальными командами и возможностью восстановления |
| Стабильная эксфильтрация | Построчное чтение для обхода ограничений размера HTTP-заголовков |
| Скрипт восстановления | Безопасное восстановление лабораторной среды после атак |
| Академическая документация | Анализ первопричины, разбор полезной нагрузки и временная шкала уязвимости |
CVE-2025-55182/
├── README.md # Этот файл
├── LICENSE # Лицензия MIT
│
├── exploit/
│ ├── exploit-explanation.md # Документация по использованию эксплойта
│ └── react2shell.py # Основной эксплойт — 4 модуля атаки + интерактивная оболочка
│
├── vulnerable-app/ # Уязвимое приложение Next.js
│ ├── README.md # Оригинальные сведения о vulnapp
│ ├── package.json # React 19.0.0 (уязвимая версия)
│ ├── app/ # Исходный код приложения
│ ├── curl_id.sh # Оригинальный скрипт эксплойта (от zack0x01)
│ └── scripts/
│ └── restore.sh # Скрипт восстановления (мой вклад)
│
└── docs/
├── screenshots/ # Демонстрации эксплуатации
│ ├── 01-app-initial.png
│ ├── 02-rce-basic.png
│ ├── 03-interactive-shell.png
│ ├── 04-no-payload.png
│ ├── 05-delete-result.png
│ ├── 06-deface.png
│ ├── 07-shutdown-servers.png
│ ├── 08-restore-from-script.png
│ └── 09-restore-from-interactive-shell.png
│
└── analysis/
├── 01-root-cause.md # Анализ первопричины уязвимости
├── 02-payload-breakdown.md # Структура полезной нагрузки и поток выполнения
└── 03-timeline.md # Временная шкала CVE
vulnerable-app/)cd vulnerable-app
npm install --legacy-peer-deps
npm run dev
# Приложение доступно по адресу http://localhost:3000
cd ../exploit
# Проверить, уязвима ли цель
python3 react2shell.py -u http://localhost:3000 --check
# Выполнить одиночную команду
python3 react2shell.py -u http://localhost:3000 -c "whoami"
# Режим интерактивной оболочки
python3 react2shell.py -u http://localhost:3000 -i
| Модуль | Команда | Описание | Воздействие |
|---|---|---|---|
| Удаление проектов | --delete-projects | Удаляет все проекты с панели управления | Уничтожение данных |
| Дефейс | --deface "сообщение" | Заменяет главную страницу | Дефейс |
| Кража окружения | --steal-env | Похищает переменные окружения | Эксфильтрация |
| Отключение серверов | --shutdown-servers | Отключает все серверы | Отказ в обслуживании |
React Server Components используют собственный механизм сериализации/десериализации (протокол "Flight") для передачи данных компонентов с сервера на клиент. При обработке серверных действий сервер десериализует входящие полезные нагрузки без надлежащей проверки.
Основной недостаток — доверие к поведению: десериализатор проверяет typeof obj.then === 'function' для идентификации Promise, не проверяя, принадлежит ли это свойство непосредственно объекту. Это позволяет злоумышленнику отравить Object.prototype.then, делая каждый обычный объект thenable.
Злоумышленник может сформировать вредоносную нагрузку, которая:
__proto__:thenFunction через $1:constructor:constructornew Function(_prefix)process.mainModule.require('child_process').execSync()X-Action-RedirectПользовательский режим (неаутентифицированный)
│
├─ POST / (конечная точка Server Action Next.js)
│ ├─ Заголовки: Next-Action: x
│ └─ Тело multipart со вредоносным JSON
│
└─ Десериализатор React Flight обрабатывает нагрузку
└─ Загрязнение прототипа через __proto__:then
└─ Конструктор Function достигнут через $1:constructor:constructor
└─ new Function(_prefix) выполняет JavaScript злоумышленника
└─ execSync() запускает системную команду
└─ Вывод встраивается в ошибку NEXT_REDIRECT
└─ Next.js преобразует в заголовок X-Action-Redirect
Уязвимость затрагивает любое приложение Next.js, использующее App Router с React Server Components — конфигурация по умолчанию, начиная с Next.js 14. Явно определённые Server Actions не обязательны; достаточно наличия затронутых пакетов RSC.
Эта уязвимость позволяет неаутентифицированному злоумышленнику:
1. [АТАКУЮЩИЙ] Отправить сформированный multipart POST на любую конечную точку Server Action
2. [СЕРВЕР] Десериализатор React обрабатывает вредоносный JSON
3. [СЕРВЕР] Загрязнение прототипа отравляет Object.prototype.then
4. [СЕРВЕР] Обычный объект рассматривается как thenable; достигнут конструктор Function
5. [СЕРВЕР] new Function(_prefix) выполняет произвольный JavaScript злоумышленника
6. [СЕРВЕР] execSync() запускает системную команду; вывод захвачен
7. [СЕРВЕР] Вывод встраивается в дайджест ошибки NEXT_REDIRECT
8. [СЕРВЕР] Next.js возвращает заголовок X-Action-Redirect с URL-кодированным выводом
9. [АТАКУЮЩИЙ] Извлечение и URL-декодирование результата команды из заголовка
Все тесты проводились на изолированной ВМ VirtualBox с Kali Linux 2026.1, Next.js 15.0.0 и React 19.0.0, без сетевого доступа.
| Модуль атаки | Результат | Примечания |
|---|---|---|
| Выполнение команд | ✅ RCE подтверждено | whoami, id, uname -a работают стабильно |
| Удаление проектов | ✅ Панель управления изменена | Проекты удалены, структура React сохранена |
| Дефейс | ✅ Сайт обезображен | Отображается пользовательское сообщение |
| Кража окружения | ✅ Переменные окружения извлечены | Сохранены в stolen_env.txt |
| Отключение серверов | ✅ Все серверы показаны как остановленные | UI обновлён, React функционален |
| Интерактивная оболочка | ✅ Постоянная оболочка | Доступны специальные команды |
| Восстановление | ✅ Исходное состояние восстановлено | Через скрипт restore.sh |
Детерминированность: В отличие от вероятностных эксплойтов (например, heap spray), CVE-2025-55182 полностью детерминирована — любой корректно сформированный HTTP POST-запрос приводит к RCE с вероятностью 1 на любой незапатченной системе с React 19.0.0–19.2.0 и включёнными React Server Components.
| Документ | Описание |
|---|---|
| Анализ первопричины | Ошибка десериализации и загрязнение прототипа в React Flight |
| Разбор полезной нагрузки | Построчный анализ структуры вредоносного JSON |
| Временная шкала CVE | Хронология обнаружения, раскрытия и исправления |
Это исследование является частью моей магистерской диссертации по кибербезопасности (UCAM — Campus Internacional de Ciberseguridad), посвящённой анализу N-Day уязвимостей в различных средах.
Данный CVE представляет вектор современных JavaScript-фреймворков в рамках диссертации, демонстрируя:
Ключевые слова: RCE · Загрязнение прототипа · Десериализация · React · Next.js · Server Actions · CVE-2025-55182
Annais Molina (devianntsec) — Исследователь безопасности | Магистр кибербезопасности (UCAM)
Лицензия MIT — см. LICENSE
Данный репозиторий предоставлен исключительно в образовательных целях и для исследований в области безопасности в рамках академической магистерской диссертации. Все тесты проводились на изолированных виртуальных машинах без сетевого доступа. Используйте только на системах, которыми вы владеете или на которые имеете явное письменное разрешение на тестирование. Несанкционированное использование против систем незаконно и может привести к уголовному преследованию.