Opengrep - オープンソース 静的コード解析 チートシート
Opengrepはセムグレップエンジンのコミュニティ統治フォークで、機能が商用ライセンスの背後に移された後に作成されたもの。それは高速で、パターンベースの静的アプリケーションセキュリティテスト (SAST) を30以上の言語で実行し、マッチするコードのように見えるシンタックスで書かれたルール — ASTの専門知識は不要。このフォークの前提は、コア走査機能(クロスファイルデータフロー機能など)はすべてフルオープンソースのままであるべきということである。
インストール
スキャン
| コマンド | 説明 |
|---|
opengrep scan . | デフォルトルールで現在のディレクトリをスキャン |
opengrep scan --config auto . | 検出された言語に対してルールを自動選択 |
opengrep scan --config rules/ . | ローカルルールディレクトリを使用 |
opengrep scan --config p/security-audit . | ルールパックを使用 |
opengrep scan --json -o out.json . | JSON出力 |
opengrep scan --sarif -o out.sarif . | コード走査プラットフォーム用SARIF |
ルール作成
ルールはYAML;patternは見つけたいコードのように見える。
rules:
- id: hardcoded-aws-key
patterns:
- pattern: $KEY = "AKIA..."
message: Possible hardcoded AWS access key
languages: [python, javascript]
severity: ERROR
| キー | 目的 |
|---|
pattern | マッチするコード形状 ($X = メタ変数) |
patterns | 複数の条件のAND |
pattern-either | 選択肢のOR |
pattern-not | 形状を除外 (誤検知を削除) |
pattern-inside | コンテキスト内でのみマッチ |
metavariable-regex | メタ変数を制約 |
severity | INFO / WARNING / ERROR |
パターンシンタックス基礎
| シンタックス | マッチ |
|---|
$X | 任意の単一式 (メタ変数) |
... | 任意のシーケンス (引数、ステートメント) |
foo(...) | fooへの任意の呼び出し |
$OBJ.method(...) | 何かのメソッド呼び出し |
"..." | 任意の文字列リテラル |
# eval()をリテラル以外の入力で見つけ
- pattern: eval($X)
pattern-not: eval("...")
Taint / データフロールール
rules:
- id: sqli-taint
mode: taint
pattern-sources:
- pattern: request.args.get(...)
pattern-sinks:
- pattern: cursor.execute($Q)
message: Untrusted input reaches SQL execution
languages: [python]
severity: ERROR
Taintモードはソース (信頼されない入力)からシンク (危険な操作)へのデータを追跡し、これは構文的な見かけ上のものではなく実際のインジェクションバグを見つける方法である。
CI統合
# エラー重大度の結果でビルドを失敗させる
opengrep scan --config auto --error .
# このPRで変更されたファイルのみをスキャン
opengrep scan --config auto --baseline-commit origin/main .
| フラグ | 効果 |
|---|
--error | 結果が存在するときに終了コード0以外 |
--baseline-commit | diff対応走査(新しい結果のみ) |
--severity ERROR | 重大度でフィルター |
--exclude | パスをスキップ (vendor、tests) |
--sarif | GitHubコード走査にアップロード |
ルールのテスト
# ルールは期待される結果で注釈されたテストファイルと共にシップ
opengrep test rules/
テストファイルを、マッチするはずの行の上に# ruleid: my-ruleで注釈を付け、マッチしないはずの行に# ok: my-ruleで注釈を付ける — その後、opengrep testはルールが期待どおりに動作することを確認する。
Opengrep vs 関連ツール
| 側面 | Opengrep | Semgrep | CodeQL |
|---|
| ライセンス | 完全オープンソース | オープンコア + 商用 | OSS無料、商用制限 |
| ルールシンタックス | コードのようなパターン | 同じ系統 | QLクエリ言語 |
| 学習曲線 | 低い | 低い | 高い |
| 最適用途 | 機能ゲートなし開く SAST | マネージドプラットフォーム+ルール | 深いセマンティッククエリ |
Semgrepの知識と組み合わせてください (ルールはほぼ互換性あり)また、Python固有のチェックのためにBanditを補完します。
リソース