GitLab高度なSAST
- プラン: Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
GitLab高度なSASTは、クロスファンクション、クロスファイルのテイント解析を実行して脆弱性を検出するように設計された静的アプリケーションセキュリティテスト(SAST)アナライザーです。
GitLab高度なSASTは、オプトイン機能です。有効にすると、GitLab高度なSASTのアナライザーは、GitLabの高度なSASTの定義済みルールセットを使用して、サポートされている言語のすべてのファイルをスキャンします。Semgrepアナライザーはこれらのファイルをスキャンしません。
GitLab高度なSASTのアナライザーによって識別されたすべての脆弱性が報告されます。これには、以前にSemgrepベースのアナライザーによって報告された脆弱性も含まれます。自動移行プロセスでは、GitLab高度なSASTがSemgrepベースのアナライザーと同じ場所で同じタイプの脆弱性を見つけた場合、発見が重複排除されます。
GitLab高度なSASTの概要とその仕組みについては、GitLab Advanced SAST: Accelerating Vulnerability Resolution(GitLab高度なSAST: 脆弱性の修正を加速する)を参照してください。
製品ツアーについては、GitLab高度なSAST製品ツアーをご覧ください。
機能比較
| 機能 | SAST | 高度なSAST |
|---|---|---|
| 分析の深さ | 複雑な脆弱性を検出する機能が制限されています。分析は単一のファイル、および単一の関数(限定的な例外はあります)に限定されます。 | クロスファイル、クロスファンクションのテイント解析を使用して、複雑な脆弱性を検出します。 |
| 精度 | コンテキストが限られているため、誤検出の結果が生じる可能性が高くなります。 | クロスファイル、クロスファンクションのテイント解析を使用して、真に悪用可能な脆弱性に焦点を当てることで、誤検出の結果を減らします。 |
| 修正ガイダンス | 脆弱性の検出結果は行番号で識別されます。 | 詳細なコードフロービューは、脆弱性がプログラム全体にどのように流れるかを示し、迅速な修正を可能にします。 |
| GitLab Duo脆弱性の説明と脆弱性の修正に対応 | はい。 | はい。 |
| 言語カバレッジ | より広範にカバーします。 | より限定的です。 |
脆弱性が報告されるタイミング
GitLab高度なSASTは、テイント解析によるクロスファイル、クロスファンクションスキャンを使用して、ユーザー入力のプログラムへの流れを追跡します。アナライザーは、ユーザー入力が流れるパスを追跡し、信頼できないデータが安全でない方法でアプリケーションの実行に影響を与える可能性のある、潜在的なポイントを識別します。これにより、SQLインジェクションやクロスサイトスクリプティング(XSS)といったインジェクションの脆弱性が複数の関数やファイルにまたがって存在していても、確実に検出できます。
ノイズを最小限に抑えるために、GitLab高度なSASTは、信頼できないユーザー入力ソースを機密性の高いシンクに持ち込む検証可能なフローが存在する場合にのみ、テイントベースの脆弱性を報告します。他の製品の場合、検証が甘い脆弱性が報告される場合があります。
GitLab高度なSASTは、HTTPリクエストから取得された値など、信頼境界を越える入力に重点を置いて調整されています。信頼できない入力ソースのセットには、コマンドライン引数、環境変数、またはプログラムを操作するユーザーによって通常提供されるその他の入力は含まれません。
GitLabの高度な静的アプリケーションセキュリティテストが検出する脆弱性の種類の詳細については、GitLab高度なSASTのCWEカバレッジを参照してください。
SemgrepからGitLab高度なSASTへの移行
SemgrepからGitLab高度なSASTに移行すると、自動移行プロセスにより、脆弱性が重複排除されます。このプロセスでは、以前に検出されたSemgrepの脆弱性を対応するGitLab高度なSASTの発見にリンクし、一致するものが見つかった場合に置き換えます。
脆弱性の移行の仕組み
デフォルトブランチで高度なSASTスキャンを有効にした後(GitLab高度なSASTスキャンを有効にするを参照)、スキャンが実行されて脆弱性が検出されると、次の条件に基づいて、既存のSemgrepの脆弱性を置き換える必要があるかどうかがチェックされます。
重複排除の条件
Matching Identifier(識別子の照合):
- GitLab高度なSASTの少なくとも1つの脆弱性識別子(CWEとOWASPを除く)が、既存のSemgrep脆弱性のprimary identifier(プライマリ識別子)と一致する必要があります。
- プライマリ識別子は、SASTレポート内にある脆弱性の識別子配列の最初の識別子です。
- たとえば、GitLab高度なSASTの脆弱性に
bandit.B506などの識別子があり、Semgrepの脆弱性のプライマリ識別子もbandit.B506である場合、この条件は満たされます。
Matching Location(場所の照合):
- 脆弱性は、コード内のsame location(同じ場所)に関連付けられている必要があります。これは、SASTレポート内にある脆弱性の次のいずれかのフィールドを使用して判別されます:
- 追跡フィールド(存在する場合)
- 場所フィールド(追跡フィールドが存在しない場合)
- 脆弱性は、コード内のsame location(同じ場所)に関連付けられている必要があります。これは、SASTレポート内にある脆弱性の次のいずれかのフィールドを使用して判別されます:
脆弱性の変更
条件が満たされると、Semgrepの既存の脆弱性はGitLab高度なSASTの脆弱性に変換されます。この更新された脆弱性は、次の変更を加えて脆弱性レポートに表示されます:
- スキャナーの種類がSemgrepからGitLab高度なSASTに更新されます。
- GitLab高度なSASTの脆弱性に存在する追加の識別子が、既存の脆弱性に追加されます。
- 脆弱性のそれ以外の詳細は変更されません。
重複した脆弱性の処理
重複排除の条件が満たされない場合、Semgrepの脆弱性が重複としてそのまま表示されることがあります。脆弱性レポートでこれを解決するには、次の手順に従います:
- 高度なSASTスキャナーで脆弱性をフィルタリングし、結果をCSV形式でエクスポートします。
- Semgrepスキャナーで脆弱性をフィルタリングします。これらは、重複排除されなかった脆弱性である可能性があります。
- Semgrepの脆弱性ごとに、エクスポートされた高度なSASTの結果に対応する一致があるかどうかを確認します。
- 重複が存在する場合は、Semgrepの脆弱性を適切に解決します。
コードカバレッジ
デフォルトでは、GitLab高度なSASTは、サポートされている言語のすべてのソースコードを解析します。
GitLab高度なSASTの差分ベーススキャンオプションを有効にすると、マージリクエストパイプラインでのスキャンの時間を短縮できます。
サポートされている言語
GitLab高度なSASTは、クロスファンクション、クロスファイルのテイント解析で次の言語をサポートしています:
- C# (最大13.0まで)
- C/C++1
- Go
- Java(Java Server Pages(JSP)を含む)
- JavaScript、TypeScript
- PHP
- Python
- Ruby
Footnotes(脚注):
- C/C++のサポートは現在ベータ版であり、GitLab高度なSASTで使用するには、追加の設定(コンパイルデータベースなど)が必要です。詳細については、C/C++ の設定を参照してください。GitLab高度なSAST CPPは、C/C++プロジェクトのSemgrepを除外しません。両方のアナライザーは、異なるルールセットで並行して実行されます。
PHPの既知の問題
PHPコードの分析時、GitLab高度なSASTには次の制限があります:
- Dynamic file inclusion(動的なファイルインクルード): ファイルパスに変数を使用する動的なファイルインクルードステートメント(
include、include_once、require、require_once)は、このリリースではサポートされていません。クロスファイル分析では、静的なファイルインクルードパスのみがサポートされます。イシュー527341を参照してください。 - Case sensitivity(大文字と小文字の区別): 関数名、クラス名、およびメソッド名について大文字と小文字を区別しないPHPの特性は、クロスファイル分析では完全にはサポートされていません。イシュー526528を参照してください。
マージリクエストの差分ベーススキャン
この機能の利用可否は、機能フラグによって制御されます。詳細については、履歴を参照してください。
差分ベーススキャンでは、マージリクエストで変更されたファイルと、それらに依存するファイルのみが解析されます。この対象を絞ったアプローチにより、スキャン時間が短縮され、開発中に迅速なフィードバックが得られます。
カバレッジを完全にするため、マージリクエストがマージされた後、デフォルトブランチでフルスキャンが実行されます。
差分ベーススキャンが有効になっている場合:
- マージリクエストで変更または追加されたファイルと、それらに依存するファイルのみが、マージリクエストパイプラインでスキャンされます。
- 有効になっている場合、ジョブジョブログに次のように出力されます:
Running differential scan無効になっている場合は、Running full scanと出力されます - merge request security widget(マージリクエストセキュリティウィジェット)の専用の差分ベースタブに関連するスキャン結果が表示されます。
- Pipeline Security(パイプラインセキュリティ)タブでは、Partial SAST report(部分的なSASTレポート)というラベルの付いたアラートは、部分的な結果のみが含まれていることを示します。
前提要件
GitLab高度なSASTは、マージリクエストパイプラインで実行するように設定されています。
差分ベーススキャンの設定
マージリクエストパイプラインで差分ベーススキャンを有効にするには、プロジェクトのCI/CD設定ファイル、またはスキャン実行ポリシーまたはパイプライン実行ポリシーのいずれかで、これらのCI/CD変数を設定します。
| 変数 | 値 | 説明 |
|---|---|---|
ADVANCED_SAST_PARTIAL_SCAN | differential | 差分ベーススキャンモードを有効にします |
依存ファイル
変更されたファイルを超えてクロスファイルの脆弱性を見逃さないように、差分ベーススキャンには、直接の依存関係にあるファイルが含まれます。これにより、高速スキャンを維持しながら、誤検出が減りますが、詳細を以下で説明するように、より深い依存チェーンでは不正確な結果が生じる可能性があります。
次のファイルがスキャンに含まれます:
- 変更されたファイル(マージリクエストで変更または追加されたファイル)
- 依存ファイル(変更されたファイルをインポートするファイル)
この設計は、変更された関数からそれをインポートする呼び出し元に、汚染されたデータが移動するなど、クロスファイルのデータフローを検出するのに役立ちます。
変更されたファイルによってインポートされたファイルは、通常、変更されたコードの動作やデータフローに影響を与えないため、スキャンされません。
たとえば、ファイルBを変更するマージリクエストについて考えてみます:
- ファイルAがファイルBをインポートする場合、ファイルAとファイルBがスキャンされます。
- ファイルBがファイルCをインポートする場合、ファイルBのみがスキャンされます。
制限事項
偽陰性と偽陽性
差分ベーススキャンでは、スキャンされたファイル内の完全なコールグラフをキャプチャできないため、脆弱性(偽陰性)が見逃されたり、解決されたものが再浮上したりする可能性があります(偽陽性)。このトレードオフにより、スキャン時間が短縮され、開発中に迅速なフィードバックが得られます。カバレッジを完全にするため、フルスキャンは常にデフォルトブランチで実行されます。
修正された脆弱性はレポートされません
誤解を招く結果を避けるため、修正された脆弱性は差分ベーススキャンでは除外されます。ファイルのごく一部のみが解析されるため、完全なコールグラフは利用できず、脆弱性が修正されたかどうかを確認することができません。
フルスキャンは、マージ後、常にデフォルトブランチで実行され、そこで修正された脆弱性がレポートされます。
設定
クロスファンクションおよびクロスファイルのテイント解析を実行して、アプリケーションの脆弱性を検出するには、GitLab高度なSASTのアナライザーを有効にします。その後、CI/CD変数を使用してその動作を調整できます。
利用可能なCI/CD変数
次のCI/CD変数を使用してGitLab高度なSASTを設定できます。
| CI/CD変数 | デフォルト | 説明 |
|---|---|---|
GITLAB_ADVANCED_SAST_ENABLED | false | CおよびC++を除く、サポートされているすべての言語に対してGitLab高度なSASTスキャンを有効にします。 |
GITLAB_ADVANCED_SAST_CPP_ENABLED | false | CおよびC++プロジェクトに固有のGitLab高度なSASTスキャンを有効にします。 |
GITLAB_ADVANCED_SAST_RULE_TIMEOUT | 30 | ファイルごとのルールごとの秒単位のタイムアウト。タイムアウトを超えると、その解析はスキップされます。 |
要件
GitLabの他のSASTアナライザーと同様、GitLab高度なSASTアナライザーにもRunnerとCI/CDパイプラインが必要です。詳細については、SASTの要件を参照してください。
GitLab Self-Managedでは、GitLab高度なSASTをサポートするGitLabバージョンも使用する必要があります:
- 可能な場合は、GitLab 17.4以降を使用する必要があります。GitLab 17.4には、新しいコードフロービュー、脆弱性の重複排除、およびSAST CI/CDテンプレートの追加更新が含まれています。
- SAST CI/CDテンプレートは、次のリリースでGitLab高度なSASTを含めるように更新されました:
- GitLab 17.3以降では、安定版テンプレートにGitLab高度なSASTが含まれています。
- GitLab 17.2以降では、最新テンプレートにGitLab高度なSASTが含まれています。単一のプロジェクトで最新テンプレートと安定版テンプレートを混在させないでください。
- GitLab高度なSASTには、最低でもバージョン17.1以降が必要です。
GitLab高度なSASTスキャンを有効にする
GitLab高度なSASTは標準のGitLab SAST CI/CDテンプレートに含まれています。ただし、デフォルトでは有効になっていません。これを有効にするには、CI/CD変数GITLAB_ADVANCED_SAST_ENABLEDをtrueに設定します(C/C++プロジェクトの場合はGITLAB_ADVANCED_SAST_CPP_ENABLEDをtrueに設定します)。CI/CD設定の管理方法に応じて、この変数をさまざまな方法で設定できます。
CI/CDパイプライン定義を手動で編集する
プロジェクトでGitLab SASTスキャンをすでに有効にしている場合は、CI/CD変数を追加してGitLab高度なSASTを有効にします。
この最小限のYAMLファイルには、安定版SASTテンプレートが含まれており、C/C++以外のプロジェクトでGitLab高度なSASTが有効になっています:
include:
- template: Jobs/SAST.gitlab-ci.yml
variables:
GITLAB_ADVANCED_SAST_ENABLED: 'true'C/C++プロジェクトの場合は、代わりにGITLAB_ADVANCED_SAST_CPP_ENABLEDを使用してください。
スキャン実行ポリシーで適用する
スキャン実行ポリシーでGitLab高度なSASTを有効にするには、ポリシーのスキャンアクションを更新して、CI/CD変数GITLAB_ADVANCED_SAST_ENABLED(C/C++プロジェクトの場合はGITLAB_ADVANCED_SAST_CPP_ENABLED)をtrueに設定します。この変数は次の方法で設定できます:
- ポリシーエディタのメニューから選択します。
- スキャンアクションで、
variablesオブジェクトに追加します。
パイプラインエディタを使用する
パイプラインエディタを使用してGitLab高度なSASTを有効にするには、次の手順に従います:
プロジェクトで、ビルド > パイプラインエディタを選択します。
.gitlab-ci.ymlファイルが存在しない場合は、パイプラインの設定を選択し、例のコンテンツを削除します。CI/CD設定を次のように更新します:
- GitLab管理のSAST CI/CDテンプレートのいずれかがまだ含まれていない場合は、それを含めます。
- GitLab 17.3以降では、安定版テンプレート
Jobs/SAST.gitlab-ci.ymlを使用する必要があります。 - GitLab 17.2では、GitLab高度なSASTは最新テンプレート
Jobs/SAST.latest.gitlab-ci.ymlでのみ使用できます。単一のプロジェクトで最新テンプレートと安定版テンプレートを混在させないでください。 - GitLab 17.1では、GitLab高度なSASTのジョブの内容をCI/CDパイプライン定義に手動でコピーする必要があります。
- GitLab 17.3以降では、安定版テンプレート
- CI/CD変数
GITLAB_ADVANCED_SAST_ENABLED(C/C++プロジェクトの場合はGITLAB_ADVANCED_SAST_CPP_ENABLED)をtrueに設定します。
最小限のYAMLの例を参照してください。
- GitLab管理のSAST CI/CDテンプレートのいずれかがまだ含まれていない場合は、それを含めます。
検証タブを選択し、パイプラインの検証を選択します。
シミュレーションが正常に完了しましたというメッセージは、ファイルが有効であることを裏付けています。
編集タブを選択します。
フィールドに入力します。ブランチフィールドにデフォルトブランチを使用しないでください。
Start a new merge request with these changes(これらの変更で新しいマージリクエストを開始)チェックボックスをオンにし、変更をコミットするを選択します。
標準のワークフローに従ってフィールドに入力し、マージリクエストを作成を選択します。
標準のワークフローに従ってマージリクエストをレビューおよび編集し、マージを選択します。
パイプラインにGitLab高度なSASTジョブが含まれるようになりました。
GitLab高度なSASTスキャンを無効にする
高度なSASTスキャンはデフォルトでは有効になっていませんが、グループレベルで、または複数のプロジェクトに影響を与える別の方法で有効になっている場合があります。
プロジェクトで高度なSASTスキャンを明示的に無効にするには、CI/CD変数GITLAB_ADVANCED_SAST_ENABLED(C/C++プロジェクトの場合はGITLAB_ADVANCED_SAST_CPP_ENABLED)をfalseに設定します。この変数は、高度なSASTスキャンを有効にするのと同じ方法を含め、CI/CD変数を設定できる場所ならどこでも設定できます。
脆弱性コードフロー
特定の種類の脆弱性について、GitLab高度なSASTはコードフロー情報を提供します。脆弱性のコードフローとは、データが、すべての割り当て、操作、サニタイズを通じて、ユーザー入力(ソース)から脆弱なコード行(シンク)に至るまでの間でたどるパスです。この情報は、脆弱性のコンテキスト、影響、およびリスクを理解して評価するのに役立ちます。入力をソースからシンクまでトレースすることで検出された脆弱性のコードフロー情報を利用できます。この脆弱性には、以下が含まれます:
- SQLインジェクション
- コマンドインジェクション
- クロスサイトスクリプティング(XSS)
- パストラバーサル
コードフロー情報はコードフロータブに表示され、以下が含まれています:
- ソースからシンクまでのステップ。
- コードスニペットを含む、関連ファイル。
GitLab高度なSASTをカスタマイズする
他のアナライザーと同様に、GitLab高度なSASTルールを無効にしたり、そのメタデータを編集したりできます。詳細については、ルールセットをカスタマイズするを参照してください。
GitLab高度なSASTで、LGPLライセンスコンポーネントのソースコードをリクエストする
GitLab高度なSASTで、LGPLライセンスコンポーネントのソースコードに関する情報をリクエストするには、GitLabサポートにお問い合わせください。
迅速な対応を確保するために、リクエストにGitLab高度なSASTアナライザーのバージョンを含めてください。
この機能はUltimateプランでのみ利用できるため、そのレベルのサポート資格を持つ組織と関連している必要があります。
フィードバック
専用のイシュー466322にフィードバックをお寄せください。
トラブルシューティング
GitLab高度なSASTを使用する場合、次の問題が発生する可能性があります。
高度なSASTによるスキャンの低速化またはタイムアウト
高度なSASTではプログラムを詳細にスキャンするため、特に大規模なリポジトリの場合、スキャンの完了に時間がかかることがあります。パフォーマンスの問題が発生している場合は、ここに記載されている推奨事項に従ってください。
ファイルを除外してスキャン時間を短縮する
各ファイルは適用可能なすべてのルールに照らして分析されるため、スキャンするファイルの数を減らしてスキャン時間を短縮できます。これを行うには、SAST_EXCLUDED_PATHS変数を使用して、スキャンする必要のないフォルダーを除外します。さまざまな効果的な除外があり、以下が含まれる場合があります:
- データベースの移行
- 単体テスト
node_modules/などの依存関係のディレクトリ- ビルドディレクトリ
マルチコアスキャンによりスキャンを最適化する
マルチコアスキャンは、高度なSAST(アナライザーバージョンv1.1.10以降)でデフォルトで有効になっています。Runnerのサイズを大きくして、スキャンに使用できるリソースを増やすことができます。セルフホストRunnerの場合は、セキュリティスキャナーの設定で--multi-coreフラグをカスタマイズする必要がある場合があります。
差分ベーススキャンを使用してパフォーマンスを向上させる
コードベース全体をスキャンする代わりに、マージリクエストで変更されたファイルとその直接の依存関係にあるファイルのみを解析することにより、スキャン時間を短縮するために、マージリクエストで差分ベーススキャンを有効にすることを検討してください。
サポートを求める場合
これらの最適化手順に従っても、高度なSASTスキャンの実行に予想以上に時間がかかる場合は、次の情報を用意してGitLabサポートにお問い合わせください:
- GitLab高度なSASTアナライザーのバージョン
- リポジトリで使用しているプログラミング言語
- デバッグログ
- パフォーマンスのデバッグアーティファクト
GitLab高度なSASTアナライザーのバージョンを特定する
GitLab高度なSASTアナライザーのバージョンを特定するには、次の手順に従ってください:
- 左側のサイドバーで、検索または移動先を選択して、プロジェクトを見つけます。新しいナビゲーションをオンにした場合、このフィールドは上部のバーにあります。
- ビルド > ジョブを選択します。
gitlab-advanced-sastジョブを見つけます。- ジョブの出力で、文字列
GitLab GitLab Advanced SAST analyzerを検索します。
その文字列を含む行の末尾にバージョンがあります。次に例を示します:
[INFO] [GitLab Advanced SAST] [2025-01-24T15:51:03Z] ▶ GitLab GitLab Advanced SAST analyzer v1.1.1この例では、バージョンは1.1.1です。
パフォーマンスのデバッグアーティファクトを生成する
trace.ctfアーティファクト(非C/C++プロジェクト)を生成するには、次の.gitlab-ci.ymlを追加します。
アーティファクトをアップロードする時間を確保するために、RUNNER_SCRIPT_TIMEOUTを、timeoutよりも少なくとも10分短く設定します。
include:
- template: Jobs/SAST.gitlab-ci.yml
variables:
GITLAB_ADVANCED_SAST_ENABLED: 'true'
MEMTRACE: 'trace.ctf'
DISABLE_MULTI_CORE: true # Disable multi core when collecting memtrace
gitlab-advanced-sast:
artifacts:
paths:
- '**/trace.ctf' # Collects all trace.ctf files generated by this job
expire_in: 1 week # Sets retention for artifacts
when: always # Ensures artifact export even if the job fails
variables:
RUNNER_SCRIPT_TIMEOUT: 50m
timeout: 1h