API5:2023 機能レベル認可の不備(Broken Function Level Authorization)
| Threat agents / Attack vectors(脅威エージェント/攻撃ベクター) | Security Weakness(セキュリティの弱点) | Impacts(影響) |
|---|---|---|
| API 固有:悪用難易度(Exploitability) 容易 攻撃者は、本来アクセス権のない匿名ユーザーや一般(非特権)ユーザーとして、正当な API 呼び出し を脆弱なエンドポイントへ送るだけでよい。露出したエンドポイントは容易に悪用される。 |
蔓延度(Prevalence) 一般的 : 検出可能性(Detectability) 容易 機能やリソースに対する認可チェックは、通常 設定 または コードレベル で管理される。現代のアプリは多様な ロール/グループ/複雑なユーザ階層(サブユーザー、複数ロール等) を持つため、適切なチェックの実装は混乱しやすい。一方で API は構造化されており、機能へのアクセスが予測しやすいため、こうした欠陥は見つけやすい。 |
技術的影響(Technical) 重大 : ビジネス影響(Business) ケース依存 この種の欠陥により、攻撃者は 権限外の機能 にアクセスできる。特に 管理機能 が主要な標的となり、データ漏えい/消失/改ざん に至る。最終的には サービス障害 を招く可能性もある。 |
API は脆弱か?
機能レベル認可の欠陥を見つける最良の方法は、ユーザ階層、各種ロール/グループ を踏まえつつ、認可メカニズムを詳細に分析し、次の問いを立てることです:
- 一般ユーザーが 管理用エンドポイント にアクセスできてしまわないか?
- ユーザーが、本来許可されない 機微な操作(作成/変更/削除) を、HTTP
メソッドを変えるだけ(例:
GET→DELETE)で実行できないか? - グループ X のユーザーが、URL
やパラメータ(例:
/api/v1/users/export_all)を推測するだけで、本来 グループ Y のみに公開 すべき機能へアクセスできないか?
URL パスだけ を根拠に、そのエンドポイントが一般用か管理用かを 決めつけない こと。
開発者が管理系エンドポイントを /api/admins
のような特定の相対パスにまとめることはあるが、実際には /api/users など
一般用と同一パス配下 に管理系が混在していることも非常に多い。
攻撃シナリオ例
シナリオ #1
招待ユーザーのみ参加可能なアプリの登録プロセスで、モバイルアプリは
GET /api/invites/{invite_guid} を呼び出し、応答 JSON には ユーザーのロール
や メール など招待の詳細が含まれる。
攻撃者はリクエストを複製し、HTTP メソッドとエンドポイントを
POST /api/invites/new に改ざん。これは 管理コンソール
からのみアクセスされるべきエンドポイントだが、機能レベル認可チェックが未実装。
攻撃者は管理権限付きの新規招待を送信して悪用する:
POST /api/invites/new
{
"email": "attacker@somehost.com",
"role":"admin"
}
後に攻撃者は、この細工した招待で 管理者アカウント を作成し、システムへ フルアクセス を獲得する。
シナリオ #2
ある API には、管理者のみに公開すべき GET /api/admin/v1/users/all
が存在し、アプリの 全ユーザーの詳細
を返すが、機能レベル認可チェックがない。API
構造を把握した攻撃者が推測アクセスし、機微情報が露出する。
防止方法(How To Prevent)
アプリケーションには、全ての業務機能から呼び出される 一貫性があり分析しやすい 認可モジュール を用意すべきです。多くの場合、こうした防御はアプリコード外部のコンポーネントで提供されます。
- デフォルト拒否 を徹底し、各機能へのアクセスは 特定ロールへの明示的付与 を要求する。
- アプリの 業務ロジック と グループ階層 を念頭に、API エンドポイントを機能レベル認可の欠陥観点でレビューする。
- 管理コントローラ は、ユーザーの グループ/ロールに基づく認可チェック を実装した 抽象管理コントローラ から継承させる。
- 通常コントローラ内の管理機能 に対しても、ユーザーの グループ/ロール に基づく認可チェックを必ず実装する。
References
OWASP
- Forced Browsing
- "A7: Missing Function Level Access Control", OWASP Top 10 2013
- Access Control