utsuroi access control labs 知識ベース 02 / 02 — 攻撃パターンと防御
Attack Patterns & Defense · Knowledge Base
02

認可攻撃パターンと防御

Common patterns and how to defend systematically

認可不備の発見は、典型的なパターンを知っているかどうかで効率が変わります。逆に、これらのパターンを意識した防御設計を最初から組めば、後付けの修正コストを大きく削減できます。

1. ID 改ざん攻撃 #id-tampering

URL や API の ID を別の値に変える。

最も基本的な IDOR の手法。攻撃者は次のような場所を試します:

自動化ツール(Burp Suite Intruder、ffuf 等)で連番を一斉に試行することで、大量のデータを抽出できる。

2. URL パス改変 #path-traversal-acl

「管理画面はリンクされていないから安全」は通用しない。

一般ユーザの画面には表示されない管理機能の URL を、推測やログ漏洩から発見して直接アクセスする攻撃。

管理機能には認証 + 認可の両方を必須にし、「URL を知っているだけ」では何もできない設計が必要。

3. パラメータ汚染 #parameter-pollution

既知のパラメータに「権限昇格」用の値を混ぜる。

POST リクエストや JSON ボディに、本来送るべきでないパラメータを追加してアプリが受け入れるかを試す攻撃。

// 通常のプロフィール更新リクエスト
POST /api/profile
{ "display_name": "美穂", "bio": "..." }

// 改ざん版 — role や is_admin を注入
POST /api/profile
{ "display_name": "美穂", "bio": "...", "role": "admin", "is_admin": true }

フレームワークによっては、リクエストの全フィールドを自動的にモデルに代入する「Mass Assignment」機能があり、開発者が意図しないフィールドが更新されてしまう。

4. Mass Assignment #mass-assignment

フレームワークの利便性が脆弱性を生む。

Rails や Django などのフレームワークには、リクエストパラメータからモデルのフィールドを一括設定する機能があります。便利だが、危険なフィールド(is_adminbalance 等)も対象になりうる。

// Rails — 危険な実装
@user.update(params[:user])  // params 全部が代入される
// Rails — Strong Parameters でホワイトリスト
@user.update(params.require(:user).permit(:display_name, :bio))

各フレームワークには対策機能があるので、デフォルトで安全な書き方を覚える必要があります:

5. ミドルウェアによる防御 #middleware-defense

手書きの if 文ではなく、横断的に強制する。

各エンドポイントで個別に if (!user->canAccess(resource)) と書く実装は、漏れが必ず発生します。代わりに、認可チェックをミドルウェアやデコレータで強制する設計が推奨されます。

// Django REST Framework — ViewSet レベルで権限クラスを指定
class OrderViewSet(ModelViewSet):
    queryset = Order.objects.all()
    permission_classes = [IsAuthenticated, IsOrderOwner]

class IsOrderOwner(BasePermission):
    def has_object_permission(self, request, view, obj):
        return obj.user == request.user

リソース取得時に必ず権限チェックが走り、所有者でなければ自動的に 403 が返る。チェック忘れを防げる。

6. デフォルト拒否原則 #deny-by-default

「許可リストに無いものは全て拒否」が原則。

Access Control の設計で最も重要な原則:明示的に許可されていない操作は全て拒否する

悪い設計:

良い設計:

設計レビューが防御の主軸

Access Control の脆弱性は、テストで検出するのが難しい(正常系のテストは通るが、認可チェックが書かれていないことに気づけない)。設計時のレビューと、コードレビュー時の認可チェック必須化が、最も効率的な防御です。