依存関係
SCAスキャン
SCAスキャンは、プロジェクトが使用するオープンソースコンポーネントを特定し、それぞれを脆弱性データとライセンスデータに照合します。パイプラインに追加できるセキュリティチェックの中で最も低コストなものの1つです。ただし、スキャンで何が見えて、どこで補完が必要かを理解しておくことが前提です。
更新日
SCAスキャンで行われること
-
対象を読み取る。スキャナーは
package-lock.json、poetry.lock、Cargo.lockなどのマニフェストやロックファイルを読み取るか、コンテナイメージを展開します。 - コンポーネント一覧を作成する。見つけたものを名前とバージョンに解決します。通常は推移的依存関係も含まれます。
- データと照合する。各コンポーネントをGitHub Advisory Database、OSV、NVDなどの情報源で照会し、ライセンスを自社のポリシーと比較します。
- 報告する。検出結果は深刻度順に並び、通常は修正済みバージョンが示されます。CIでは、ポリシーによってジョブを失敗させることができます。
これが属するより広い取り組みについては、ソフトウェアコンポジション解析とはをご覧ください。
SCAスキャンを実行すべき場所
1か所で1回スキャンするだけでは抜けが残ります。各段階が異なる問いに答えるため、多くのチームは複数の場所で実行しています。
| 場所 | 答えられる問い | 見落とすもの |
|---|---|---|
| 開発者のマシンまたはIDE | このパッケージを追加しても安全か? | 開発者がスキャンを実行しなかったもの |
| プルリクエスト | この変更で既知のリスクが加わるか? | 変更されていないコードに対する新しいアドバイザリ |
| CIビルド | リリースには何が含まれているか? | スキャナーがビルド内で見えないもの |
| コンテナレジストリ | このイメージには何が含まれているか? | 痕跡を残さないコンパイル済みコードやビルドツール |
| リリース後 | 出荷したものが新たな問題の影響を受けるか? | 出荷内容の記録が完全であれば、なし |
多くの取り組みで抜け落ちているのが最後の行です。新しいアドバイザリが数か月前に出荷したバージョンに影響しても、それに対するスキャンをトリガーするプルリクエストはありません。
SCAスキャン結果の読み方
実際のプロジェクトを初めてスキャンすると、数百件の検出結果が返ってくることがよくあります。次の順序で対応します。
- 悪用されているものから始める。 CISAのKEVカタログに載っている検出結果は、既知の悪用がないCVSSスコアの高いものより優先されます。脆弱性の優先順位付けの方法をご覧ください。
- 該当するかを確認する。開発専用の依存関係は出荷されません。一部のツールは到達可能性分析を加え、脆弱なコードがそもそも呼び出されうるかを確認します。
- 適切な階層で修正する。推移的な検出結果の場合、修正は通常それを取り込んでいるパッケージで行います。どのパッケージかは依存関係グラフで分かります。
- 修正しないものを記録する。受け入れると判断した検出結果には理由を残さないと、次の担当者が同じ作業を繰り返すことになります。VEXは、それを記録するための標準的な方法です。
スキャン結果がクリーンでも、ソフトウェアがクリーンとは限らない理由
- 見えるのは宣言されたものだけ。スキャナーは目の前のファイルを読み取るため、ロックファイルをコミットしていないリポジトリでは手がかりがほとんどなく、インストールフックで取得されたコードは一切現れません。
- 見えるのは指定した対象だけ。パイプラインのベースイメージ、ビルドツール、GitHub Actionsは、アプリケーションのマニフェストとは別物です。
- 分かるのは公開済みの情報だけ。新しい悪意のあるパッケージには、まだアドバイザリがありません。
- 一覧はビルドそのものではない。ビルドは実行時にバージョンを解決するため、スキャンが読み取った内容とリリースに含まれる内容は異なる場合があります。
これらは商用でもオープンソースでも、スキャンという手法そのものの限界です。CRACIは、SnykやAikidoが報告しなかった脆弱なパッケージを見つけています。それらのコンポーネントが、両ツールのスキャン対象に含まれていなかったためです。
無料のスキャナーと商用スキャナー
無料の選択肢でも基本は十分にカバーできます。DependabotアラートはGitHubに付属し、OWASP Dependency-CheckとTrivyはオープンソースで、GrypeはSyft SBOMジェネレーターと組み合わせて使えます。商用ツールは、多数のチームにまたがるポリシー、優先順位付け、到達可能性、ワークフローを追加します。おすすめのSCAツール比較では13のツールを取り上げており、こちらのガイドでは無料のジェネレーター同士で結果が食い違う理由を解説しています。
SCAスキャンとビルド時の記録
CRACIはスキャナーではなく、現在お使いのスキャナーを手放す必要もありません。CRACIはGitHub Actionsランナーであり、各ジョブが取得するすべてのパッケージを、ツリーのあらゆる階層で、CIキャッシュから復元されたパッケージも含めて記録し、新たな脆弱性が公開されるたびに出荷したもののSBOMを再評価し続けます。スキャナーはプルリクエストと開発者のマシンを、CRACIはビルドとそれ以降のすべてをカバーします。SCAツールと並べたCRACIの位置付けをご覧ください。
SCAスキャンに関するよくあるご質問
SCAスキャンとは何ですか?
SCAスキャンは、プロジェクトのマニフェスト、ロックファイル、コンテナイメージを読み取り、使用されているオープンソースコンポーネントを特定して、脆弱性データとライセンスデータに照合するものです。
SCAは依存関係スキャンと同じですか?
ほぼ同じです。依存関係スキャンは通常、依存関係に既知の脆弱性がないかを確認することを指します。SCAはより広い用語で、ライセンス、古いパッケージ、SBOMのようなインベントリの作成も含みます。
SCAスキャンはいつ実行すべきですか?
新たなリスクの混入を防ぐためにプルリクエストで、リリースの内容を記述するためにCIビルドで、そして新しいアドバイザリが出荷済みのソフトウェアに影響するためリリース後も継続的に実行します。
SCAスキャンにはどれくらい時間がかかりますか?
コード全体を解析するのではなくメタデータを読み取るため、通常は数秒から数分です。そのため、すべてのプルリクエストで実行するのも現実的です。
SCAスキャナーによって結果が異なるのはなぜですか?
スキャナーごとに、何を読み取るか、コンポーネントをどう命名するか、どの脆弱性データを使うかのルールが異なります。同じコミットでも、異なるコンポーネント一覧と異なる検出結果が出ることがあります。
SCAスキャンでマルウェアは見つかりますか?
アドバイザリとの照合で悪意のあるリリースが見つかるのは、アドバイザリが公開されてからです。パッケージの挙動を分析するツールなら、一部をより早く検出できます。新しい悪意のあるパッケージには、登場した当日にはアドバイザリがありません。