AIを活用した認可バグの発見

バグバウンティプログラムは変化しています。報酬の支払いを停止したプログラムもあれば、支払額を80%削減したプログラムもあります。その理由は、AIがバグを大量に見つけているからではありません。AIが「間違ったバグ」を大量に見つけているからです。トリアージチームは、質の低いレポートの山に溺れています。

この環境において、最も重要なスキルはバグを見つけることではありません。バグが存在しないことを証明することです。正しいネガティブ(否定)を見つけなければなりません。

私は、ソースコードが公開されているターゲットに対して、2段階の手法を用いています。

ステージ1:ファンアウト (Fan-out)

安価なAIモデルを使用してコードを読み込ませます。ターゲットを小さな断片に分割します。モデルに対し、不変条件(invariants)が壊れている箇所を探すよう指示します。所有者のチェックなしにオブジェクトがロードされている箇所や、セキュリティゲートがスキップされている箇所を探します。高い再現率(recall)を目指してください。多くの間違いが出ることを想定しておきましょう。

ステージ2:敵対的検証 (Adversarial Verification)

高価で推論能力の高いモデルを使用して、候補を排除(kill)します。すべての候補が反証されることを前提としてください。特定のコード行を引用できる場合にのみ、その候補は生き残ります。そのパスが到達可能であり、他のチェックによってブロックされていないことを証明しなければなりません。

最も価値のあるアウトプットは、反証(refutation)のリストです。このリストが、トリアージ担当者との信頼関係を築きます。

私は、オープンソースのアイデンティティサーバーであるOry Kratosをテストしました。設定フローに注目しました。この領域はパスワード変更やメールアドレスの更新を扱います。ここでのたった一つのミスが、アカウントの乗っ取り(account takeover)につながります。

第1ステージでは、一見魅力的なバグが見つかりました。OIDC戦略において、特定のコンテナにアイデンティティのバインディングが欠落していました。もしチェック漏れだけを探しているなら、これを高深刻度のバグとして報告してしまうでしょう。

しかし、それは間違いです。

その欠落しているバインディングは、悪用不可能です。システムは、ライブセッションクッキーまたは署名済みトークンからターゲットのアイデンティティを取得します。コンテナの特性が実際の書き込みターゲットに適用されることはありません。設計は保たれています。

これを報告することは時間の無駄であり、あなたの信頼性を損なうことになります。私が提供した価値は、「レポートを提出しない」という確信でした。

同じ手法を別のターゲットに適用したとき、本物のバグを見つけました。メインパスでは強制されている認可チェックが、別のエントリポイントで漏れていました。失効したユーザーが、サイドドアから侵入できてしまったのです。このバグは影響度が大きく、標準的なスキャナーでは検知できませんでした。

ゲートキーパー(審査側)は、大量のレポートに対して壁を築いています。成功するためには、AIを用いた作業を厳密に行わなければなりません。人間が読める以上の量のコードをAIに読ませましょう。そして、提出ボタンを押す前に、AIを使って自分自身の考えが間違っていないかを証明してください。

量ではなく、シグナル(有用な情報)に集中してください。

Source: https://dev.to/fdjedkdlsspec/using-ai-to-find-authorization-bugs-and-to-prove-the-ones-that-arent-real-3m7d