The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Уязвимость в серверных компонентах React, позволяющая выполнить код на сервере

04.12.2025 11:12

В серверных компонентах web-фреймворка React (RSC, React Server Components) устранена уязвимость (CVE-2025-55182), позволявшая через отправку запроса к серверному обработчику выполнить произвольный код на сервере. Проблеме присвоен критический уровень опасности (10 из 10). Уязвимость проявляется в экспериментальных компонентах react-server-dom-webpack, 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.

Дополнение: Пример эксплоита оказался не действующим. Общий принцип эксплуатации и метод атаки через прототипы объектов подтверждены, но привязка к модулям vm, child_process и fs ошибочна (в пока не опубликованном реальном эксплоите задействовано какое-то не привязанное к внешним модулям внутреннее свойство).

  1. Главная ссылка к новости (https://react.dev/blog/2025/12...)
  2. OpenNews: Атака на Node.js через манипуляции с прототипами объектов JavaScript
  3. OpenNews: Google продемонстрировал эксплуатацию уязвимостей Spectre через выполнение JavaScript в браузере
  4. OpenNews: В репозитории Hugging Face выявлены вредоносные AI-модели, выполняющие код
  5. OpenNews: Критическая уязвимость в Apache Log4j 2, затрагивающая многие Java-проекты
  6. OpenNews: Критическая 0-day уязвимость в Spring Framework, применяемом во многих Java-проектах
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/64373-react
Ключевые слова: react, next.js
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (49) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Мохнонос (?), 11:50, 04/12/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +4 +/
    PHP-дыряв! Кричали они.
    PHP-неактуален! Вторили им, другие.
    А вот нода, питоны и прочее новомодное - единственное правильное решение! Хором заявили они же, совместно.
     
     
  • 2.2, Аноним (-), 11:55, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • +11 +/
    От этой новости ПЫХа менее дырявой не стала)
    Тут теорема г-на Эскобара во всей красе.

    > питоны и прочее новомодное

    Причем тут питон, если нода на JS написана??

    Но тебя никто не заставляет им пользоваться.
    Можешь обмазываться  ̶о̶в̶н̶о̶ ПХПой.

     
     
  • 3.27, Аноним (27), 14:40, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Нода на плюсах написана. Не путай с реактом, о котором речь в новости.
     
     
  • 4.38, Самый Лучший Гусь (?), 16:07, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • –4 +/
    У плюсов и js синтаксис сишный так что разница не аж до луны
     
  • 4.54, _ (??), 03:29, 05/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > Нода на плюсах написана.

    Ыгсперты опенета сегодня особенно, цЫнично беспощадны! :~~-)))))

     
  • 2.8, Аноним (8), 12:25, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • +8 +/
    в php подобные штуки были из коробки (allow_url_include и т.п.), а тут люди специально постарались, чтобы такое же сделать

    гении, чо

     
  • 2.14, Аноним (14), 13:28, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Вот вам про ваш любимый компостер.
    Читайте, наслаждайтесь.

    https://www.cve.org/CVERecord/SearchResults?query=composer

     
  • 2.16, Аноним (14), 13:30, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Кстати, на опеннете нет новостей про CVE про компостер или перловый CPAN. Только про NPM пишут. Хотя в компостере очень много CVE.
     
  • 2.20, Аноним (20), 13:59, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Питоны новомодное? Python, пожалуй, постарше Пыха будет.
     
  • 2.21, penetrator (?), 14:01, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    не-не-не, я не говорил, я говорил, что нода такое же убожество, как сам JS, в частности в новости про Bun писиал про ненужное, но всё потерли
     

  • 1.3, Аноним (-), 11:56, 04/12/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > Уязвимость проявляется в экспериментальных компонентах

    А ведь когда в nginx была дырень, то все кричали "это экспериментальная фича, ничего страшного".
    А тут такая трагедия.

     
  • 1.5, 12yoexpert (ok), 11:58, 04/12/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    странно, вроде бы серьёзный язык для адекватныx взрослыx теxнарей
     
     
  • 2.6, Аноним (6), 12:06, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Этот язык - альма матер всех сеньоров-растокодеров
     
  • 2.26, User (??), 14:38, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Ээээээ... а конкретно тут язык - при чем?
     
     
  • 3.33, 12yoexpert (ok), 15:27, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    язык отличный, не зря ведь 95% им пользуются
     
  • 3.43, Аноним (43), 19:14, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > а конкретно тут язык - при чем?

    Отличный ответ! Надо взять на вооружение против растсеров, которые катят бочку на Си.

     
     
  • 4.44, User (??), 20:00, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • –2 +/
    >> а конкретно тут язык - при чем?
    > Отличный ответ! Надо взять на вооружение против растсеров, которые катят бочку на
    > Си.

    В случае с логическими ошибками? Берите конечно же.

     
     
  • 5.53, Аноним (43), 02:05, 05/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > В случае с логическими ошибками

    А что, бывают синтаксические ошибки в скомпилированной программе?!

     
  • 2.28, th3m3 (ok), 14:46, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • +4 +/
    Серьёзный язык? Это ты про js? Хорошая шутка)) Язык гoвнокодеров. Некоторые сайты уже больше гига в памяти занимают и тормозят даже на мощном железе. Вот ради чего?
     
     
  • 3.35, Аноним (14), 15:30, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Сайты тормозят по разным причинам: фингерпринт какой-нибудь, аналитика, ну или мэйнеры на помойных сайтах. И JS там ни при чём по сути. Смешно представить серьёзный язык. Это надо будет выковыривать уточки памяти на сайтиках на плюсах или на сишке (серьёзные язычки, лол).
     
  • 2.49, Кошкажена (?), 21:58, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > вроде бы серьёзный язык для адекватныx взрослыx теxнарей

    В котором можно перетирать проверку свойств? Ну-ну.

     

  • 1.7, Анонисссм (?), 12:24, 04/12/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • –3 +/
    не понимаю как реакт позволит выполнить код на сервере, если на сервере spring, а реакт у клиента )
     
     
  • 2.11, Аноним (11), 12:42, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Можно просто прочесть статью и там все будет понятно расписано
     
  • 2.18, Аноним (14), 13:38, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Реакт умеет SSR.
     

  • 1.9, Аноним (9), 12:33, 04/12/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    В конце нулевых году похожая, практически идентичная уязвимость в xml-rpc обошлась одному финансовому сервису в полмиллиона долларов, которые увели суммарно со всех электронных кошельков.

    Прошло почти 20 лет, и вот оно снова. Ждём интересных взломов.

     
  • 1.10, Аноним (10), 12:37, 04/12/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Вот прогресс! Просто закидываешь комманды на сервер и получаешь ответ! RPC некурильщика!
     
  • 1.12, Аноним (12), 13:10, 04/12/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Хотел понять, чем вызвана уязвимость, перешёл по ссылке на пулл-реквест с исправлением из новости https://github.com/facebook/react/pull/35277 .

    Итого: 1 коммит, 270 строк удалено, 710 строк добавлено. Какой-то рефакторинг, какие-то функциональные изменения. Они там перед релизом все изменения в один коммит сквошат? Этакий опенсорз от фейсбука, чтоб было не очевидно есть в коде проблемы или нет (что собственно и привело к таким уязвимостям)? Спасибо хоть не обфусцировали, хотя уже и неважно.

    В общем, не настолько мне интересно, где конкретно они накосячили, чтоб в их испражнениях ковыряться. Буду думать, что просто миллион обезьян посадили за компьютер, а когда оно перестало выдавать синтаксические ошибки, закоммитили в релиз.

     
     
  • 2.13, Аноним (12), 13:27, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    О! Кто-то прошёл по ссылкам, разобрался в теме и добавил в новость ответ на мой вопрос.

    Спасибо тебе, Человечище!

     
  • 2.30, Кошкажена (?), 15:12, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > Они там перед релизом все изменения в один коммит сквошат?

    Вообще это нормальная практика, если все изменения по делу. А чтобы это понять, то нужно проекта знать.

     
     
  • 3.34, Аноним (12), 15:30, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > Вообще это нормальная практика

    А, ну тогда ладно. Напишу Торвальдсу на почту, чтоб не заморачивался и перед релизом ядра все коммиты сквошил в один.

     
     
  • 4.37, Аноним (-), 15:38, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > А, ну тогда ладно. Напишу Торвальдсу на почту, чтоб не заморачивался и
    > перед релизом ядра все коммиты сквошил в один.

    Какая тyпая аналогия /_-
    Тут весь код относящийся к одному фиксу превратили в один коммит.
    Атомарное изменение чтобы не писать
    Fix issue
    Fix issue (lost case)
    и тд

    Если тебе сильно не нравится - не делай так, но чего бухтеть?

     
     
  • 5.42, Аноним (12), 17:54, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > Тут весь код относящийся к одному фиксу превратили в один коммит.

    Те, кто этот коммит делали, считают по-другому:

    > We did a number of refactors [...]
    > This also fixes a critical security vulnerability.

    Вы тоже видите это "also" во второй строке? И по коду я не вижу, чтобы упомянутое исправление с hasOwnProperties как-то коррелировало с другими изменениями.

    > Если тебе сильно не нравится - не делай так

    Я так и не делаю. Я делаю отдельный коммит с исправлением проблемы, а потом второй, с не относящиимся к уязвимости рефакторингом.

    > чего бухтеть?

    Чего бы и не побухтеть, если лидер рынка пишет один из самых популярных проектов на планете спустя рукава.

     
     
  • 6.46, Аноним (46), 20:11, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    лол. это всё что они за день накрутивертили - запушили, перед начальством отчитаться - иначе это просто один багфикс и рефактор, а так - проведена серьёзная работа с кодом, включая устранение опаснейшей уязвимости. короче, по банану и спать хддд
     
  • 2.40, Сосиска (?), 16:54, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Просто поиском по странице ищешь hasOwnProperty и там будет 3 файла исправлено по делу. Вообще, у меня сложилось впечатление, что это излишнее паникёрство. Это тестовое или дев окружение. В противном случае, я не знаю, зачем клиенту давать вызвать на сервере функцию с произвольными данными.
     
     
  • 3.47, Аноним (46), 20:22, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    а я тебе скажу откуда это. пока в локалке от руки черновик быстренько накидываешь - не всегда вовремя соображаешь приписать туду заменить на безопасную функцию. творческим и неорганизованным посвящается.
     

  • 1.15, Аноним (15), 13:28, 04/12/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Нечего не понял. Реакт это же какая-то там javascript библиотека для добавления анимации на страницы, откуда там что-то на севере.
     
     
  • 2.17, Аноним (14), 13:37, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Так-то реакт разворачивается на сервере. В проде это нгинкс, в деве - нода. JS очень давно пользуется в бэкендах, вот то что нода не популярна для бэкенда в России и СНГ, это да. А вот на западе всякие стартапы пользуют обычно ноду. Кстати, только на ЛОРе и Опеннете такой хэйт JS, на западе не хэйтят JS.
     
     
  • 3.22, Аноним (15), 14:05, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • –3 +/
    ЖС отличный язык, сам по себе.

    Но вот область применения у него так себе.

     
     
  • 4.23, Витюшка (?), 14:12, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Да нет, это ужаснейший отвратительный язык. У него performance хороший (спасибо браузерам) и хорошая экосистема (тулинг)
     
     
  • 5.25, 12yoexpert (ok), 14:30, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    экосистема отличная, раз в неделю бедные копипастеры и председатели госсайтов поют ей оды
     
  • 3.41, Аноним (41), 17:31, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Вопросы к этому подходу стандартные:
    1. Как?
    2. На пуркуа?
    рендерить куски страницы на сервере и фетчем/XHR подтягивать клиенту? Или фронтэндеры настолько тупые, что не могут без JSX?
     
  • 2.32, Аноним (32), 15:24, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Эксперименты, сэр.
     

  • 1.29, morphe (?), 15:05, 04/12/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    > не исключавшего подстановку прототипа

    Deno в очередной раз показал своё превосходство над другими JS рантаймами

     
     
  • 2.36, Аноним (14), 15:32, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Но Deno мало где используется, в РФ вакансий вообще на него нет.
     
     
  • 3.39, morphe (?), 16:33, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > Но Deno мало где используется, в РФ вакансий вообще на него нет.

    Потому что искать JS/Node разработчиков проще, а переучивать их почти и не надо. Знаю минимум 3 компании где Deno применяется в проде.

     
  • 2.50, Кошкажена (?), 21:59, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • –1 +/
    А он тут причем?
     
     
  • 3.52, morphe (?), 23:56, 04/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > А он тут причем?

    В нём дропнули сеттер __proto__ (Остался только синтаксис __proto__ при инициализации объекта, ну и Reflect.setPrototypeOf) ради безопасности, он неуязвим к prototype pollution

     

  • 1.48, Аноним (48), 20:46, 04/12/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    >next.js

    Могли бы и без него обойтись. Если JS используешь - то зачем полумеры, скот вообще что угодно схавает.

     
  • 1.51, Аноним (51), 23:16, 04/12/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Эксплойт не настоящий, чел навайбкодил 💩, и теперь ему пишут в issues добрые слова
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2025 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру