GitLab Semgrep Analyzer の脆弱性検査を GitLab 外で利用する
この記事は GitLab Advent Calendar 2022 の 7 日目の記事です。
GitLab Semgrep Analyzer の脆弱性検査を GitLab 外で利用する
GitLab SAST は脆弱性の静的検査機能です。GitLab Ultimate の機能でしたが、スキャンそのものは Free プランでもできるようになりました。GitLab SAST がどういったものか知りたい方は SASTで脆弱性を発見しよう!をご覧ください。
SAST は SAST Analyzer と呼ばれるプログラムで脆弱性を検査します。この SAST Analyzer はいくつか用意されていて、使っている言語に合わせて適切なものが自動で選ばれるようになっています。
Semgrep Analyzer はこの SAST Analyzer の一つで、静的解析エンジンに Semgrep を利用し、検査ルールは GitLab が中心となって開発しています。対応している言語は Supported languages and frameworks で Semgrep と書かれているものです。
このブログでは Semgrep Analyzer の脆弱性検査を GitLab 外で利用する方法を紹介します。
Semgrep
Semgrep はソースコードの静的解析エンジンです。複数の言語に対応していて、検査ルールが簡単に記述できるのが特徴です。
詳しくは、.NET でも .NET でなくても静的セキュリティコード検査 (Semgrep 編) をご覧ください。
なぜ GitLab 外で利用したいのか
GitLab SAST を使えば簡単に脆弱性の静的検査が実行できます。それ自体は素晴らしいことなのですが、CI でのみの検査はお勧めできません。
CI での検査は結果が開発者のもとに届けられるのに時間がかかります。そのころには開発者は別の作業を始めていて、検査の結果の改修を後回しにしがちです。また、同じ種類の指摘を何か所も指摘されることになり、修正量も増えます。
どんな場合でもいえることですが、課題はなるべく早く気が付いて修正するのが最もコストが安くなります。開発環境に Semgrep を組み込めば、コードを書いている最中にバックグラウンドで検査をし、その場で脆弱性を指摘され、すぐに修正することができます。後から、こことこことここと... のようにたくさん指摘されることを防ぐことができます。
とはいえ、CI での静的検査が不要というわけではありません。開発者の端末での検査は、検査漏れが出ることがあります。CI での静的検査は保険として活用できます。
Semgrep Analyzer の検査ルールを利用して検査する
GitLab がメンテナンスしている SAST 用の脆弱性検査ルールは Semgrep Registry にて公開されています。
Semgrep は Python で書かれていて、pip でインストールするか Docker 版を利用できます。
$ pip install semgrep
次のように --config=r/gitlab
を指定して実行すると Semgrep Analyzer と同じ検査ルールで検査されます。
$ semgrep --config=r/gitlab
Semgrep rule registry URL is https://semgrep.dev/registry.
Scanning across multiple languages:
<multilang> | 3 rules × 3 files
csharp | 22 rules × 1 file
js | 13 rules × 1 file
100%|█████████████████████████████████████████████████████████████████████████████████████|5/5 tasks
Blocking Findings:
MyController.cs
gitlab.security_code_scan.SCS0016-1
An attacker could send a link to the victim. By visiting the malicious link, a web page
would trigger a POST request (because it is a blind attack - the attacker doesn’t see a
response from triggered request and has no use from GET request and GET requests should
not change a state on the server by definition) to the website. The victim would not be
able to acknowledge that an action is made in the background, but his cookie would be
automatically submitted if he is authenticated to the website. This attack does not
require special interaction other than visiting a website.
Details: https://sg.run/AKL2
4┆ [HttpPost]
5┆ public IActionResult Post() { return null; }
sample.js
gitlab.eslint.detect-eval-with-expression
Detected eval(variable), which could allow a malicious actor to run arbitrary code.
Details: https://sg.run/ZeD4
3┆ eval(abc);
Blocking Rules Fired:
gitlab.security_code_scan.SCS0016-1
gitlab.eslint.detect-eval-with-expression
Ran 321 rules on 3 files: 2 findings.
Semgrep Registry に登録されている GitLab の検査ルールセットと Semgrep Analyzer のそれが完全に同一かどうかまでは確認していません。
最新の検査ルールを利用する
GitLab が中心となって開発している Semgrep 用の検査ルールは sast-rules で開発されています。
なぜだかはわかりませんが、sast-rules はすぐにはSemgrep Analyzerの検査ルールに反映されないようです。
最新の sast-rules の検査ルールを使うには次のようにします。
$ semgrep \
--config=https://gitlab.com/gitlab-org/secure/gsoc-sast-vulnerability-rules/playground/sast-rules/-/raw/main/dist/bandit.yml \
--config=https://gitlab.com/gitlab-org/secure/gsoc-sast-vulnerability-rules/playground/sast-rules/-/raw/main/dist/eslint.yml \
--config=https://gitlab.com/gitlab-org/secure/gsoc-sast-vulnerability-rules/playground/sast-rules/-/raw/main/dist/find_sec_bugs.yml \
--config=https://gitlab.com/gitlab-org/secure/gsoc-sast-vulnerability-rules/playground/sast-rules/-/raw/main/dist/flawfinder.yml \
--config=https://gitlab.com/gitlab-org/secure/gsoc-sast-vulnerability-rules/playground/sast-rules/-/raw/main/dist/gosec.yml \
--config=https://gitlab.com/gitlab-org/secure/gsoc-sast-vulnerability-rules/playground/sast-rules/-/raw/main/dist/security_code_scan.yml
IDE に組み込む
Visual Studio Code
Visual Studio Code には Semgrep Extension が用意されています。
別途 pip install semgrep
で Semgrep をインストールしておく必要はありますが、拡張機能をインストールするだけで、手軽に利用できます。
次のように設定に Semgrep > Scan: Configuration
に r/gitlab
を追加すると、--config=r/gitlab
と同じ意味になります。
JetBrains IDE
JetBrains IDE 用には有志が開発した semgrep-idea があるのですが... 最新の JetBrains IDE には対応しておらず、インストールできません...
次のようにコマンドラインで実行して、SARIF 形式 のレポートを出力します。
$ semgrep --config=r/gitlab --sarif --output semgrep.sarif
SARIF 形式のレポートを採用している Qodana plugin をインストールして、semgrep.sarf
ファイルを開きます。
でもだめでした...
今の時点では、コマンドラインで実行して、結果を見ながらやるしかなさそうです。
まとめ
GitLab Semgrep Analyzer の検査ルールは公開されているので、GitLab 外からでも利用できます。
脆弱性の静的検査を GitLab SAST だけに頼るのではなく、開発環境に組み込んだり、開発者がコマンドラインで実行したりし、コミット前になるべく脆弱性が取り除くのが重要です。
Semgrep や開発環境の Semgrep 拡張機能を学んで、より脆弱性の少ないアプリケーション開発を目指しましょう。
おまけ
SAST Analyzer は Semgrep Analyzer 以外にもたくさんありますが、それらは OSS の脆弱性スキャナを呼び出すラッパープログラムです。このブログで紹介したのと同じように開発環境に組み込んで、GitLab なしで検査ができます。
SAST は .NET のスキャナーの Security Code Scan を利用する security-code-scan .NET analyzer がありますが、Security Code Scan 単体でも利用できます。
Discussion