Security Week 2550: критическая уязвимость в React Server Components

3 декабря разработчики JavaScript-библиотеки для создания веб-приложений React сообщили об обнаружении критической уязвимости в компоненте React Server Components. Уязвимость с наивысшим, десятибалльным рейтингом опасности по шкале CVSS v3 получила идентификатор CVE-2025-55182. Еще один идентификатор CVE-2025-66478 является дублирующим — он относится к интеграции React Server Components во фреймворке Next.js. Уязвимые веб-приложения в худшем случае позволяют злоумышленнику без какой-либо аутентификации получить контроль над сервером, отправив специально подготовленный запрос. Отсюда название уязвимости, точнее два варианта — React4Shell и React2Shell.

Быстрое развитие ситуации вокруг уязвимости можно оценить как «идеальный шторм», максимально сложную ситуацию для администраторов уязвимых систем, происходящую все же достаточно редко. Уже в день публикации бюллетеня React началась эксплуатация уязвимости, предположительно, организованными группировками из Китая. На следующий день, 4 декабря, примеры кода для эксплуатации уязвимости были доступны публично. Потенциально уязвимы сотни тысяч сайтов и веб-приложений, использующих либо React, либо Next.js, хотя реально подвержены атаке не все из них.

Источники информации:

Бюллетень React
Бюллетень Next.js
Краткий технический анализ «Лаборатории Касперского»
Таймлайн и техническое описание уязвимости компании Phoenix Security
Отчеты поставщиков облачных решений: Wiz, Amazon Web Services, Google Cloud Platform
Мини-сайт и Github с примерами PoC от первооткрывателя уязвимости

Уязвимость была обнаружена 29 ноября исследователем Лахланом Дэвидсоном, информация о ней была передана через программу Meta Bug Bounty. Уже 1 декабря разработчики React подготовили патч и начали приватную работу с крупнейшими поставщиками облачных сервисов, а также с разработчиками связанных опенсорсных проектов. 3 декабря последовало публичное раскрытие информации, пропатченные версии React Server Components и Next.js были опубликованы в репозитории NPM. Поскольку речь идет о JavaScript-библиотеках, ответственность за закрытие уязвимости в конкретных проектах полностью лежит на их владельцах.

React Server Components позволяет отправлять запросы от клиента (кода, выполняемого на стороне пользователя) к серверу, в терминах React эта функциональность называется Server Functions. Если в проекте такие Server Functions реализованы — он уязвим. Более того, даже если Server Functions не реализованы, но приложение на базе React или Next.js в принципе поддерживает React Server Components — атака все еще возможна. Формальное определение уязвимых модулей следующее: это react-server-dom-webpack, react-server-dom-parcel и react-server-dom-turbopack версий 19.0, 19.1.0, 19.1.1 и 19.2.0. Для каждой ветки опубликованы отдельные обновления до версии 19.x.1. Уязвимы версии next.js 14 (начиная с 14.3.0-canary.77), 15 и 16 (все), а патчи доступны в версиях 15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7, 16.0.7, 15.6.0-canary.58, 16.1.0-canary.12+. В список других бандлов и модулей, включающих React Server Components, входят waku, parcel/rsc, vitejs/plugin-rsc и rwsdk.

Для коммуникации между клиентом и сервером Server Functions использует протокол Flight. Передаваемые с его помощью пакеты данных проходят на сервере рутинную процедуру десериализации. Ошибка в этом процессе и делает возможным перехват управления сервером. Подробности ни в одном отчете не раскрываются. Первооткрыватель проблемы обещает опубликовать подробную статью позднее, но учитывая, что React — это проект с открытым исходным кодом, определить суть проблемы и вычислить последовательность действий, необходимую для проведения атаки, несложно. Что и было сделано многочисленными авторами публичных PoC. Наиболее подробно ошибка в коде React описана здесь.

По данным сервис-провайдеров, способных массово отслеживать запросы к клиентским приложениям и определять вредоносные запросы, целью злоумышленников в первой волне атак была чувствительная информация — ключи и токены доступа. Проводились также попытки развить атаку со взломанного сервера на другие элементы корпоративной инфраструктуры. Позднее добавились и более массовые методы извлечения выгоды, такие как майнинг криптовалюты. По данным компании Wiz, до 39% облачных систем по состоянию на 3 декабря были уязвимы. Другая, более конкретная оценка от 6 декабря сообщает о 77 тысячах уязвимых IP-адресов.

Существует метод защиты уязвимых систем помимо обновления, который позволил «спасти» множество инсталляций еще до того, как проснулись админы был определен сам факт их уязвимости. Это блокировка вредоносных запросов на уровне брандмауэра, точнее — так называемого Web Application Firewall. Соответствующие фильтры в WAF добавили все крупные сервис-провайдеры — вот пример от Cloudflare. При этом 5 декабря обновление правил WAF у этого провайдера привело к кратковременному падению инфраструктуры. Фильтрацию при необходимости можно реализовать самостоятельно, для чего во множестве источников (включая статью «Лаборатории Касперского») приводится список из «опасных» запросов, однозначно указывающих на злонамеренные действия клиента.

По уровню опасности и масштабу последствий, а также по определенным схожим чертам данную уязвимость часто сравнивают с атакой Log4Shell на решение Log4j, входящее в состав Apache Logging Framework. В 2021 году эта уязвимость также поставила под угрозу большое количество сетевых приложений и сервисов, от Amazon Web Services до серверов Minecraft.

Что еще произошло

В рамках отчета по эволюции киберугроз за третий квартал 2025 года специалисты «Лаборатории Касперского» опубликовали обзор по эксплойтам и уязвимостям.

Microsoft закрыла уязвимость при обработке .lnk-файлов, обнаруженную еще в марте этого года. Распространяемые атакующими подготовленные файлы содержали скрытые команды, которые не были видны пользователю, но выполнялись при двойном клике на файл. Уязвимость была закрыта без какого-либо анонса, а ранее производитель утверждал, что оснований для срочного решения проблемы нет.

Вторая атака Shai-Hulud, направленная на заражение NPM-пакетов, привела к утечке 400 тысяч строк приватных данных, таких как ключи доступа. О первой атаке мы подробно писали в сентябре. Тогда было атаковано около 190 пакетов в репозитории NPM (500+, включая разные версии одного и того же ПО), а в новой волне заражений было взломано более 800.

В декабрьском наборе патчей для ОС Android закрыты две уязвимости нулевого дня.

Взломано популярное приложение SmartTube для просмотра YouTube на смарт-ТВ. После компрометации ключей разработчика клиентам было разослано вредоносное обновление.