前回は、生成AIオプションのスキャン機能のうち、セカンドオーダーXSS の検出方法を解説しました。
今回は、認可制御の不備の脆弱性の検出方法について解説します。
●認可制御の不備の脆弱性
Webアプリケーションにおける認可制御の不備とは、どの利用者にどの操作を許可するかを制御する、認可制御の仕組みが適切に実装されていない状態を言います。認可制御の不備の脆弱性がある場合、権限のないユーザーが機密データにアクセスしたり、他のユーザーのアカウントを操作したりすることが可能になります。
典型的な脆弱性とその影響には以下があります。
- 権限昇格: 低い権限のユーザーが、高い権限を必要とする操作を実行できる。
- なりすまし: ユーザーが他のユーザーと同等の権限を持ちながら、他のユーザーのデータにアクセスできる。
- アクセス制御の回避: 権限のないエンドポイントや機能へアクセスできる。
●攻撃シナリオ
攻撃シナリオについて、OWASP Top10 2021 の記載例をベースに説明します。
攻撃者は、ブラウザで管理者ページの URL を直接指定してアクセスします。本来、管理者ページにアクセスするには管理者権限が必要です。
https://example.com/app/admin_getappInfo
管理者権限のないユーザが管理者のページにアクセスできるなら、脆弱であると判定できます。
●ChatGPT を活用した認可制御の不備の検出方法
認可制御の不備は、ページに対する本来のアクセス権限を推測する必要があるため、ツールでの自動検出は困難というのが通説でした。
しかし、AeyeScan の自動巡回エンジンと ChatGPT のような高性能の生成AI を組み合わせることにより、高い精度で検出することが可能になります。
ツールで認可制御の不備を検出する仕組みを構築するにあたり、まずは検出フローから整理していきます。
●検出フロー
手動診断を行う人間(脆弱性診断士)は、下記のような工程を経て、脆弱性の有無を判定します。
1.管理者アカウント(権限の高いアカウント)でサイトを巡回
2.一般ユーザアカウント(権限の低いアカウント)でサイトを巡回
3.巡回結果の差分を抽出し、管理者アカウントのみに存在するメニューを特定。それを管理者メニューとする。
4.一般ユーザアカウントで管理者メニューにアクセス可能かどうかを確認する。アクセスできたら脆弱と判定する。
各工程を自動化することができれば、認可制御の不備のツール検出が可能であるといえます。
ここからは、AeyeScan でどのように自動化を進めたかを説明していきます。
●各工程の自動化方法
・管理者アカウント(権限の高いアカウント)でサイトを巡回
・一般ユーザアカウント(権限の低いアカウント)でサイトを巡回
AeyeScan には自動巡回機能が備わっており、上記2点の条件は達成できていました。
・巡回結果の差分を抽出し、管理者メニューを特定
管理者アカウントとユーザアカウントの巡回結果を比較すれば抽出可能と思われますが、ユーザに紐付く登録データの違いなどでも差分が発生するため、単純な差分の比較だけで管理者メニューを特定することは困難でした。そこで ChatGPT の力を借りることにしました。
・一般ユーザアカウントで管理者メニューにアクセス可能かどうかを確認
AeyeScan の画面遷移再現機能を使用して、一般ユーザアカウントで管理者メニューの URL にアクセスし、アクセス可否を確認します。
工程 | 実現方法 | 備考 |
管理者アカウントでサイトを巡回 | AeyeScanの自動巡回機能 | |
一般ユーザアカウントでサイトを巡回 | AeyeScanの自動巡回機能 | |
巡回結果の差分を抽出し、管理者メニューを特定 | ChatGPTの支援 | ロジックのみでは困難 |
一般ユーザアカウントで管理者メニューに アクセス可能かどうかを確認 | AeyeScanの画面遷移再現機能 |
●管理者メニューを特定するプロンプトの作成
必要な機能が分かったので、管理者メニューを特定するためのプロンプトを作成していきます。
対象サイトの HTML は、以下としました。
<div class="menu">
<!-- 共通メニュー項目 (全ユーザー対象) -->
<a href="/home" class="menu-item">ホーム</a>
<a href="/products" class="menu-item">製品・サービス</a>
<a href="/about" class="menu-item">会社概要</a>
<a href="/news" class="menu-item">ニュース・ブログ</a>
<a href="/contact" class="menu-item">お問い合わせ</a>
<!-- 管理者専用メニュー項目 (管理権限のあるユーザーのみ表示) -->
<a href="/dashboard" class="menu-item">ダッシュボード</a>
<a href="/user-management" class="menu-item">ユーザー管理</a>
<a href="/content-management" class="menu-item">コンテンツ管理</a>
<a href="/settings" class="menu-item">設定</a>
<a href="/reports" class="menu-item">レポート</a>
</div>
HTML の情報を ChatGPT に入力して、管理者メニューかどうかを判別するプロンプトを作成してみましょう。

シンプルなプロンプトで、管理者メニューである
- ダッシュボード (/dashboard)
- ユーザー管理 (/user-management)
- コンテンツ管理 (/content-management)
- 設定 (/settings)
- レポート (/reports)
を抽出することが出来ました。
簡単な HTML での実験ではありますが、正確に抽出できていることがわかります。
ただし、これだけでは、管理者メニューと断定するのに十分確認したとは言えません。ダッシュボードや設定などのメニューは、一般ユーザにも存在するメニューの可能性があります。管理者メニューかどうかを判定するために、一般ユーザアカウントでログインし、表示されるメニューを確認する必要があります。
一般ユーザアカウントでのログイン時に表示されたメニューが以下であれば、判定結果は正しいといえそうです。
<div class="menu">
<a href="/home" class="menu-item">ホーム</a>
<a href="/products" class="menu-item">製品・サービス</a>
<a href="/about" class="menu-item">会社概要</a>
<a href="/news" class="menu-item">ニュース・ブログ</a>
<a href="/contact" class="menu-item">お問い合わせ</a>
</div>
ここまでの手順で、管理者メニューの URL を特定することが出来ました。
●脆弱性の検出
最後に、脆弱性の有無を確認します。
確認手順は以下の通りです。
1. 一般ユーザアカウントでログインする
2. 管理者メニューの URL に直接アクセスしてみる
a. /dashboard
b. /user-management
c. /content-management
d. /settings
e. /reports
3. コンテンツの中身が正常に表示されたら脆弱であると判定する(表示権限がありません、などのエラーメッセージが表示されず、管理者アカウントでのアクセス時と類似の内容が描画される)
最終的には、上記のようなシンプルな Aタグ以外からでも管理者メニューを抽出できるようにプロンプトをブラッシュアップし、全ての手順を自動化することで、認可不備の脆弱性を検出することが可能になりました。
●まとめ
以上、生成AIオプションのスキャン機能のうち、認可不備の脆弱性について解説しました。
生成AI の技術を活用することにより、自動化が難しいとされている脆弱性の検出に今後もチャレンジしていきます。