事象
dev 動作確認(2026-06-28、Step 7 ロール境界)で、Tenant Admin が admin.html を直接開くと、SaaS Admin 画面のシェル(ナビ「Tasks 運営」/サイドバー「プラットフォーム監視」「テナント管理」/ページ見出し)を一度描画してから「SaaS 運営者(APP_ADMIN)のみ利用できます」を表示する。→ 画面の存在・構造・導線が非権限ユーザーに露出する。
評価
- データ漏洩はない:実データは API 側で確実に遮断(
/api/platform/metrics → 403)。admin.js も getPlatformMetrics() 前に弾く。
- ただしプロジェクト方針「参照不可は 404 で存在を漏らさない(NIST AC-4)」(CLAUDE.md / 設計規約)と照らすと、シェルを見せる現挙動は方針と不整合。
- 設計上の限界: 本構成は静的 SPA。
admin.html / js/admin.js は CloudFront から誰でも取得可能で、ファイルの存在自体は隠せない。よって論点は「ログイン中の非 APP_ADMIN に admin UI を描画しない(casual disclosure 回避・多層防御)」。
改善案
admin.js(および admin-tenants.js / admin-tenant-detail.js)で、Auth.isAppAdmin() が false の場合はシェルを描画する前に自分のホーム(tasks.html)へ location.replace する、または 404 相当の汎用画面を出す。
- 現状はシェル描画後に
showError するため露出している。早期リダイレクトに変更する。
- 併せて、サイドバー等で SaaS Admin 導線を非 APP_ADMIN に出していないかも確認(
body.role-admin 制御の点検)。
優先度
セキュリティ多層防御 / UX。実データ漏洩はないため緊急ではないが、自プロジェクトの AC-4 方針に合わせる価値あり。native 書き込みバグ(#810)とは無関係。
事象
dev 動作確認(2026-06-28、Step 7 ロール境界)で、Tenant Admin が
admin.htmlを直接開くと、SaaS Admin 画面のシェル(ナビ「Tasks 運営」/サイドバー「プラットフォーム監視」「テナント管理」/ページ見出し)を一度描画してから「SaaS 運営者(APP_ADMIN)のみ利用できます」を表示する。→ 画面の存在・構造・導線が非権限ユーザーに露出する。評価
/api/platform/metrics→ 403)。admin.jsもgetPlatformMetrics()前に弾く。admin.html/js/admin.jsは CloudFront から誰でも取得可能で、ファイルの存在自体は隠せない。よって論点は「ログイン中の非 APP_ADMIN に admin UI を描画しない(casual disclosure 回避・多層防御)」。改善案
admin.js(およびadmin-tenants.js/admin-tenant-detail.js)で、Auth.isAppAdmin()が false の場合はシェルを描画する前に自分のホーム(tasks.html)へlocation.replaceする、または 404 相当の汎用画面を出す。showErrorするため露出している。早期リダイレクトに変更する。body.role-admin制御の点検)。優先度
セキュリティ多層防御 / UX。実データ漏洩はないため緊急ではないが、自プロジェクトの AC-4 方針に合わせる価値あり。native 書き込みバグ(#810)とは無関係。