Shikata Ga Nai

Private? There is no such things.

水平的権限昇格(Horizontal Privilege Escalation)とは?

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, (^^ゞ