Hello there, ('ω')ノ
✅ 定義
水平的権限昇格とは:
一般ユーザーが他のユーザーのデータや機能に不正アクセスできてしまうことを指します。
📌 垂直的権限昇格との違い
種類 | 内容 | 例 |
---|---|---|
垂直的権限昇格 | 権限の階層を上に超える(例:一般 → 管理者) | ユーザーが管理画面を操作する |
水平的権限昇格 | 同一権限内で他人の操作を行う | ユーザーAがユーザーBの情報を閲覧・変更する |
🎯 攻撃例
例えば、自分のアカウントページを開くURLが以下のようだったとします:
https://insecure-website.com/myaccount?id=123
このとき、攻撃者が id=124
に書き換えると:
https://insecure-website.com/myaccount?id=124
→ 別ユーザーのアカウントページにアクセスできてしまう!
🔓 脆弱性の名前:IDOR
これは特に次のような脆弱性として知られています:
IDOR(Insecure Direct Object Reference) 「直接的にリソース(オブジェクト)を指定できてしまう状態」
🔍 GUIDで防げるか?
一部のアプリは次のような識別子を使っています:
https://insecure-website.com/myaccount?id=ab94c1a3-772c-4f7e-9a1a-874f81a9f0a1
→ 一見すると推測は難しいですが…
⚠️ 実際には…
- 他の場所(レビュー一覧・コメント欄など)で 他ユーザーのIDが漏れていることが多い
- 例:レビュー欄のHTMLに
<div data-user-id="ab94c1a3-...">
が含まれていたり
✅ 対策方法
対策 | 内容 |
---|---|
✅ リソースごとに所有者チェックを実装 | if (resource.owner_id != session.user_id) return 403 |
✅ パラメータの値に依存しないように設計 | セッションIDやトークンベースで取得 |
✅ IDを使う場合でもアクセス権を検証 | GUIDでもセキュリティは保証されない |
✅ まとめ
水平的権限昇格は、同一権限のユーザー同士で情報や操作が不正に行われる脆弱性です。
IDの推測ができなくても、他ページから情報が漏れていれば意味がないため、 サーバー側での厳密な所有者チェックが必須です。
Best regards, (^^ゞ