Исследование магистерской диссертации по 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