依存関係
SASTとSCAの比較
SASTは、チームが書くコードの欠陥を見つけます。SCAは、チームが依存するコードの既知のリスクを見つけます。両者は異なるコードを対象とし、異なる問題を検出するため、どちらかがもう一方を置き換えることはありません。
更新日
違いの概要
| SAST | SCA | |
|---|---|---|
| 正式名称 | 静的アプリケーションセキュリティテスト(Static application security testing) | ソフトウェアコンポジション解析(Software composition analysis) |
| 対象 | 自社のソースコード | オープンソースとサードパーティのコンポーネント |
| 検出するもの | インジェクション、安全でない入力処理、危険なパターン | 既知の脆弱性、ライセンスの問題、古いパッケージ |
| 拠り所 | 問題のあるコードを表すルールやモデル | 公開されたアドバイザリのデータベース |
| 検出結果が現れるタイミング | 自社のコードが変わったとき | 依存関係が変わったとき、または新しいアドバイザリが公開されたとき |
| よくあるノイズ | 実際には安全なコードに対する誤検知 | 一致は正しいが、パッケージの使い方には影響しないもの |
| 修正方法 | コードを変更する | コンポーネントをアップグレードまたは置き換える |
SASTが行うこと
SASTツールはソースコードを実行せずに読み取り、データがその中をどう流れるかを追跡します。ユーザー入力がサニタイズされないままデータベースクエリに到達すれば、そのファイルと行を報告します。自社のコードを対象とするため、誰も公表したことのない欠陥も見つけられます。一方で、コードが実際に何をするかではなく、何をしうるかを推論するため、誤検知への不満の原因にもなっています。
SCAが行うこと
SCAスキャンは、プロジェクト内のコンポーネントを特定し、脆弱性データとライセンスデータで照会します。ロジックは解析しません。あるバージョンに公開済みの欠陥があることを知っているため、結果は通常事実に基づいていますが、ツールが到達可能性分析を加えない限り、その欠陥が自社にとって重要かどうかについてはあまり教えてくれません。全体像についてはソフトウェアコンポジション解析とはをご覧ください。
両方が必要な理由
2種類の問題は互いに独立して起こります。SASTの検出結果がゼロのコードベースでも脆弱な依存関係を出荷することはありえますし、依存関係ツリーがクリーンでも、自社のハンドラーにあるSQLインジェクションについては何も分かりません。
タイミングも異なります。SASTの検出結果は誰かがコードを変更したときに現れるため、ほとんどはプルリクエストのチェックで捕捉できます。SCAの検出結果は、新しいアドバイザリが公開されたその日に、何かをトリガーするコミットもないまま、数か月前に出荷したリリースに現れることがあります。そのためSCAには、出荷したものをチェックし続ける仕組みが必要です。
DASTの位置付け
動的アプリケーションセキュリティテスト(DAST)は、実際の攻撃者と同じように、実行中のアプリケーションを外部から攻撃します。コードを読まずに、認証や設定の問題など、実行時にしか現れないものを見つけます。
| SAST | SCA | DAST | |
|---|---|---|---|
| 必要なもの | ソースコード | マニフェスト、イメージ、またはビルド記録 | 実行中のアプリケーション |
| 実行タイミング | プルリクエストで | プルリクエスト、ビルド、リリース後に | テスト環境に対して |
| 得意分野 | 自社コードの欠陥 | 依存関係の既知のリスク | 実行時と設定の欠陥 |
どれを最初に導入すべきか
ほとんどのチームにとってはSCAです。セットアップが簡単で、数秒から数分で実行でき、出荷するものの最も大きな部分をカバーします。現代のアプリケーションの大部分は依存関係だからです。次にSASTをプルリクエストに追加し、自社のスタックにとって重要なルールに合わせて調整します。DASTは、向けるべき安定したテスト環境ができてから追加します。
1つのプラットフォームを買うか、複数のツールを使うか
Snyk、Checkmarx、GitHub Advanced SecurityなどのプラットフォームはSASTとSCAをまとめて提供しており、契約もワークフローも1つで済みます。個別のツールの方が各領域で優れている場合もあります。より重要なのは入力です。どちらの種類のスキャナーも宣言されたものや書かれたものをもとに動作し、ビルドが実際に取り込んだものはどちらにも見えません。
どちらも対象としないもの
SASTとSCAはどちらもファイルを読み取ります。どちらもビルドを観測しないため、インストールフックで取得されたコード、CIキャッシュから復元されたパッケージ、ビルドツールそのものは見えないままになりえます。そのギャップを扱うのがソフトウェアサプライチェーンセキュリティです。
CRACIはその部分をカバーし、コードスキャンはそのために作られたツールに任せます。CRACIは設計上、SASTやシークレットスキャンは行わず、優れたSASTツールの多くはCRACIと並行して利用できます。CRACIはGitHub Actionsランナーであり、各ジョブが取得したものをSBOMに記録し、出荷したもののSBOMを新たな脆弱性と照らし合わせてチェックし続けます。おすすめのSCAツールとSCAツールと併用する場合のCRACIの位置付けをご覧ください。
SASTとSCAに関するよくあるご質問
SASTとSCAの違いは何ですか?
SASTは、チームが書くコードにインジェクションなどの欠陥がないかを解析します。SCAは、依存するオープンソースとサードパーティのコンポーネントに、既知の脆弱性やライセンスの問題がないかを解析します。
SCAはSASTを置き換えますか?
いいえ。両者は異なるコードを対象とします。SCAは自社のロジックの欠陥を見つけませんし、SASTは依存関係に公開済みの脆弱性があることを教えてくれません。
SAST、DAST、SCAの違いは何ですか?
SASTはソースコードを読み取ります。SCAは依存関係をチェックします。DASTは実行中のアプリケーションを外部からテストします。それぞれが、他の2つが見落とす問題を見つけます。
SnykはSASTですか、SCAですか?
両方です。Snykはオープンソースの依存関係スキャンから始まり、SASTのほか、コンテナとInfrastructure as Codeのスキャンも提供しています。
SonarQubeはSASTですか、SCAですか?
SonarQubeは自社コードの静的解析、つまりSASTで最もよく知られています。ほかに何が含まれるかは、最新のエディションをご確認ください。
SASTとSCA、どちらを先に導入すべきですか?
セットアップが簡単で、出荷するものの最も大きな部分をカバーするため、通常はSCAの方が早く成果が出ます。SASTは誤検知を抑えるためにより多くの調整が必要です。