utsuroi access control labs 知識ベース 01 / 02 — 認可の基礎
Authorization Fundamentals · Knowledge Base
01

認可の基礎

Vertical and horizontal access control, and where each breaks

認可(Authorization)は「あなたに何が許されているか」の判定。認証(あなたが誰か)が成立した後の世界の話です。Access Control の脆弱性は OWASP Top 10 で常に上位に位置する、地味だが致命的な問題群です。

1. 縦の認可と横の認可 #vertical-vs-horizontal

「役割」と「所有」の2軸。

認可の脆弱性は大きく2分類されます。

実務では横の認可不備が圧倒的に多い。理由は「権限分離」は意識しても、「同じ権限でも他人のデータは見せない」という制御は実装が複雑で漏れやすいから。

2. IDOR(Insecure Direct Object Reference) #idor

URL の ID を変えるだけで他人のデータが見える。

URL や API の ?order_id=12345/users/789/profile のような直接識別子(ID)を、別の値に変えるだけで他人のデータにアクセスできる脆弱性。

// うつろい EC の注文詳細
https://shop.utsuroi.example.com/orders/12345

// 攻撃者が ID を変えてみる
https://shop.utsuroi.example.com/orders/12346
https://shop.utsuroi.example.com/orders/12347
...

// 各リクエストで「現在のログインユーザがその注文の所有者か」を確認していなければ、
// 全注文の詳細(住所・購入商品・金額)が見えてしまう

ありがちな実装ミス:

// 認可チェックなし
$order = Order::find($_GET['order_id']);
return $order->detail();
// 認可チェックあり
$order = Order::find($_GET['order_id']);
if ($order->user_id !== $current_user->id) {
    abort(403);
}
return $order->detail();

3. 予測不可能な ID は対策ではない #opaque-id

UUID にしても本質的な問題は残る。

「連番 ID は推測されやすいから UUID(xyz-abc-123-...)に変えれば安全」という対策はよく見ますが、これはセキュリティ・バイ・オブスキュリティの典型例で、根本対策ではありません。

本質的な対策は「リクエストごとに、ログインユーザがそのリソースに対する権限を持つかをサーバ側で確認する」こと。ID の予測可能性は副次的な要素にすぎない。

UUID v4 の連番化

実際の事例として、外部に渡す ID を UUID にしているシステムでも、内部的に連番 ID を別途持っており、ログや古いエンドポイントから連番 ID が漏れて IDOR に至るパターンがあります。「ID を見えなくする」ではなく「ID を見ても権限がなければ何もできない」が正解。

4. API エンドポイントの認可 #api-control

画面を出さなくても API は晒されている。

モダンな Web アプリは画面のリンクだけでなく、API エンドポイント(/api/orders/12345)を提供しています。「画面に表示されないリンク」は攻撃者にも見えていないと油断するのは危険。

攻撃者は次のような手段で API を発見します:

API レベルでも認可チェックを実装する必要がある。「画面で隠したから安全」ではない。

5. OWASP Top 10 の1位 #owasp-top1

2021年版で「Broken Access Control」が首位に。

OWASP Top 10 — Web アプリケーションの最重要セキュリティリスクを10個に絞ったランキングは、2021年版で「Broken Access Control」が1位になりました。CVE 件数、影響範囲、検知の難しさ、悪用の容易さ全てで上位スコア。

なぜ Access Control の不備がこれほど多いかの理由:

実務では、認可チェックを横断的なミドルウェアとして実装する設計(全ての API リクエストで自動的に「リソース所有者か?」を判定する仕組み)が推奨されます。手書きで毎回 if 文を書く実装は漏れる。