コンテンツにスキップ

SAST AutoTriageによるノイズ低減

AutoTriageは静的解析のノイズを低減し、エンジニアが実際のセキュリティ脅威となる問題に集中できるようにします。まず悪用可能性を除外できないかを試み、それでも除外できない場合に限り、残った検出結果を(1)悪用可能性、(2)悪用された場合の重大度、の順にランク付けします。Aikidoでは、AutoTriageは主にSAST検出結果に対して動作し、ローカルIDE・PRチェック・定期再スキャンといった使い慣れた開発ワークフローに組み込まれます。

AutoTriageとは何か(何でないか)

Section titled “AutoTriageとは何か(何でないか)”

AutoTriage自体はスキャナーではありません。スキャンの後段に位置し、コードとそのコンテキストに基づいて悪用可能性重大度を判定します。

SASTの問題の大部分については、AikidoはAikido独自のルールに基づいてトリアージを行います。より複雑なケースの一部では、Aikidoは推論モデルを使ってより繊細な制御フロー・データフローを解釈します。これには、コールツリーを算出し、脆弱性シンクに渡される変数を参照する呼び出し先関数を組み込むことで、関連するコードスニペットを構築する処理が含まれます。

Aikidoの社内評価では、このアプローチにより、複雑なケースにおいて推論を使わないアプローチと比較しておよそ2倍の誤検知を検出できています。

トリアージ前の誤検知フィルタリング

Section titled “トリアージ前の誤検知フィルタリング”

AutoTriageがLLMでコードを確認する前に、Aikidoのreachabilityエンジンが、脆弱なコードパスがそもそもアプリケーション内で到達可能かどうかを確認することで誤検知を除外します。具体的には次のような確認が含まれます。

  • 該当する関数を実際に呼び出しているかどうかの検証
  • 脆弱な依存関係がツールでのみ使われているか、それとも本番環境で使われているかの追跡
  • ソースとシンクの間にサニタイズ処理があるかどうかの確認
  • 古い、または使われていないコードパスの除外

これらのステップだけでも、多くの従来型スキャナーと比べてアラート数を大幅に抑制できます。

reachability解析によって、信頼できない入力から危険なシンクへの経路が存在しない、または本番フローの外で使われていると判定された場合、多くの潜在的な問題が自動的に「無視」としてマークされることに気づくはずです。

悪用可能性を除外できない場合、AutoTriageは優先度付けに進みます。

問題が悪用可能である可能性が残っている場合、AutoTriageは発生可能性と影響度を評価して優先度を設定します。Aikidoの重大度スコア(0〜100)を起点とし、前段のステップで収集したコードコンテキストを使ってスコアを上下に調整します。

例:

  • 入力変数が、上流で既に検証済みのデータベースなど信頼できるソースに由来する場合、SQLインジェクションの報告は安全にダウングレードされることがあります
  • NoSQLインジェクションのリスクがあるログインエンドポイントは、攻撃が容易で認証に直接影響するため、以下のように「修正の優先度が非常に高い」にアップグレードされることがあります

トリアージの結果、真陽性と判定された場合、AikidoはAutoFixを通じて推奨パッチを生成し、レビュー用のプルリクエストを開くことができます。AutoFixは報告された脆弱性のみに焦点を当てており、GitHub・GitLab・Bitbucket・Azure DevOpsのPRチェック、およびローカルIDEで利用できます。

AutoTriageは設計上コンテキストを多く必要とします。実際には、次のような要素を考慮します。

  • ユーザー入力が機密性の高いシンクに到達可能かどうか、およびサニタイズ/検証の有無と有効性
  • 入力が信頼できるストアに由来するかどうか、また脆弱なコードがビルド時・テスト時に使われるか本番環境で使われるか
  • データの機密性など、ビジネスへの影響に関するシグナル
  • 複雑なルールについては、推論モデルがOS固有のセパレータやパス解決のセマンティクスといったエッジケースを評価します

RecommendationパネルのAsk Aikidoをクリックすると、なぜフラグが立てられたのか、脆弱なコードにどのように到達するのかなど、脆弱性について知りたいことを質問できます。