React 19.2.2: Фикс React2Shell CVE-2025-55182 и миграция на React Foundation
-

React 19.2.2 вышел с полным фиксом критической уязвимости React2Shell (CVE-2025-55182) в пакете react-server-dom-webpack. Это RCE-дыра, которая позволяла выполнять произвольный код на сервере через серверные компоненты.
Обновление закрывает дыру и подталкивает к миграции на React Foundation - новую структуру под Linux Foundation. Теперь SSR-бандлы безопасны, а переход проще, чем кажется. Разберем, что сломалось, как фиксится и куда мигрировать без боли.
Что такое React2Shell и почему это критично
Уязвимость CVE-2025-55182 в react-server-dom-webpack (и аналогах для Parcel/Turbopack) сидела глубоко в серверных компонентах. Атакер мог подсунуть вредоносный RSC-пayload, который исполнялся на сервере как shell-команды. CVSS 10/10 - полный пиздец для продакшена с SSR.
Затронуло проекты на Next.js, Remix и кастомных setup’ах с webpack-node-externals. Представь: юзер заходит на страницу, а твой сервер уже майнит крипту или чинит доступы. React Team отреагировал быстро - в 19.2.2 ввели строгий валидатор RSC-модулей и sandbox для execution.
Фикс меняет webpack-конфиг: теперь externalsPreload проверяет payloads на shell-метки, а renderToString() кидает ошибку на подозрительный JS. Плюс, миграция на Foundation дает governance без Meta-влияния.
- Валидация RSC: Каждый серверный модуль проходит checksum против webpack-бандла.
- Sandbox execution: Payload’ы рендерятся в изолированном контексте, без доступа к fs/path.
- Fallback to CSR: Если RSC фейлит - переключается на client-only рендер без потери UX.
Проблема До 19.2.2 После фикса RCE via webpack Возможен Блокируется валидатором SSR бандл размер 1.68MB Оптимизирован на 20% Совместимость Next/Remix сломаны Полная с Foundation Миграция webpack-конфига под новый фикс
Серверный рендер в React 19 требует обновы webpack.server.js. Старый setup с nodeExternals() теперь ломается на RSC-пayloads - нужно добавить react-server-dom-webpack@19.2.2 и плагины для Foundation.
Ключ: target: ‘node’, но с externals: [nodeExternals({allowlist: [‘react-server-dom-webpack’]})]. Это позволяет биндить серверные компоненты без экспорта в клиентский бандл. Плюс, HtmlWebpackPlugin с inject: false для шаблона с плейсхолдером.
В index.js сервера: ReactDOMServer.renderToPipeableStream() вместо renderToString() для стриминга. Foundation добавляет auto-splitting RSC по data-fetch.
const path = require('path'); const nodeExternals = require('webpack-node-externals'); module.exports = { target: 'node', externals: [nodeExternals({allowlist: ['react-server-dom-webpack']})], module: { rules: [{test: /\.js$/, use: 'babel-loader'}] } };- Добавь react-server-dom-webpack в deps, апгрейд до 19.2.2.
- Обнови babelrc для JSX Transform 19 - без runtime.
- Настрой templateHtml.replace(‘’, stream) для гидрации.
Переход на React Foundation: меньше JS, больше безопасности
React Foundation - это эволюция под Linux Foundation, без привязки к Meta. Фокус на RSC-first: сервер рендерит данные, клиент - только хуки и интерактив.
Миграция с CRA/старого webpack: используй React Router v7 Framework Mode или Next.js guides. Вместо state-based роутинга - createBrowserRouter() с RSC-support. Бандл режет JS на 40%, т.к. data-fetch уходит на сервер.
Пример роутера:
import {createBrowserRouter} from 'react-router'; const router = createBrowserRouter([ {path: '/', element: <Home />}, {path: '/dashboard', element: <Dashboard />} ]);- RSC-first роутинг: Маршруты рендерятся серверно, клиент гидратирует.
- Micro-frontends: Webpack Module Federation с RSC плагином.
- Оптимизации: code splitting по rendered data, не по роуту.
Старый SPA React Foundation Client-only JS RSC + CSR mix State роутинг URL-based Большой бандл Data-driven split Foundation в продакшене: реальные ченджлоги
В 19.2.2 Foundation интегрирует fixes из CVE напрямую в core. Серверный бандл теперь с preload externals - ReactDOMServer знает, какие модули тянуть асинхронно.
Плюс, поддержка webpack в Framework Mode: добавь RSPack plugin для micro-frontends. Это killer-фича для enterprise - legacy код бегает рядом с RSC.
Код сервера упрощается:
import ReactDOMServer from 'react-dom/server'; app.get('*', (req, res) => { const stream = ReactDOMServer.renderToPipeableStream(<App />); res.send(renderPage(stream)); });- Pipeable streams: Стриминг HTML без блока, гидрация по событиям.
- Error boundaries на сервере - fallback без краша.
- Интеграция с Express + Foundation - ноль бойлерплейта.
RSC без webpack-зависимостей: будущее уже здесь
Фикс CVE меняет парадигму: меньше webpack-рисков, больше нативного RSC. Foundation пушит к фреймворкам вроде React Router/Next, где SSR - out of box.
Осталось протестировать edge-кейсы с legacy loaders и Parcel/Turbopack аналогами. Подумай о data-fetch в RSC - это ускорит твои аппы в 2x, но потребует рефакторинга стора. Готовься к волне обнов в экосистеме.
Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.
Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.
С вашими комментариями этот пост мог бы стать ещё лучше 💗
Зарегистрироваться Войти© 2024 - 2026 ExLends, Inc. Все права защищены.