
Инструментарий обнаружения в масштабах всей AWS-организации для CVE-2025-55182 и CVE-2025-66478 (RCE-уязвимости в React Server Components / Next.js)
Набор для обнаружения угроз масштаба всей AWS-организации для CVE-2025-55182 и CVE-2025-66478
⚠️ ВАЖНОЕ ПРЕДУПРЕЖДЕНИЕ — ПРОЧТИТЕ ПЕРЕД ИСПОЛЬЗОВАНИЕМ
Этот набор НЕ протестирован в производственной среде AWS.
Из-за ограничений инфраструктуры этот проект был разработан и проверен только с помощью ревизии кода, статического анализа и проверки документации. Он не развертывался и не тестировался в реальной среде AWS с активными сервисами GuardDuty, WAF, EventBridge или CloudTrail.
Что это означает для вас:
Компонент Статус Логика сканера Python ✅ Код проверен, подтверждено Snyk Синтаксис Terraform ✅ Проверен, не применялся Политики IAM ⚠️ Могут потребовать настройки под ваше окружение Правила EventBridge ⚠️ Паттерны находок основаны на документации AWS Правила WAF ⚠️ Регулярные выражения не проверены на реальном трафике Запросы Athena ⚠️ Допущения о схеме могут потребовать изменений Рекомендации:
- Сначала разверните в непродакшен-аккаунте — Протестируйте все компоненты в песочнице
- Внимательно проверьте политики IAM — Настройте разрешения в соответствии с требованиями вашей организации
- Проверяйте планы Terraform — Выполните
terraform planи просмотрите перед применением- Тестируйте паттерны EventBridge — Убедитесь, что строки типов находок соответствуют выводу GuardDuty
- Отслеживайте логи CloudWatch — Проверяйте наличие ошибок после развертывания
Ответственность:
Это программное обеспечение предоставляется «КАК ЕСТЬ» без каких-либо гарантий. Авторы не несут ответственности за любой ущерб, инциденты безопасности или расходы на AWS, возникшие в результате использования этого набора. Используйте на свой страх и риск.
Если вы успешно развернули и протестировали этот набор, пожалуйста, рассмотрите возможность передать свои результаты обратно, чтобы улучшить его для сообщества.
Комплексный набор инструментов безопасности для обнаружения попыток эксплуатации React2Shell в средах AWS. Этот набор обеспечивает обнаружение в реальном времени, возможности охоты за угрозами и автоматическое реагирование на критическую уязвимость удаленного выполнения кода (RCE) в React Server Components.
__proto__:then позволяет выполнять произвольный код через process.mainModule.require('child_process').execSync()---
## Предварительные требования
### Необходимые разрешения```
# Minimum IAM permissions for the detection script
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"cloudtrail:LookupEvents",
"logs:StartQuery",
"logs:GetQueryResults",
"guardduty:ListDetectors",
"guardduty:ListFindings",
"guardduty:GetFindings",
"guardduty:CreateThreatIntelSet",
"guardduty:UpdateThreatIntelSet",
"guardduty:ListThreatIntelSets",
"guardduty:GetThreatIntelSet",
"s3:PutObject",
"s3:GetObject",
"sts:GetCallerIdentity",
"sts:AssumeRole"
],
"Resource": "*"
}
]
}
# For Security Hub integration, add:
"securityhub:BatchImportFindings"
# For SNS alerting, add:
"sns:Publish"
# For organization-wide scanning, add:
"organizations:ListAccounts"
cd React2Shell_Hunter
python3 -m venv venv source venv/bin/activate # On Windows: venv\Scripts\activate
pip install -r requirements.txt
### Шаг 2: Настройка учетных данных AWS```bash
# Option A: Use AWS CLI profile
aws configure --profile security-scanner
# Option B: Export environment variables
export AWS_ACCESS_KEY_ID="your-access-key"
export AWS_SECRET_ACCESS_KEY="your-secret-key"
export AWS_DEFAULT_REGION="us-east-1"
# Option C: Use IAM role (recommended for EC2/Lambda)
# Attach appropriate IAM role to your compute resource
aws sts get-caller-identity
python -c "import boto3, yaml; print('Dependencies OK')"
python -c " import yaml with open('config/iocs.yaml') as f: iocs = yaml.safe_load(f) print(f'Loaded {len(iocs["network_iocs"]["malicious_ips"])} malicious IPs') "
---
## Быстрый старт
### Сканирование текущей учетной записи (последние 24 часа)```bash
python src/react2shell_detector.py --hours 24
Ожидаемый вывод:``` 2025-12-06 10:00:00 - React2ShellDetector - INFO - ============================================================ 2025-12-06 10:00:00 - React2ShellDetector - INFO - React2Shell IOC Detection Script 2025-12-06 10:00:00 - React2ShellDetector - INFO - CVE-2025-55182 & CVE-2025-66478 2025-12-06 10:00:00 - React2ShellDetector - INFO - ============================================================ 2025-12-06 10:00:00 - React2ShellDetector - INFO - Starting single account scan... 2025-12-06 10:00:00 - React2ShellDetector - INFO - Analyzing CloudTrail logs... 2025-12-06 10:00:05 - React2ShellDetector - INFO - Checking GuardDuty findings...
Total findings: 0 CRITICAL: 0 HIGH: 0 MEDIUM: 0
### Полное сканирование production-среды```bash
python src/react2shell_detector.py \
--organization \
--role-name SecurityAuditRole \
--security-hub \
--guardduty-bucket my-threat-intel-bucket-12345 \
--vpc-log-group /aws/vpc/flowlogs \
--waf-log-group aws-waf-logs-react2shell \
--sns-topic arn:aws:sns:us-east-1:123456789012:security-alerts \
--output json \
--output-file findings-$(date +%Y%m%d).json \
--hours 72
В GUARDDUTY НЕЛЬЗЯ СОЗДАВАТЬ ПОЛЬЗОВАТЕЛЬСКИЕ ПРАВИЛА ОБНАРУЖЕНИЯ.
GuardDuty использует модели машинного обучения и threat intelligence для генерации findings. Чтобы обнаружить React2Shell:
MaliciousIPCaller.Custom### Шаблоны правил EventBridge
Terraform создаёт 7 конкретных правил EventBridge:
| Правило | Шаблон типа результата | Критичность |
|------|---------------------|----------|
| `react2shell-malicious-ip-caller` | `MaliciousIPCaller.Custom` | CRITICAL |
| `react2shell-credential-exfiltration` | `InstanceCredentialExfiltration.*` | CRITICAL |
| `react2shell-dns-exfiltration` | `DNSDataExfiltration` | HIGH |
| `react2shell-cryptocurrency-mining` | `CryptoCurrency:*` | HIGH |
| `react2shell-unusual-network-ports` | `NetworkPortUnusual` | MEDIUM |
| `react2shell-malicious-domain` | `MaliciousDomainRequest.*` | HIGH |
| `react2shell-high-severity-catchall` | Severity >= 7 | VARIES |
### Уровни защиты WAF
WebACL WAF реализует 9 правил в порядке приоритета:
| Приоритет | Правило | Действие | Что обнаруживает |
|----------|------|--------|-----------------|
| 1 | Блокировка вредоносных IP-адресов | BLOCK | Подключения с 9 известных C2-адресов |
| 2 | Значения заголовка Next-Action | BLOCK | заголовок `next-action`, содержащий паттерны `$ACTION` или `__proto__` |
| 3 | Значения заголовка RSC-Action-ID | BLOCK | заголовок `rsc-action-id`, содержащий паттерны `$ACTION` или `__proto__` |
| 4 | Загрязнение прототипа | BLOCK | `__proto__` или `constructor.prototype` в теле запроса |
| 5 | Паттерны RCE | BLOCK | `process.mainModule.require`, `child_process`, `execSync` |
| 6 | Параметр ACTION | BLOCK | `$ACTION_0:0` или `$ACTION_REF` в теле POST-запроса |
| 7 | Подозрительные User-Agents | COUNT | `Go-http-client`, `Assetnote`, `python-requests` |
| 8 | AWS: известные вредоносные входные данные | INHERIT | управляемая группа правил AWS |
| 9 | AWS: общий набор правил | INHERIT | управляемая группа правил AWS |
> **Примечание**: Правила 2 и 3 используют `or_statement` с несколькими проверками `byte_match_statement`, чтобы обнаруживать вредоносные ЗНАЧЕНИЯ заголовков (а не только наличие заголовка). AWS WAF не поддерживает регулярные выражения при сопоставлении заголовков, поэтому для каждого паттерна требуется отдельный оператор. Имена заголовков должны быть в нижнем регистре, как того требует WAF.
---
## Справочник компонентов
### Структура проекта```
React2Shell_Hunter/
├── config/
│ └── iocs.yaml # IOC database (IPs, domains, patterns) - 452 lines
├── src/
│ └── react2shell_detector.py # Main detection script - 1141 lines
├── terraform/
│ ├── guardduty.tf # GuardDuty + ThreatIntelSet + S3 - 405 lines
│ ├── eventbridge_rules.tf # 7 EventBridge rules - 533 lines
│ └── waf_rules.tf # WAF WebACL with 9 rules - 681 lines
├── lambda/
│ └── ioc_scanner/
│ └── handler.py # Real-time Lambda scanner - 381 lines
├── athena_queries/
│ └── detection_queries.sql # 18 threat hunting queries - 483 lines
├── tests/
│ ├── __init__.py # Test package init
│ ├── conftest.py # Pytest fixtures (project_root, ioc_config, etc.)
│ ├── test_ioc_matching.py # IOC pattern validation tests
│ ├── test_terraform.py # Terraform configuration validation
│ └── test_waf_patterns.py # WAF regex pattern tests
├── docs/
│ ├── THREAT_INTELLIGENCE_REPORT.md
│ └── GUARDDUTY_EVENTBRIDGE_SETUP_GUIDE.md
├── requirements.txt # Python dependencies (boto3, pyyaml, pytest, python-hcl2)
├── README.md
└── CLAUDE.md
cd terraform
terraform init
terraform plan
-var="threat_intel_bucket=react2shell-threat-intel-$(aws sts get-caller-identity --query Account --output text)"
-var="enable_guardduty=true"
-var="enable_waf=true"
-var="waf_scope=REGIONAL"
terraform apply
-var="threat_intel_bucket=react2shell-threat-intel-$(aws sts get-caller-identity --query Account --output text)"
**Переменные Terraform:**
| Переменная | Обязательная | По умолчанию | Описание |
|----------|----------|---------|-------------|
| `threat_intel_bucket` | ДА | - | Название S3-бакета для файлов threat intel |
| `enable_guardduty` | нет | true | Включить детектор GuardDuty |
| `enable_waf` | нет | true | Создать WAF WebACL |
| `waf_scope` | нет | REGIONAL | `REGIONAL` или `CLOUDFRONT` |
| `block_mode` | нет | BLOCK | `BLOCK` или `COUNT` |
| `enable_lambda_automation` | нет | false | Включить Lambda для автоматического реагирования |
### Шаг 2: Связывание WAF с ресурсами
WAF WebACL должен быть связан с вашими ресурсами:```bash
# Associate with ALB
aws wafv2 associate-web-acl \
--web-acl-arn $(terraform output -raw web_acl_arn) \
--resource-arn arn:aws:elasticloadbalancing:us-east-1:123456789012:loadbalancer/app/my-alb/1234567890
# Associate with API Gateway
aws wafv2 associate-web-acl \
--web-acl-arn $(terraform output -raw web_acl_arn) \
--resource-arn arn:aws:apigateway:us-east-1::/restapis/abc123/stages/prod
SNS_TOPIC=$(terraform output -raw sns_topic_arn)
aws sns subscribe
--topic-arn $SNS_TOPIC
--protocol email
--notification-endpoint [email protected]
aws sns subscribe
--topic-arn $SNS_TOPIC
--protocol lambda
--notification-endpoint arn:aws:lambda:us-east-1:123456789012:function:slack-notifier
### Шаг 4: Создание таблиц Athena```bash
# Open Athena console or use AWS CLI
# Run the CREATE TABLE statements from athena_queries/detection_queries.sql
# CloudTrail table
aws athena start-query-execution \
--query-string "CREATE EXTERNAL TABLE cloudtrail_logs ..." \
--work-group primary \
--query-execution-context Database=default
| Порт | Использование |
|---|---|
| 652 | PowerShell-стеджер |
| 2045 | Кастомный C2 |
| 8000, 8080 | Альтернативный HTTP-C2 |
| 12000, 45178 |
aws guardduty list-detectors
aws guardduty create-detector --enable
terraform apply -var="enable_guardduty=true"
#### "Не удалось принять роль в аккаунте участника"```bash
# Verify role exists in target account
aws iam get-role --role-name SecurityAuditRole
# Verify trust policy allows your account
aws iam get-role --role-name SecurityAuditRole --query 'Role.AssumeRolePolicyDocument'
# Test role assumption
aws sts assume-role \
--role-arn arn:aws:iam::TARGET_ACCOUNT:role/SecurityAuditRole \
--role-session-name test
DETECTOR_ID=$(aws guardduty list-detectors --query 'DetectorIds[0]' --output text) aws guardduty list-threat-intel-sets --detector-id $DETECTOR_ID
aws s3api get-bucket-policy --bucket your-threat-intel-bucket
aws s3 cp s3://your-bucket/threat-intel/react2shell-ips.txt -
#### "Правило WAF не блокирует"```bash
# Check if WebACL is associated
aws wafv2 list-resources-for-web-acl \
--web-acl-arn $(terraform output -raw web_acl_arn)
# Check sampled requests
aws wafv2 get-sampled-requests \
--web-acl-arn $(terraform output -raw web_acl_arn) \
--rule-metric-name React2Shell-Malicious-IP-Blocked \
--scope REGIONAL \
--time-window StartTime=2025-12-06T00:00:00Z,EndTime=2025-12-06T23:59:59Z \
--max-items 10
DETECTOR_ID=$(aws guardduty list-detectors --query 'DetectorIds[0]' --output text)
aws guardduty create-sample-findings
--detector-id $DETECTOR_ID
--finding-types "UnauthorizedAccess:IAMUser/MaliciousIPCaller.Custom"
aws cloudwatch get-metric-statistics
--namespace AWS/Events
--metric-name Invocations
--dimensions Name=RuleName,Value=react2shell-malicious-ip-caller
--start-time $(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ)
--end-time $(date -u +%Y-%m-%dT%H:%M:%SZ)
--period 300
--statistics Sum
---
## FAQ
### В: Заменяет ли это установку исправлений?
**НЕТ.** Это инструментарий обнаружения, а не средство предотвращения. Вы ОБЯЗАНЫ пропатчить:
- React: 19.0.1, 19.1.2 или 19.2.1
- Next.js: 15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7 или 16.0.7
### В: Обнаружит ли это все атаки React2Shell?
**Никакое обнаружение не является 100%.** Этот инструментарий обнаруживает:
- Подключения к известным IP-адресам C2 (если атакующий использует новые IP, не обнаружит)
- Известные шаблоны полезной нагрузки (если атакующий обфусцирует, может обойти WAF)
- Постэксплуатационное поведение (кража учётных данных, латеральное перемещение)
### В: Как часто следует запускать сканер?
Рекомендуемое расписание:
- **Непрерывно**: GuardDuty + EventBridge (в реальном времени)
- **Ежечасно**: Python-скрипт с `--hours 1`
- **Ежедневно**: Полные запросы Athena для охоты на угрозы
### В: Как добавить новые IOC?
Отредактируйте `config/iocs.yaml` и добавьте в соответствующие разделы:```yaml
network_iocs:
malicious_ips:
- ip: "NEW.IP.ADDRESS.HERE"
port: 8080
context: "Description"
confidence: high
source: "Your source"
Затем обновите ThreatIntelSet:```bash python src/react2shell_detector.py --guardduty-bucket your-bucket
---
## Запуск тестов```bash
# Install test dependencies
pip install -r requirements.txt
# Run all tests
pytest tests/ -v
# Run specific test categories
pytest tests/test_terraform.py -v # Terraform validation
pytest tests/test_ioc_matching.py -v # IOC pattern tests
pytest tests/test_waf_patterns.py -v # WAF regex tests
# Run with coverage
pytest tests/ --cov=src --cov-report=html
Отказ от ответственности: Этот инструментарий предназначен только для целей оборонительной безопасности. Убедитесь, что у вас есть соответствующие разрешения перед сканированием систем.
| Software | Version | Purpose |
|---|
| Python | 3.9+ | Среда выполнения скрипта обнаружения |
| Terraform | 1.0+ | Развертывание инфраструктуры |
| AWS CLI | 2.x | Аутентификация AWS |
| boto3 | 1.34+ | AWS SDK для Python |
| Класс | Назначение | Ключевые методы |
|---|
IOCLoader | Загружает IOC из YAML | get_malicious_ips(), get_suspicious_ports(), get_malicious_domains() |
CloudTrailAnalyzer | Обнаруживает IOCs на основе API | analyze_recent_events(hours) |
VPCFlowLogAnalyzer | Обнаруживает сетевые IOCs | analyze_flow_logs(log_group, hours) |
GuardDutyManager | Управляет данными об угрозах | create_threat_intel_set(bucket), get_relevant_findings(hours) |
WAFLogAnalyzer | Обнаруживает HTTP IOCs | analyze_waf_logs(log_group, hours) |
OrganizationScanner | Сканирование между учетными записями | scan_organization(hours, role_name) |
SecurityHubReporter | Импортирует результаты | import_findings(findings) |
SNSAlerter | Отправляет оповещения | send_alert(findings) |
| Аргумент | Тип | По умолчанию | Описание |
|---|
--config | string | config/iocs.yaml | Путь к файлу конфигурации IOC |
--hours | int | 24 | Количество часов журналов для анализа |
--organization | flag | false | Сканировать всю организацию AWS |
--role-name | string | OrganizationAccountAccessRole | Роль для принятия в аккаунтах-участниках |
--sns-topic | string | none | ARN темы SNS для оповещений |
--security-hub | flag | false | Импортировать результаты в Security Hub |
--guardduty-bucket | string | none | S3 bucket для данных об угрозах GuardDuty |
--vpc-log-group | string | none | Группа журналов CloudWatch для VPC Flow Logs |
--waf-log-group | string | none | Группа журналов CloudWatch для логов WAF |
--output | enum | text | Формат вывода: json, text, csv |
--output-file | string | none | Путь к выходному файлу |
--debug | flag | false | Включить отладочное журналирование |
| IP-адрес | Порт | Уровень доверия | Контекст | Источник |
|---|
| 93.123.109.247 | 8000 | ВЫСОКИЙ | Основной C2-сервер | Datadog |
| 45.77.33.136 | 8080 | ВЫСОКИЙ | Основной C2-сервер | Datadog |
| 194.246.84.13 | 2045 | ВЫСОКИЙ | Основной C2-сервер | Datadog |
| 141.11.240.103 | 45178 | ВЫСОКИЙ | Основной C2-сервер | Datadog |
| 23.235.188.3 | 652 | ВЫСОКИЙ | PowerShell-стеджер | GreyNoise |
| 46.36.37.85 | 12000 | ВЫСОКИЙ | Стейджинг полезной нагрузки | GreyNoise |
| 144.202.115.234 | 80 | СРЕДНИЙ | Размещение полезной нагрузки | Datadog |
| 162.215.170.26 | 3000 | СРЕДНИЙ | Вторичная полезная нагрузка | GreyNoise |
| 45.32.158.54 | - | СРЕДНИЙ | Сканер | GreyNoise |
| Домен | Категория | Уровень доверия |
|---|
| ceye.io | DNS-эксфильтрация | ВЫСОКИЙ |
| dnslog.cn | DNS-эксфильтрация | ВЫСОКИЙ |
| *.oastify.com | Burp Collaborator | СРЕДНИЙ |
| sapo.shk0x.net | C2 | ВЫСОКИЙ |
| xwpoogfunv.zaza.eu.org | C2 | ВЫСОКИЙ |
| *.c3pool.com | Криптомайнинг | ВЫСОКИЙ |
| Кастомный C2 |
| 3333, 5555, 14433, 14444 | Криптомайнинг |
| Шаблон | Серьёзность | Описание |
|---|
next-action: * | КРИТИЧЕСКИЙ | Заголовок эксплуатации RSC (в нижнем регистре в WAF) |
rsc-action-id: * | КРИТИЧЕСКИЙ | Идентификатор действия RSC (в нижнем регистре в WAF) |
$ACTION_0:0 | КРИТИЧЕСКИЙ | Параметр действия RSC |
__proto__:then | КРИТИЧЕСКИЙ | Загрязнение прототипа |
process.mainModule.require | КРИТИЧЕСКИЙ | Node.js RCE |
child_process | КРИТИЧЕСКИЙ | Выполнение команд |
Go-http-client/1.1 | СРЕДНИЙ | User-Agent сканера |