🦁

GitLab Semgrep Analyzer の脆弱性検査を GitLab 外で利用する

2022/12/07に公開

この記事は 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: Configurationr/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