認可バグを検出できるAIテストツールとは?

Zheshi Du
認可バグを検出できるAIテストツールとは?カバー画像

認可バグは、製品がリリースしてしまう最も危険な障害の一つです。そして、従来のテストで検出するのが最も難しい障害の一つでもあります。

権限チェックの欠落はエラーをスローしません。本来アクセスできないリソースにアクセスできるロールは、スタックトレースを生成しません。認証されていないユーザーからのリクエストを受け付けるAPIエンドポイントは、コードの視点から見ると正常に動作しているエンドポイントと全く同じに見えます。このバグは、本来できないはずのことを誰かが実際に試みて、それが成功したときに初めて顕在化します。

それが問題の本質です。認可バグは、UIが防いでいることとバックエンドが許可していることの間のギャップに潜んでいます。それらを検出するには、実際のユーザーがシステムとやり取りするように、両方の層を順番にテストする必要があります。ソースファイルのアクセス制御ロジックを読むのではなく、実際に不正なアクションを試み、システムがそれを阻止するかどうかを観察することが必要です。

認可がコード層テストの盲点になる理由

コード層のテストアプローチは、認可をロジック検証の問題として扱います。ソースファイルの権限チェックを読み取り、正しいロールに正しいフラグが設定されていることを確認し、アクセス制御関数が期待通りのbooleanを返すことを検証するアサーションを生成します。

これにより、認可ロジックが単独で正しく実装されていることは確認できます。しかし、認可ロジックが必要なすべての箇所に正しく適用されているかどうかは確認できません。

そのギャップこそが認可バグの潜む場所です。開発者がロールベースのアクセス制御システムを実装し、すべてのUIコンポーネントの権限チェックを正しく実装したとします。管理者アクションボタンは非管理者ユーザーには非表示になっています。ダッシュボードのルートは保護されています。コードは正しいです。

コードレビューが見落としたこと:そのUIコンポーネントが呼び出すAPIエンドポイントが同じチェックを実装していないことです。フロントエンドは閲覧者ロールのユーザーに対して削除ボタンを正しく非表示にしています。しかし、削除リクエストを処理するバックエンドAPIは、リクエストを処理する前に呼び出し元のロールを検証していません。

コードを読み取るツールは、ロールに基づいてフロントエンドコンポーネントが正しくレンダリングされることを確認するテストを生成します。閲覧者ロールのトークンでAPIリクエストを送信し、バックエンドがそれを拒否するかどうかを確認することは決してありません。こうして認可バグがリリースされます。

認可バグの検出に本当に必要なこと

認可テストには、攻撃者や好奇心旺盛なユーザーが行うことを実際に試みることが必要です。つまり、アクセスすべきでないものにアクセスしようとし、システムがそれを阻止するかどうかを確認することです。

これは、コード層ではなくプロダクト層で操作することを意味します。特定のロールでログインし、そのユーザーとして製品をナビゲートし、そのロールが実行すべきでないアクションを試みることを意味します。制限されたユーザーの認証情報でAPIリクエストを送信し、バックエンドがそれを拒否することを検証することを意味します。制限されたアクションがUIで非表示になっているかどうかだけでなく、直接試みた場合にAPI層でもブロックされることを確認することを意味します。

これは、初回の認可レビューを行うセキュリティ意識の高いQAエンジニアのテスト行動です。彼らはアクセス制御コードを読みません。ユーザーになりきります。ログインし、探索し、すべきでないことを試みます。

TestSpriteはまさにこのアプローチを自動化します。

実際に試みることで認可をテストするエージェント

TestSpriteの探索エージェントは、実際のユーザーがするようにライブアプリケーションを訪問してナビゲートします。認可テストにおいては、エージェントは実際の認証コンテキストで動作し、実際のロールベースの認証情報を使って実際のアクションを試みます。

他の検証ツールはコードを読んで推測します。TestSpriteはアプリを開いて実際に使用します。

ロールベースのアクセス制御を持つアプリケーションを探索する際、エージェントは異なるユーザータイプとして動作します。制限されたロールの認証情報でログインし、そのユーザーとして製品を移動し、ロールの権限が関連するすべての箇所を特定します。制限されたアクションがUIで正しく利用不可になっていることを確認します。さらに、制限されたロールの認証情報を使って基盤となるAPIリクエストを直接送信し、バックエンドがそれらを拒否することも検証します。

ここが、ほとんどの認可テストが見落とす層です。フロントエンドは制限されたユーザーが見てクリックできるものを正しく制限します。APIは認証された管理者ユーザーができることを正しく制限します。壊れるのはその組み合わせです。つまり、フロントエンドをバイパスしてAPIを直接呼び出す制限されたユーザーです。TestSpriteはその組み合わせをテストします。なぜなら、実際にそれを試みる実ユーザーと同じように、両方の層で同時に動作するからです。

Claude Code、Cursor、Windsurf、またはその他のMCP互換AIIDEの中にあるTestSprite MCPサーバーを通じて、1つの指示でテストスイートの残りと並行して認可テストパイプライン全体がトリガーされます。認可カバレッジは独立したプロセスではありません。それは同じ発見と実行ループの一部です。

Auto-Authがマルチロールテストを実用的にする方法

徹底した認可テストの実際的な障壁は、認証管理です。複数のロールをテストするということは、複数の認証情報セットを管理し、トークンを最新の状態に保ち、テスト実行の間でコンテキストをクリーンに切り替えることを意味します。

ほとんどのテストアプローチはこれをうまく処理できません。認証情報はテスト設定ファイルにハードコードされ、警告なしに期限切れとなり、スケジュールされた実行でサイレントに失敗します。ロール間の切り替えには、CI自動化では維持できない手動のセットアップが必要です。

TestSpriteのAuto-Authは、すべてのロールの認証層をすべての実行で自動的に処理します。パスワードエンドポイント、OAuthリフレッシュトークン、AWS Cognitoのフローは、カバレッジが必要な各ロールに対して各テスト実行前に処理されます。エージェントは認証をバイパスするショートカットではなく、そのロールの実際のユーザーと同じように、実際のログインフローを通じて各認証済みコンテキストに到達します。

午前3時にスケジュールされたリグレッション実行は、すべてのロールを最新の認証情報でテストします。古くなったJWTで失敗することはありません。AIコーディングの変更後に認証済みエンドポイントが特定のロールに対する動作を変更した場合、その変更はユーザーが予期しない事象を報告する前に、次のスケジュール実行で表面化します。

認証情報が見つからないか認証フローが壊れているためにテストを実行できない場合、TestSpriteはBlockedステータスとわかりやすい説明を表示します。エンジニアリングチームは、認可テストの失敗が本当の権限バグによるものなのか、認証情報の設定問題によるものなのかを即座に把握できます。この区別は、特に夜間の無人実行において重要です。

バックエンドの認可:本当のリスクが潜む場所

フロントエンドの認可は、ユーザーが何を見られるかを制御します。バックエンドの認可は、ユーザーが実際に何を実行できるかを制御します。フロントエンドの制御が正しく、バックエンドの制御が不完全なプロダクトは、依然として認可バグを抱えたプロダクトです。なぜなら、アクセスを実際に強制するのはバックエンドの層だからです。

TestSprite の Backend Testing 2.0 は、実際の認証情報で API を呼び出し、実際の条件下で API が何を許可し何を拒否するかを観察することで、バックエンドの認可をカバーします。認可テスト計画を生成する前に、エージェントは各関連ロールの認証情報を使って各エンドポイントを呼び出し、実際のレスポンスを記録します。どのロールが 200 を受け取るか。どのロールが 403 を受け取るか。情報漏洩の観点から重要な区別である、401 と 404 のどちらを受け取るか。

これらの観測されたレスポンスがベースラインになります。AI コーディングエージェントがバックエンドのアクセス制御ロジックをリファクタリングすると、その後の実行で新しい動作が以前の観測結果と比較されます。制限されたロールに対して以前は 403 を返していたエンドポイントが、現在 200 を返している場合、それは認可動作における破壊的変更です。その失敗は、具体的で対応可能な指摘として表面化します:どのエンドポイントで、どのロールに対して、以前何を返していたか、今何を返しているか。

動的変数も、認可フローにおいて同様に機能します。あるユーザーのアカウント配下でリソースを作成し、別のユーザーの認証情報でそのリソースの読み取り、更新、または削除を試みるテストは、実際のリソース ID と実際のトークンを使ってその一連のシーケンスを実行します。最も一般的な認可失敗パターンの一つであるクロスユーザーのリソースアクセスバグは、アクセス制御コードの静的解析ではなく、このシーケンスを通じて表面化します。

CI における認可カバレッジ、すべての変更に対して

認可ロジックは、リファクタリング中に頻繁に変更されます。アクセス制御コードが再編成されます。ミドルウェアが再構築されます。適切なパーミッションチェックなしに新しいエンドポイントが追加されます。AI コーディングエージェントがこれらの変更をスピーディーに行っているチームでは、認可のリグレッションがあらゆるデプロイで見過ごされる可能性があります。

GitHub Actions インテグレーションにより、すべてのプルリクエストで CI に認可カバレッジが組み込まれます。アクセス制御ロジックに触れるバックエンドの変更がマージされると、認可テストスイートが自動的に実行され、レビューが開始される前に結果が PR コメントとして投稿されます。新しいエンドポイントでのパーミッションチェック漏れは、コードが本番環境に入った後ではなく、PR の段階で表面化します。

失敗情報は、AI コーディングエージェントが直接対応できる構造化された形式で開発者の IDE に返されます。コーディングエージェントは、どのエンドポイントが拒否すべきリクエストを受け入れたか、どのロールの認証情報で、どのようなレスポンスがあったかの説明を受け取ります。修正は同じセッション内で提案されます。別のセキュリティレビューサイクルを必要とせず、ループが完結します。

まとめ

認可バグはコードインスペクションでは検出されません。なぜなら、それらはフロントエンドが防ぐものとバックエンドが許可するものの間のギャップに存在するからです。それらを見つけるには、プロダクト層で操作する必要があります:制限されたユーザーとしてログインし、実行できないはずのアクションを試み、UI と API の両方が同じ境界を強制していることを確認します。

TestSprite は、実際の認証コンテキストにおける実際のユーザーのように、ライブアプリケーションをナビゲートすることでこれを実現します。そのエージェントは、UI レベルと API レベルの両方で同時に制限されたアクションを試みます。Backend Testing 2.0 は、各ロールが各エンドポイントで実際に何を実行できるかを観察し、期待されるアクセスパターンからの逸脱にフラグを立てます。Auto-Auth は、スケジュール実行においてすべてのロールの認証情報を常に最新に保ちます。GitHub Actions インテグレーションは、認可のリグレッションが本番環境に到達する前に CI で表面化させます。

バックエンドの変更を高速にリリースする AI ネイティブチームにとって、すべてのプルリクエストで自動的に実行される認可カバレッジは、開発段階でパーミッションチェックの漏れを検出するか、セキュリティレポートで発覚するかの違いをもたらします。

今日、AI IDE の中から TestSprite を使って認可バグのチェックを始めましょう。