SAST分析装置
13.3でGitLab UltimateからGitLab Freeに移行しました。
Static Application Security Testing(SAST) アナライザを使ってソースコードの脆弱性を検出します。それぞれのアナライザは、サードパーティのコード解析ツールであるスキャナのラッパーです。
アナライザはDockerイメージとして公開され、SASTはこれを使用して各分析専用のコンテナを起動します。アナライザの安定したパフォーマンスを確保するために、最低4GBのRAMを推奨します。
SASTのデフォルトイメージはGitLabによってメンテナーされていますが、独自のカスタムイメージをインテグレーションすることもできます。
各スキャナーにはアナライザーがあります:
- 検出ロジックを公開します。
- その実行を処理します。
- 出力を標準フォーマットに変換します。
SASTアナライザ
SASTは以下の公式分析器をサポートしています:
-
brakeman
(ブレーキマン) -
flawfinder
(フローファインダー) -
kubesec
(クーベセック) -
mobsf
(MobSF (beta)) -
nodejs-scan
(NodeJsScan) -
phpcs-security-audit
(PHPCSセキュリティ監査) -
pmd-apex
(PMD (Apex のみ)) -
semgrep
(セムグレップ) -
sobelow
(ソベロー(Elixir Phoenix)) -
spotbugs
(SpotBugs with the Find Sec Bugs plugin (Ant、Gradleとラッパー、Grails、Mavenとラッパー、SBT))
SASTは以前のバージョンで他のアナライザを使用していました。これらのアナライザはサポート終了ステータスに達し、アップデートはありません:
-
bandit
(Bandit); GitLab 15.4でサポート終了。GitLab管理ルールのsemgrep
アナライザーに置き換えられました。 -
eslint
(ESLint (JavaScript and React)); GitLab 15.4でサポート終了。GitLab管理ルールのsemgrep
アナライザーに置き換えられました。 -
gosec
(Gosec); GitLab 15.4でサポート終了。GitLab管理ルールのsemgrep
アナライザーに置き換えられました。 -
security-code-scan
(Security Code Scan (.NET)); GitLab 16.0でサポート終了。GitLab管理ルールのsemgrep
アナライザーに置き換えられました。
SASTアナライザーの機能
分析装置が一般に利用可能であると見なされるためには、以下の機能を最低限サポートしていることが期待されます:
ポストアナライザー
ポスト・アナライザは、アナライザが出力するレポートを充実させます。ポスト・アナライザは、レポートの内容を直接変更しません。代わりに、以下のような追加プロパティで結果を強化します:
- CWE。
- 位置追跡フィールド。
- 偽陽性または重要でない発見を識別する手段。
Semgrepベースのスキャンへの移行
SASTには複数の言語をカバーするSemgrepベースのアナライザーが含まれています。GitLabはアナライザーをメンテナーし、検出ルールを書いています。
GitLabが管理するCI/CDテンプレートを使う場合、Semgrepベースのアナライザーは他の言語固有のアナライザーと一緒にオペレーションします。他のアナライザーの検出ルールを模倣した、GitLabが管理する検出ルールで動作します。言語固有のアナライザーを削除し、Semgrepベースのアナライザーに置き換える作業はエピック5245で追跡されています。発見が重複した場合、アナライザーの順序によってどちらのアナライザーの発見を優先するかが決まります。
デフォルトの動作が変更される前に、他のアナライザーを早期に無効にして、サポートされている言語に対して Semgrep ベースのスキャンを使用することもできます。その場合は、次のようになります:
- スキャンが大幅に高速化され、計算クォータの使用量が削減され、スキャンルールがカスタマイズ可能になります。
- ただし、言語固有のアナライザによって以前にレポーターされた脆弱性は、以前にその脆弱性を却下した場合など、特定の条件下で再びレポートされます。システムの動作は以下に依存します:
- 過去に Semgrep ベースの解析ツールを実行しないようにしたかどうか。
- プロジェクトの脆弱性レポートに示されている脆弱性を、どのアナライザが最初に発見したか。
脆弱性翻訳
ある言語のアナライザーを切り替えると、脆弱性が一致しないことがあります。
脆弱性管理システムは、特定の言語について、脆弱性を古いアナライザからSemgrepに自動的に移動します:
- C言語の場合、Semgrepも脆弱性を検出したパイプラインでFlawfinderによってのみ脆弱性が検出された場合、その脆弱性は移動されます。C言語のSemgrepカバレッジは、GitLab 14.4(2021年10月)のCI/CDテンプレートにデフォルトで導入されました。
- Goでは、Semgrepも検出したパイプラインでGosecによってのみ脆弱性が検出された場合、その脆弱性は移動されます。GoのSemgrepカバレッジは、GitLab 14.2(2021年8月)のCI/CDテンプレートにデフォルトで導入されました。
- JavaScriptとTypeScriptについては、Semgrepも検出したパイプラインでESLintによってのみ脆弱性が検出された場合、その脆弱性は移動されます。これらの言語に対するSemgrepカバレッジは、GitLab 13.12(2021年5月)のCI/CDテンプレートに導入されました。
ただし、Semgrepの結果に基づいて再作成された古い脆弱性は、以下の場合に表示されます:
- BanditまたはSpotBugsによって脆弱性が作成され、それらのアナライザを無効にした場合。BanditとSpotBugsを無効にすることを推奨するのは、アナライザが動作していない場合だけです。BanditとSpotBugsの脆弱性をSemgrepに自動的に変換する作業は、このイシューで追跡されています。
- Semgrepスキャンが正常に実行されなかったデフォルトブランチパイプライン(Semgrepカバレッジがその言語に導入される前、Semgrepを明示的に無効にしたため、またはSemgrepスキャンがそのパイプラインで失敗したため)において、ESLint、Gosec、またはFlawfinderによって脆弱性が作成されました。これらの脆弱性がすでに存在する場合、これらの脆弱性を組み合わせる予定は今のところありません。
脆弱性が再作成されると、元の脆弱性は脆弱性レポートで「検出されなくなった」とマークされます。その後、Semgrepで検出された脆弱性に基づいて新しい脆弱性が作成されます。
Semgrepベースのスキャンを早期にアクティブ化
デフォルトの動作が変更される前に、言語固有のアナライザーの代わりにSemgrepベースのスキャンを使用するように選択できます。
以下のいずれかに該当する場合は、この方法を取ることをお勧めします:
- プロジェクトで SAST を使用したことがなく、脆弱性レポートに SAST 脆弱性がまだない場合。
- Semgrepベースのカバレッジと重複するカバレッジを持つアナライザの設定に問題がある場合。たとえば、SpotBugsベースのアナライザを設定してコードをコンパイルするのに問題がある場合です。
- ESLint、Gosec、またはFlawfinderのスキャンによって作成された脆弱性をすでに見て捨ててしまい、Semgrepによって作成された脆弱性をそのままにしています。
各言語固有のアナライザを個別に選択することも、すべてを無効にすることもできます。
Semgrepベースのスキャンの有効化
早期にSemgrepベースのスキャンに切り替えるには、以下の方法があります:
- マージリクエスト(MR) を作成し、CI/CD変数
SAST_EXCLUDED_ANALYZERS
を"bandit,gosec,eslint"
に設定します。- SpotBugs のスキャンも無効にしたい場合は、
spotbugs
を追加してください。これは Java プロジェクトにのみ推奨します。SpotBugsはGroovy、Kotlin、Scalaをスキャンできる現在唯一のアナライザです。 - Flawfinder のスキャンも無効にしたい場合は、
flawfinder
をリストに追加してください。Cプロジェクトにのみ推奨します。Flawfinderは現在、C++をスキャンできる唯一のアナライザーです。
- SpotBugs のスキャンも無効にしたい場合は、
- MRでスキャンジョブが成功することを確認してください。削除されたアナライザーからの結果は_Fixedに_、Semgrepからの結果は_Newに_あります(GitLabがSemgrepルールセットを管理・編集しているため、いくつかの結果は異なる名前、説明、重大度を示すことがあります)。
- MRをマージし、デフォルトブランチパイプラインの実行を待ちます。
- 脆弱性レポートを使用して、言語固有のアナライザによって検出されなくなった発見を破棄します。
Semgrepベースのスキャンをプレビュー
GitLab が管理する SAST 用の Stable CI/CD テンプレートが更新される前に、Semgrep ベースのスキャンがプロジェクトでどのように機能するかを確認することができます。この変更はマージリクエストでテストすることをお勧めしますが、デフォルトのブランチパイプライン設定では Stable テンプレートを使い続けることをお勧めします。
GitLab 15.3では、デフォルトブランチで発見されたセキュリティを他のアナライザーからSemgrepにマイグレーションする機能フラグを有効にしました。GitLab 15.4では、非推奨のアナライザーをStable CI/CDテンプレートから削除しました。
GitLab 15.3以前のCI/CD設定に対する今後の変更をプレビューするには:
- 安定 CI/CD テンプレート(
SAST.gitlab-ci.yaml
)から最新テンプレート(SAST.latest.gitlab-ci.yaml
)に切り替えるには、MR を開きます。-
GitLab.com では、最新のテンプレートを直接使用してください:
include: template: 'Jobs/SAST.latest.gitlab-ci.yaml'
-
セルフマネージドインスタンスでは、GitLab.comからテンプレートをダウンロードしてください:
include: remote: 'https://gitlab.com/gitlab-org/gitlab/-/raw/2851f4d5/lib/gitlab/ci/templates/Jobs/SAST.latest.gitlab-ci.yml'
-
- MRでスキャンジョブが成功することを確認します。削除されたアナライザからの発見が_Fixedに_、Semgrepからの発見が_Newに_表示されます(GitLabがSemgrepルールセットを管理・編集しているため、いくつかの発見では異なる名前、説明、重大度が表示されることがあります)。
- MRを閉じます。
StableテンプレートとLatestテンプレートの詳細については、CI/CDテンプレートのバージョニングを参照してください。
アナライザーのカスタマイズ
.gitlab-ci.yml
ファイルのCI/CD 変数を使用して、アナライザーの動作をカスタマイズします。
カスタムDockerミラーの使用
GitLabレジストリの代わりに、カスタムのDockerレジストリを使ってアナライザのイメージをホストすることができます。
前提条件:
- カスタムDockerレジストリは、すべての公式アナライザ用のイメージを提供する必要があります。
GitLabにカスタムDockerレジストリからアナライザのイメージをダウンロードさせるには、SECURE_ANALYZERS_PREFIX
CI/CD変数で接頭辞を定義します。
例えば、以下はregistry.gitlab.com/security-products/semgrep
の代わりにmy-docker-registry/gitlab-images/semgrep
をプルするよう SAST に指示します:
include:
- template: Security/SAST.gitlab-ci.yml
variables:
SECURE_ANALYZERS_PREFIX: my-docker-registry/gitlab-images
すべてのデフォルト・アナライザーを無効にします。
デフォルトの SAST アナライザをすべて無効にし、カスタムアナライザのみを有効にすることができます。
すべてのデフォルトアナライザーを無効にするには、.gitlab-ci.yml
ファイルで CI/CD 変数SAST_DISABLED
を"true"
に設定します。
使用例:
include:
- template: Security/SAST.gitlab-ci.yml
variables:
SAST_DISABLED: "true"
特定のデフォルトアナライザーを無効にします。
アナライザは、検出されたソース・コード言語に応じて自動的に実行されます。ただし、特定のアナライザーを無効にすることもできます。
選択したアナライザーを無効にするには、CI/CD変数SAST_EXCLUDED_ANALYZERS
に、実行しないようにしたいアナライザーの一覧をカンマ区切りの文字列で設定します。
たとえば、spotbugs
アナライザーを無効にするには、次のようにします:
include:
- template: Security/SAST.gitlab-ci.yml
variables:
SAST_EXCLUDED_ANALYZERS: "spotbugs"
カスタム・アナライザー
CI/CD 設定でジョブを定義することで、独自のアナライザを提供できます。デフォルトのアナライザとの一貫性を保つため、カスタム SAST ジョブには接尾辞-sast
を追加してください。
GitLab にカスタムセキュリティスキャナをインテグレーションする方法の詳細については、セキュリティスキャナのインテグレーションをご覧ください。
カスタムアナライザの例
この例では、Dockerイメージmy-docker-registry/analyzers/csharp
に基づいたスキャンジョブを追加する方法を示します。スクリプト/analyzer run
を実行し、SASTレポートgl-sast-report.json
を出力します。
.gitlab-ci.yml
ファイルに以下を定義します:
csharp-sast:
image:
name: "my-docker-registry/analyzers/csharp"
script:
- /analyzer run
artifacts:
reports:
sast: gl-sast-report.json
分析装置が提供するデータ
各アナライザは、検出した脆弱性に関するデータを提供します。次の表は、各分析ツールが提供するデータの詳細です。これらのツールから提供される値は異種であるため、severity
やconfidence
など、共通の値に正規化されている場合があります。
プロパティ/ツール | エイペックス | バンディット1 | ブレーキマン | ESLint セキュリティ1 | スポットバグ | フローファインダー | ゴセック1 | Kubesec スキャナ | モブセフ | NodeJsScan | PHP CSセキュリティ監査 | セキュリティコード スキャン (.NET)1 | セムグレップ | ソベロー |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
影響を受ける項目(クラスやパッケージなど) | ✓ | ✗ | ✓ | ✗ | ✓ | ✓ | ✗ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
信頼度 | ✗ | ✓ | ✓ | ✗ | ✓ | x | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ | ⚠ | ✓ |
説明 | ✓ | ✗ | ✗ | ✓ | ✓ | ✗ | ✗ | ✓ | ✓ | ✓ | ✗ | ✗ | ✓ | ✓ |
コラム終わり | ✓ | ✗ | ✗ | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
エンドライン | ✓ | ✓ | ✗ | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
外部ID(例えばCVE) | ✗ | ✗ | ⚠ | ✗ | ⚠ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ⚠ | ✗ |
ファイル | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
内部ドキュメント/説明 | ✓ | ⚠ | ✓ | ✗ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ |
内部ID | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ |
深刻度 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | ⚠ | ✗ |
解答 | ✓ | ✗ | ✗ | ✗ | ⚠ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ⚠ | ✗ |
ソースコード抽出 | ✗ | ✓ | ✓ | ✓ | ✗ | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
開始カラム | ✓ | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✗ |
スタートライン | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
タイトル | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
URL | ✓ | ✗ | ✓ | ✗ | ⚠ | ✗ | ⚠ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
- ✓ => データあり
- ⚠ => データは利用可能ですが、部分的に信頼できるか、構造化されていないコンテンツから抽出する必要があります。
- ✗ => データが入手できないか、入手するために特定の、非効率的な、または信頼性の低いロジックが必要。
- このアナライザはサポートが終了しました。詳細については、SAST アナライザのセクションを参照してください。