
Подробный технический разбор CVE-2025-55182 (React2Shell), прослеживающий внутренности протокола Flight в React для объяснения цепочки эксплуатации, создания полезной нагрузки и анализа исправления.
Автор: Kavienan J
Уязвимость обнаружил: lachlan2k, который ответственно раскрыл её команде React.
За обновлениями по этой уязвимости обращайтесь: react2shell.com
ReactFlightReplyServer.jsCVE-2025-55182 имеет уровень серьёзности 10.0/10.0. Если вы смотрели публичные PoC, то могли заметить: хотя они показывают работу эксплойта, объяснения того, почему пейлоад выглядит именно так, могут показаться недостаточными — что вполне объяснимо, учитывая сложность протокола React Flight. Flight — слой сериализации, лежащий в основе React Server Components и Server Actions, — представляет собой сложный конечный автомат, насчитывающий более 1100 строк кода, и его поведение не является интуитивно понятным, пока не проследишь за кодом самостоятельно.
Сообщество представило PoC, наглядно демонстрирующие уязвимость:
…но когда вы пытаетесь ответить на вопрос «Почему это работает?», то быстро оказываетесь в дебрях внутренних механизмов React, которые никогда не предполагалось читать построчно.
Примечание: Многие PoC ошибочно связывают исправление с изменениями в
requireModule. Как мы увидим в разделе «Исправление», эксплуатационная нагрузка никогда не достигает этой функции — фактически уязвимый код целиком находится вReactFlightReplyServer.js.
Этот разбор — моя попытка обратной разработки цепочки эксплуатации путём пошагового трассирования логики декодирования и инициализации чанков в React. Всё описанное здесь поведение напрямую вытекает из того, как ReactFlightReplyServer.js работал до исправления (источник: https://github.com/facebook/react/blob/v19.2.0/packages/react-server/src/ReactFlightReplyServer.js), и было сжато и упрощено так, чтобы React/JS-разработчик мог следить за ходом рассуждений, проявив достаточно терпения.
Следующий раздел: Предыстория