Balcony Security | 脆弱性診断レポート
脆弱性診断
レポート
作業者権限アカウントによる /admin/bulk_publish/get_resource エンドポイントへのアクセス制限不備
1
脆弱性サマリ
sample-001
MEDIUM
脆弱性名
作業者権限アカウントによる
/admin/bulk_publish/get_resource エンドポイントへのアクセス制限不備
脆弱性種別
認可・権限制御の不備 / Broken Access Control
CVSSスコア
4.3
Medium
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N
想定される脅威
作業者権限アカウントが、本来は上位権限のユーザーに限定すべき公開一括管理機能向けのエンドポイント(
/admin/bulk_publish/get_resource)に対して、自身のセッション情報を用いたHTTPリクエストを送信し、正常なレスポンスを取得できてしまいます。
2
脆弱性の詳細説明
対象システムには、管理者や作業者など複数の権限ロールが定義されており、各ロールごとに利用可能な機能が整理されています。
権限制御の仕様:「権限制御可能操作一覧」では、作業者ロールには公開一括管理機能の権限が付与されておらず、上位権限のユーザーのみが利用できる前提で設計されています。
管理者(Admin)
会員一覧
動画プロジェクト
公開一括管理 ▶ 表示・利用可
作業者(Operator)
会員一覧
動画プロジェクト
公開一括管理 ✕ 非表示
実際の挙動(フロントエンド):作業者権限でログインした場合にはメニュー上に公開一括管理機能が表示されず、画面の操作だけでは当該機能に遷移できないように制御されています。一方で、管理者権限でログインした場合にはメニューから選択可能であり、対象の機能画面に遷移できることが確認されています。
// アクセス制御の概要図
管理者でログインした場合
サイドメニュー
↓
会員一覧 / プロジェクト
↓
▶ 公開一括管理(表示)
作業者でログインした場合(画面制御)
サイドメニュー
↓
会員一覧 / プロジェクト
↓ ⋯(非表示)
✕ 公開一括管理(非表示)
バックエンド(API)の挙動:公開一括管理機能の画面URL(https://sample-service.com/admin/bulk_publish/)にアクセスした際には、バックエンドで /admin/bulk_publish/get_resource エンドポイントが呼び出される構成になっています。しかし当該エンドポイントに対するAPIレベルの認可チェックが実装されておらず、作業者権限のセッションでも正常なレスポンスを取得できる状態です。
3
再現手順 (Proof of Concept)
前提条件:正規の作業者権限アカウントを保有していること。
1
仕様確認:権限一覧を確認し、公開一括管理機能は作業者が利用不可であることを確認します。
2
画面挙動の確認:作業者権限でログインし、メニューに機能が表示されないことを確認します。
3
セッション取得:ブラウザの開発者ツールを用いて、作業者権限アカウントのセッション情報を取得します。
4
攻撃リクエスト送信:取得したセッション情報を付与した状態で、直接
POST /admin/bulk_publish/get_resource エンドポイントへリクエストを送信します。5
結果確認:成功を示すステータスコード(
200 OK)と、機密データが返却されることを確認します。
HTTP Request
▼ 攻撃リクエスト
POST /admin/bulk_publish/get_resource HTTP/2 Host: sample-service.com Cookie: session_id=sample_operator_session_12345; ... User-Agent: Mozilla/5.0 ... Content-Type: application/json Origin: https://sample-service.com Referer: https://sample-service.com/admin/dashboard { "request_type": "initial_load", "params": null }
HTTP Response
▼ 200 OK(認可チェックなし)
HTTP/2 200 OK Server: nginx Content-Type: application/json; charset=utf-8 X-Frame-Options: SAMEORIGIN { "result": "success", "error": [], "count": 5, "videos": [ { "id": 10440, "title": "Secret_Project", "upload_datetime": "2025-11-28 18:02:50", "public_datetime": "2025-11-28 18:23:33", "member_id": 252 } ] }
4
影響
本脆弱性により、本来は公開一括管理機能の利用権限を持たない作業者権限アカウントが、当該機能のバックエンドAPIへ直接アクセスできる状態になっています。
仕様との乖離:「作業者は機能を利用できない」という仕様と、実際のシステム挙動が一致していません。
権限昇格・情報参照:作業者アカウントが、権限外の機密コンテンツ(非公開プロジェクトのタイトル・日時・メンバーIDなど)を参照可能な状態です。
将来的なリスク:同様の設計パターンが他のエンドポイントにも存在する可能性があり、機能追加に伴って影響範囲が拡大するリスクがあります。
5
技術的な原因
技術的な原因は、公開一括管理機能のバックエンドAPIである
/admin/bulk_publish/get_resource エンドポイントに対する認可チェックが適切に実装されていないことにあります。フロントエンドの表示制御はされているものの、バックエンドでのセッション検証・権限照合処理が欠落しています。
フロントエンドの非表示制御と、バックエンドAPIのアクセス制御は独立して実装される必要があります。フロントエンドの制御のみではHTTPリクエストを直接送信することで容易に回避できるため、バックエンド側での認可処理が不可欠です。
6
推奨対策
1. バックエンドAPIでの認可チェックの実装
エンドポイント処理の冒頭で、セッション等から取得したユーザーの権限ロールを確認し、公開一括管理機能の利用が許可されているロール以外からのアクセスを拒否してください。作業者権限からのリクエストには
403 Forbidden を返却する処理を追加します。
2. 認可処理の共通化
権限チェックロジックを各エンドポイントに個別実装するのではなく、ミドルウェアやデコレータとして共通化することを推奨します。これにより、将来的な機能追加時の漏れを防止できます。
3. テストの実施
是正後は、異なる権限ロールで保護されたエンドポイントへの直接アクセスを試みる認可テストを実施し、適切に拒否されることを確認してください。
7
CVSS v3.1 評価詳細
本脆弱性は以下のメトリクスに基づき Base Score: 4.3 (Medium) と評価されます。
| メトリクス | 評価値 | 根拠 |
|---|---|---|
| 攻撃元区分 (AV)N | Network | HTTPベースのWebアプリケーションであり、ネットワーク越しにリクエストを送信して再現できるため。 |
| 攻撃条件の複雑さ (AC)L | Low | 特別な条件なしに、標準的なHTTPクライアントで再現可能。 |
| 必要な特権レベル (PR)L | Low | 作業者権限の正規アカウント(最低限の権限)で再現可能。 |
| ユーザー関与 (UI)N | None | 攻撃者単独で操作可能。他ユーザーの関与は不要。 |
| スコープ (S)U | Unchanged | 影響範囲は当該システムの脆弱なコンポーネント内に限定される。 |
| 機密性への影響 (C)L | Low | 権限外のコンテンツ情報(タイトル・日時・メンバーID等)を参照可能。完全な情報漏洩ではない。 |
| 完全性への影響 (I)N | None | 読み取り専用の操作であり、データの改ざんは確認されない。 |
| 可用性への影響 (A)N | None | サービスの可用性に影響を与えない。 |