コンテンツにスキップ

誤検知を排除するReachability解析の例

Aikidoは100を超える独自ルールを組み合わせることで、誤検知や無関係なアラートを削減しています。これらの基本ルールの多くは、Aikido独自のReachability解析エンジンによって支えられています。

Aikidoは依存関係やファーストパーティコード内に既知の脆弱性を検出すると、アプリケーションが実際にその脆弱なコードパスを呼び出せるかどうかを確認します。具体的には、軽量な呼び出し/依存関係グラフを構築し、コードから影響を受けることが分かっている関数やクラスへの参照をトレースします。脆弱なコードにReachability(到達可能性)がない場合(あるいはテストやツールなど本番環境以外でのみ使用されている場合)、アラートは重要度が引き下げられるか、抑制されます。

これにより、使用状況にかかわらずすべての脆弱なパッケージを報告する従来型のスキャナーと比べて、大幅なノイズ削減が実現します。

例1: 影響を受ける関数を使用していない場合

Section titled “例1: 影響を受ける関数を使用していない場合”

Aikidoの内部ナレッジベースによると、CVE-2020-7774setLocale 関数にのみ影響します。解析の結果、コードベースが setLocale を一切参照していないことが分かれば、影響を受けていません。Aikidoはこの問題の重要度を引き下げ、今後のコード変更でこの関数が使用され始めないか監視を続けます。

セキュリティ解析の結果、リポジトリ内でCVE-2020-7774の脆弱性の使用は見つかりませんでした。

例2: 脆弱なパッケージがツール用途でのみ使用されている場合

Section titled “例2: 脆弱なパッケージがツール用途でのみ使用されている場合”

JSパッケージの minimatch には脆弱性がありますが、これは eslintmochajs からのみ取り込まれていることが検出されます。これらはリンティング/テスト用の依存関係であり、本番環境には出荷されないため、エンドユーザーには影響しません。Aikidoはこれに応じて問題の重要度を引き下げます。

例3: 使われていない依存パスの場合

Section titled “例3: 使われていない依存パスの場合”

あるパッケージ(path-parse)にCVEが存在することが分かっており、これは pug によって要求されています。トレースの結果、pug はアプリケーションで既に使用されていない(import・参照がない、またはビルドから除外されている)ことが分かりました。この場合、そのCVEは安全に無視できます。

CVE-2021-23343に関する依存関係のReachability解析。リポジトリ内の脆弱なパッケージのパスを示しています。


  • 呼び出し/依存関係グラフ化: コードがパッケージをどのようにimportし呼び出しているかをマッピングし、そこからCVEに関連する関数へのエッジをたどります。
  • コンテキストの認識: 本番環境で実行されるコードと、開発・テストツール(リンティング、テスト、ビルド用コードなど)を区別するため、ツール用途のみの使用が本番環境に影響するアラートを発生させることはありません。
  • 慎重な重要度引き下げ: 検出結果は、脆弱なシンボルにReachabilityがないことが証明できた場合にのみ重要度が引き下げられるか、抑制されます。新たなimportなど、証拠が変化した場合は重要度が自動的に再評価されます。
  • ヒューリスティックとビルド構成: 動的な処理パターン、カスタムローダー、特殊なビルド手順などは呼び出しグラフを不明瞭にすることがあります。使用状況が不明確な場合、一部の問題は重要度を高いまま維持することがあります。
  • 推移的な変更: 間接的な依存関係の更新により、これまで到達できなかったコードが到達可能になることがあります。Aikidoは依存関係の更新やコード変更の後も継続的に再チェックを行います。