Две недавно обнаруженные уязвимости CVE — CVE-2025-55182 в React Server Components и CVE-2025-29927 в middleware Next.js — открывают путь для удаленного выполнения кода (RCE) и обхода аутентификации в современных JavaScript-стеках. Достаточно одного запроса, чтобы активировать эти уязвимости; одна лишь настройка конфигурации не поможет их остановить. Командам, использующим React Server Components или middleware Next.js, необходимо рассматривать эти ошибки как критические и немедленно устанавливать исправления.
Почему шум в логах вводит в заблуждение
Мы проанализировали логи edge-серверов за месяц работы одного из production-сайтов на Next.js. В наборе было 8 900 запросов, помеченных как вредоносные. Почти каждый из них отклонялся на первом же этапе (hop). Самым частым URL был /wp-admin/install.php (518 обращений), хотя сайт не использует WordPress, не работает на PHP и не содержит файлов WordPress.
Этот трафик генерируют автоматизированные сканеры. Они буквально засыпают интернет попытками подбора, выискивая:
- Секреты и конфигурационные файлы — 64 % попыток
- PHP-панели и шеллы — 22 %
- Пути WordPress — 11 %
- Инструменты баз данных — 1 %
Большое количество заблокированных запросов лишь говорит о том, что вы не используете ПО, которое ищут боты. Это не гарантирует безопасность приложения, которое вы на самом деле используете.
Тихие атаки на уровне фреймворка
Когда злоумышленник атакует приложение на Next.js, трафик выглядит как обычные пользовательские запросы, использующие механизмы самого фреймворка против него самого.
React2Shell (CVE-2025-55182)
Уязвимость в React Server Components позволяет злоумышленнику внедрить специально сформированную полезную нагрузку (payload), которую сервер выполнит как код. Результатом является полное удаленное выполнение кода без необходимости обхода брандмауэра или WAF (Web Application Firewall). Уязвимость находится внутри фреймворка; единственное решение — обновление до версии, содержащей исправление.
Middleware Authorization Bypass (CVE-2025-29927)
Middleware в Next.js может выполнять проверки безопасности на основе заголовков запроса. Данная CVE показывает, что злоумышленник может передать определенный внутренний заголовок, заставляя middleware полностью пропускать эти проверки. Со стороны запрос выглядит обычным, что затрудняет его обнаружение.
Обе ошибки демонстрируют, что самый опасный трафик может смешиваться с повседневным, обходя системы оповещения, которые реагируют на шумные попытки взлома WordPress.
Что стоит на кону
- Разработчики, которые относятся к обновлениям фреймворков как к необязательным, рискуют полной потерей контроля над своими серверами.
- Операционные команды, полагающиеся на статическую конфигурацию для защиты стека, не могут защититься от кода, который выполняется внутри самого фреймворка.
Практический чек-лист по защите
- Гигиена развертывания — Не передавайте секреты в таких файлах, как
.env. Храните их в переменных окружения, передаваемых во время выполнения, или в специализированных системах управления секретами. - Минимальная поверхность атаки — Отключите функции фреймворка, которые вы не используете. Настройте строгую политику Content-Security-Policy, блокирующую загрузку неавторизованных скриптов.
- Быстрая установка патчей — Автоматизируйте конвейер сборки (build pipeline), чтобы новая версия фреймворка могла быть протестирована и развернута в течение нескольких часов после релиза. Относитесь к обновлениям безопасности как к регулярной части цикла выпуска, а не как к второстепенной задаче.
На что обратить внимание в дальнейшем
- Подпишитесь на официальные каналы оповещений о безопасности для React, Next.js и любых других runtime-библиотек, от которых вы зависите.
- Интегрируйте сканеры уязвимостей, которые понимают метаданные JavaScript-пакетов, чтобы публикация новой CVE автоматически вызывала оповещение.
- Создайте конвейер развертывания с возможностью быстрого отката; если патч вызовет регрессию, вы сможете быстро вернуться к предыдущей версии, не оставляя систему уязвимой.
Урок очевиден: самые громкие атаки в ваших логах часто являются лишь отвлекающим маневром. Реальная опасность скрывается в фреймворке, которому доверяет ваш код. Поддерживайте легкость стека, безопасно храните секреты и относитесь к патчам как к рутинной процедуре — и тогда тихие угрозы на уровне фреймворка станут управляемыми рисками.
