Semgrep vs CodeQL: 静的解析 (SAST) の比較
どちらもコードをスキャンしてセキュリティ問題を探す SAST ツールです。Semgrep はパターンマッチング構文を使って高速でルールを書きやすく、CodeQL はより強力ながら難しいクエリ言語で、深いセマンティックなデータフローベースの解析を行います。
Semgrep と CodeQL はどちらもソースコードの脆弱性を見つけますが、速度と深さのカーブ上の異なる位置にあります。Semgrep は多くの言語で高速にパターンマッチングを行い、CodeQL はコードをデータベースとして扱い、豊富なデータフロー解析でクエリします。ここでは率直な比較を示します。
| Semgrep | CodeQL | |
|---|---|---|
| 解析の種類 | パターンマッチング (+ 一部データフロー) | 深いセマンティックデータフロー (taint) |
| ルール言語 | YAML ライク、書きやすい | CodeQL クエリ言語 (より急峻) |
| 速度 | 高速 | 低速 (コードデータベースを構築) |
| 言語サポート | 広範、多数の言語 | 広範、コンパイル + インタプリタ |
| ライセンス | OSS コア + 有料プラットフォーム | OSS/公開は無料、非公開利用は規約あり |
| GitHub 統合 | Action が利用可能 | ネイティブ code scanning |
速度とルール記述
Semgrep は採用が容易です。ルールはマッチさせたいコードのように見え、スキャンも高速なので、インラインの PR チェックや組織のカスタムルールによく適合します。その解析は CodeQL よりも手続き間データフローに関して軽量なため、一部の深い脆弱性は表現するのにより多くの作業が必要です。CodeQL のクエリ記述はより手間がかかりますが、パターンマッチングでは見逃す問題を捉える複雑な taint トラッキングを表現できます。
深さとカバレッジ
CodeQL はコードのセマンティックデータベースを構築し、強力なデータフロークエリを実行します。これは関数やファイルをまたぐインジェクションやデータフローのバグを見つけるのに優れています。その深さには時間と、コンパイル言語では build ステップのコストがかかります。Semgrep はある程度の深さを速度とシンプルさと引き換えにしており、その大きなコミュニティルールセットは多くの一般的な問題を最初からカバーします。
CI では
どちらも CI チェックとして実行され、検出結果 (SARIF) を code scanning にアップロードします。高速なフィードバックとカスタムルールには Semgrep を実行し、より深いスケジュールまたは PR スキャンには CodeQL を追加しましょう。多くのチームは両方を使います。Semgrep をすべての push で、CodeQL をスケジュールまたはデフォルトブランチの PR で実行します。
結論
高速なスキャンと簡単なカスタムルールには Semgrep を、より微妙な脆弱性を捉える深いデータフローベースの解析には CodeQL を選びましょう。自分のユースケースについて現在のライセンスを確認し、多層的なカバレッジのために両方を実行することも検討しましょう。