
Разбор и анализ CVE-2025-55182 (React2Shell) — RCE через десериализацию RSC Flight, с разбором первопричины, схемой атаки, патч-диффом и правилами обнаружения Sigma/Suricata/WAF.
Последняя проверка: 2026-11-04 (KST). Каждое значение указано только если подтверждено источником из раздела References; при расхождениях между источниками приведены все варианты.
Function и выполнить произвольный JavaScript.react-server-dom-webpack / -parcel / -turbopack версий 19.0.0, 19.1.0, 19.1.1, 19.2.0 и фреймворки, использующие их — в первую очередь Next.js 15.x / 16.x App Router. Уязвимость проявляется даже без явного определения серверных функций, достаточно поддержки RSC.| Пункт | Содержание |
|---|---|
| CVE ID | CVE-2025-55182 (React) / CVE-2025-66478 для Next.js отклонён как дубликат (Rejected) |
| Псевдоним | React2Shell |
| Дата публикации | 2025-12-03 (рекомендация команды React, патч выпущен в тот же день) |
| Обнаружил | Lachlan Davidson (сообщено 2025-11-29 через Meta Bug Bounty) |
| Затронутые продукты/версии | react-server-dom-webpack, react-server-dom-parcel, react-server-dom-turbopack 19.0.0, 19.1.0, 19.1.1, 19.2.0 / Next.js 14.3.0-canary.77 и выше canary, 15.x, 16.x (App Router) |
| Исправленные версии | Исправление RCE: React 19.0.1 / 19.1.2 / 19.2.1, Next.js 15.0.5 / 15.1.9 / 15.2.6 / 15.3.6 / 15.4.8 / 15.5.7 / 16.0.7 Рекомендуемые итоговые версии (включая последующие уязвимости): React 19.0.3 / 19.1.4 / 19.2.3 (см. «Последующие уязвимости» ниже) |
| CVSS v3.1 | 10.0 Critical — CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H |
| CVSS v4.0 | На момент написания документа не подтверждено по первичным источникам |
| CWE | CWE-502 Deserialization of Untrusted Data (Vercel GHSA-9qr9-h5gf-34mp, GitLab Advisory DB). В записи CISA KEV CWE не указан |
| Фактическая эксплуатация | Эксплуатация подтверждена. Включено в CISA KEV 2025-12-05, срок устранения для федеральных агентств 2025-12-12, использование в кампаниях программ-вымогателей: Known. AWS наблюдала попытки эксплуатации в течение нескольких часов после публикации |
| Компонент | Уязвимые версии | Исправленные версии |
|---|---|---|
react-server-dom-webpack / -parcel / -turbopack | 19.0.0 | 19.0.1 (рекомендуется 19.0.3) |
| 〃 | 19.1.0, 19.1.1 | 19.1.2 (рекомендуется 19.1.4) |
| 〃 | 19.2.0 | 19.2.1 (рекомендуется 19.2.3) |
| Next.js 15.x (App Router) | 15.0 ~ до патча 15.5 | 15.0.5 / 15.1.9 / 15.2.6 / 15.3.6 / 15.4.8 / 15.5.7 |
| Next.js 16.x (App Router) | ниже 16.0.7 | 16.0.7 |
| Next.js canary | 14.3.0-canary.77 и выше | 15.6.0-canary.58 / 16.1.0-canary.12 (пользователям 14.3 canary рекомендуется перейти на 14.x stable) |
| Другие инструменты интеграции RSC | React Router (нестабильный RSC API), Waku, плагин Parcel RSC, плагин Vite RSC (@vitejs/plugin-rsc), RedwoodSDK, Expo и др. | Последние версии соответствующих инструментов + исправленный react-server-dom-* |
Не затронуты: чисто клиентские приложения React без сервера, Next.js 13.x / 14.x stable, приложения с Pages Router, развёртывания на Edge Runtime.
После исправления React2Shell дальнейшие исследования RSC выявили другие уязвимости, не связанные с RCE. Сама RCE исправлена в 19.0.1 / 19.1.2 / 19.2.1, но для защиты от перечисленных ниже уязвимостей требуются последние версии.
| CVE | Тип | CVSS v3.1 | Публикация | Исправленная версия |
|---|---|---|---|---|
| CVE-2025-55184 | Отказ в обслуживании (DoS) | 7.5 | 2025-12-11 | 19.0.2 / 19.1.3 / 19.2.2 (неполное) |
| CVE-2025-55183 | Раскрытие исходного кода | 5.3 | 2025-12-11 | 19.0.2 / 19.1.3 / 19.2.2 |
| CVE-2025-67779 | DoS из-за неполного патча для CVE-2025-55184 | 7.5 | 2025-12-12 | 19.0.3 / 19.1.4 / 19.2.3 |
Некоторые публикации компаний по безопасности (например, обновление Zscaler) формулируют это как «исходный патч для CVE-2025-55182 был неполным». Однако согласно рекомендациям React и GitLab неполным был именно патч для DoS (CVE-2025-55184), а первоисточника, подтверждающего обход исправления RCE, обнаружить не удалось. В любом случае рекомендуемое действие — версия 19.0.3 / 19.1.4 / 19.2.3 или выше.
| Дата | Событие |
|---|---|
| 2025-11-29 | Lachlan Davidson сообщил через Meta Bug Bounty |
| 2025-11-30 | Подтверждение исследователями безопасности Meta, начало исправления совместно с командой React |
| 2025-12-03 | Публикация рекомендаций и патчей React (19.0.1 / 19.1.2 / 19.2.1), рекомендаций Next.js (CVE-2025-66478). Облачные провайдеры и компании WAF получили предварительное уведомление и развернули защитные правила |
| 2025-12-03 ~ 04 | AWS зафиксировала попытки эксплуатации со стороны связанных с Китаем групп (Earth Lamia, Jackpot Panda) в течение нескольких часов после публикации. Zscaler наблюдала более 4 100 попыток эксплуатации за первые 2 часа |
| 2025-12-05 | Включение в CISA KEV (срок 12-12). Microsoft с этого дня фиксирует реальную вредоносную активность |
| 2025-12-11 | Публикация последующих уязвимостей CVE-2025-55184 / 55183 |
| 2025-12-12 | Публикация CVE-2025-67779 (неполный патч), выпуск 19.0.3 / 19.1.4 / 19.2.3 |
| 2025-12-15 | Публикация Microsoft анализа активности после эксплуатации и руководства по поиску (hunting guide) |
RSC обменивается данными между клиентом и сервером через собственный протокол сериализации под названием Flight. Когда клиент вызывает Server Function, браузер отправляет аргументы POST-запросом multipart/form-data, и каждое поле формы становится пронумерованным чанком.
$<id> — ссылка на значение другого чанка, $@<id> — ссылка на сам объект чанка, $B<id> — обработка Blob.then(). JavaScript await при встрече с thenable вызывает then(), и если результат снова является thenable, вызов рекурсивно продолжается.getOutlinedModel()Серверный обработчик ответов Flight (packages/react-server/src/ReactFlightReplyServer.js), функция getOutlinedModel(), разбивает ссылку вида $<id>:<prop1>:<prop2> по разделителю : и последовательно проходит по свойствам целевого чанка в порядке chunk[prop1][prop2].
При этом имя свойства не проверялось на принадлежность к собственным свойствам (own property) объекта. Поэтому можно было обращаться к унаследованным свойствам с именами вроде __proto__, constructor, prototype.
В JavaScript constructor.constructor произвольного объекта — это глобальный конструктор Function, который принимает строку и создаёт исполняемую функцию. Согласно публичным анализам (OPSWAT, Zscaler), атакующий комбинирует следующие два элемента.