コンテンツにスキップ

Opengrep - オープンソース 静的コード解析 チートシート

Opengrep - オープンソース 静的コード解析 チートシート

Opengrepはセムグレップエンジンのコミュニティ統治フォークで、機能が商用ライセンスの背後に移された後に作成されたもの。それは高速で、パターンベースの静的アプリケーションセキュリティテスト (SAST) を30以上の言語で実行し、マッチするコードのように見えるシンタックスで書かれたルール — ASTの専門知識は不要。このフォークの前提は、コア走査機能(クロスファイルデータフロー機能など)はすべてフルオープンソースのままであるべきということである。

インストール

方法コマンド
インストールスクリプト`curl -fsSL https://raw.githubusercontent.com/opengrep/opengrep/main/install.sh
Dockerdocker run --rm -v "$PWD:/src" opengrep/opengrep opengrep scan /src
バイナリGitHub Releasesからダウンロード
確認opengrep --version

スキャン

コマンド説明
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メタ変数を制約
severityINFO / 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-commitdiff対応走査(新しい結果のみ)
--severity ERROR重大度でフィルター
--excludeパスをスキップ (vendor、tests)
--sarifGitHubコード走査にアップロード

ルールのテスト

# ルールは期待される結果で注釈されたテストファイルと共にシップ
opengrep test rules/

テストファイルを、マッチするはずの行の上に# ruleid: my-ruleで注釈を付け、マッチしないはずの行に# ok: my-ruleで注釈を付ける — その後、opengrep testはルールが期待どおりに動作することを確認する。

Opengrep vs 関連ツール

側面OpengrepSemgrepCodeQL
ライセンス完全オープンソースオープンコア + 商用OSS無料、商用制限
ルールシンタックスコードのようなパターン同じ系統QLクエリ言語
学習曲線低い低い高い
最適用途機能ゲートなし開く SASTマネージドプラットフォーム+ルール深いセマンティッククエリ

Semgrepの知識と組み合わせてください (ルールはほぼ互換性あり)また、Python固有のチェックのためにBanditを補完します。

リソース