mcpField
C
codeql-semgrep

codeql-semgrep

github.com/itallstartedwithaideaセキュリティ4478 回インストール28 週間前に更新
リポジトリ

codeql-semgrep について

CodeQLとSemgrepでコードを解析し、プロジェクト固有のルール作成や修正案の提示を行う、エージェント向けセキュリティ分析技能です。データフロークエリと構造パターンの照合を組み合わせます。

主な機能

  1. 01CodeQLとSemgrepによる解析
  2. 02プロジェクト固有のセキュリティルール作成
  3. 03入力から危険な処理までの追跡
  4. 04実行可能な修正案の提示
  5. 05CI/CDスキャンの設定

活用シーン

  1. 01コードの脆弱性スキャン
  2. 02認証やORM規約の適用
  3. 03CI/CDパイプラインへのセキュリティスキャン追加

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/itallstartedwithaidea/agent-skills --skill codeql-semgrep

インストール後、Claude Code で/codeql-semgrepを入力して読み込まれたか確認します。

詳細

CodeQL と Semgrep

googleadsagent.ai™ による Agent Skills™ の一部です。

説明

CodeQL と Semgrep は、本番環境レベルの静的解析をエージェントのワークフローに統合し、脆弱性を詳細に検出し、カスタムルールを作成し、コードレビューの適用を自動化します。エージェントは、プロジェクト固有のパターンに合わせた CodeQL クエリと Semgrep ルールを作成し、コードベースに対して実行して、実行可能な修正ガイダンスとともに結果を解釈します。

パターンマッチング型のセキュリティスキャナーは、表面的な問題を検出します。CodeQL と Semgrep は、より深いレベルで動作します。CodeQL はプログラムの構造をリレーショナルデータベースとして構築し、ソース(ユーザー入力)からシンク(危険な操作)までのデータフローを追跡するクエリを評価します。Semgrep は、型を考慮した解析で構文パターンを照合します。両者を組み合わせることで、正規表現ベースのスキャナーでは見逃される脆弱性も検出できます。

このスキルは、デフォルトのルールセットを実行するだけではありません。エージェントは、プロジェクト固有のパターンに対するカスタムルールを作成します。たとえば、すべてのデータベースクエリでプロジェクトの ORM ラッパーが使われていることの確認、すべてのルートに認証ミドルウェアが適用されていることの検証、エラーレスポンスからスタックトレースが漏えいしないことの確認などです。カスタムルールは、個々のレビュアーに依存せず、組織に蓄積されたセキュリティ知識を保持します。

使用する場面

  • AI が生成したコードや人が記述したコードに対して静的解析を実行する場合
  • プロジェクト固有のパターンに対するカスタムセキュリティルールを作成する場合
  • CI/CD パイプラインにセキュリティスキャンを統合する場合
  • ユーザー入力から危険な操作までのデータフローを追跡する場合
  • アーキテクチャ上のセキュリティ制約(すべてのルートでの認証、ORM の使用)を適用する場合
  • ユーザーが「静的解析」、「CodeQL」、「Semgrep」をリクエストした場合

動作の仕組み

graph TD
    A[Codebase] --> B{Analysis Engine}
    B -->|Data Flow| C[CodeQL: Build Database]
    B -->|Pattern Match| D[Semgrep: Parse AST]
    C --> E[Run CodeQL Queries]
    D --> F[Run Semgrep Rules]
    E --> G[Taint Tracking: Source → Sink]
    F --> H[Pattern Matches + Metavariables]
    G --> I[Merge Findings]
    H --> I
    I --> J[Deduplicate + Prioritize]
    J --> K[Remediation Report]
    K --> L[CI/CD Gate: Pass/Fail]

CodeQL はデータフロー解析(プログラム内で汚染された入力を追跡すること)に優れ、Semgrep はパターンマッチング(構造的なアンチパターンを見つけること)に優れています。両方を実行することで、包括的にカバーできます。

実装

Semgrep ルール
# .semgrep/agent-rules.yml
rules:
  - id: sql-injection-f-string
    patterns:
      - pattern: |
          $CURSOR.execute(f"...", ...)
    message: >
      SQL query uses f-string interpolation, which is vulnerable to SQL injection.
      Use parameterized queries instead.
    severity: ERROR
    languages: [python]
    metadata:
      cwe: ["CWE-89"]
      confidence: HIGH

  - id: missing-auth-middleware
    patterns:
      - pattern: |
          @app.route($PATH, ...)
          def $FUNC(...):
              ...
      - pattern-not-inside: |
          @require_auth
          @app.route($PATH, ...)
          def $FUNC(...):
              ...
    message: >
      Route handler $FUNC lacks @require_auth decorator.
      All routes must be authenticated unless explicitly exempted.
    severity: WARNING
    languages: [python]
    metadata:
      cwe: ["CWE-306"]

  - id: no-eval-user-input
    patterns:
      - pattern: eval($X)
      - pattern-where-python: |
          not $X.startswith('"')
    message: "eval() called with potentially dynamic input"
    severity: ERROR
    languages: [python]
    metadata:
      cwe: ["CWE-95"]
CodeQL クエリ
/**
 * @name SQL injection from request parameter
 * @description Finds SQL queries constructed from HTTP request parameters
 * @kind path-problem
 * @severity error
 * @id agent-skills/sql-injection
 * @tags security
 *       cwe-089
 */

import python
import semmle.python.dataflow.new.TaintTracking
import semmle.python.ApiGraphs

class SqlInjectionConfig extends TaintTracking::Configuration {
  SqlInjectionConfig() { this = "SqlInjectionConfig" }

  override predicate isSource(DataFlow::Node source) {
    exists(API::CallNode call |
      call = API::moduleImport("flask").getMember("request").getMember("args").getMember("get").getACall() and
      source = call
    )
  }

  override predicate isSink(DataFlow::Node sink) {
    exists(API::CallNode call |
      call = API::moduleImport("sqlite3").getMember("Cursor").getMember("execute").getACall() and
      sink = call.getArg(0)
    )
  }
}

from SqlInjectionConfig config, DataFlow::PathNode source, DataFlow::PathNode sink
where config.hasFlowPath(source, sink)
select sink.getNode(), source, sink, "SQL query depends on $@.", source.getNode(), "user input"
CI/CD 統合
# GitHub Actions
- name: Semgrep Scan
  uses: semgrep/semgrep-action@v1
  with:
    config: >-
      p/owasp-top-ten
      p/r2c-security-audit
      .semgrep/agent-rules.yml

- name: CodeQL Analysis
  uses: github/codeql-action/analyze@v3
  with:
    languages: python, javascript
    queries: +.codeql/custom-queries

ベストプラクティス

  • 相互補完的にカバーするため、CodeQL(データフロー)と Semgrep(パターンマッチング)の両方を実行します
  • プロジェクト固有のセキュリティ不変条件(認証、ORM、入力検証)に対するカスタムルールを作成します
  • ルールは段階的に追加し、確度が高く誤検知の少ないパターンから始めます
  • 標準化された脆弱性分類のため、すべてのルールに CWE ID を含めます
  • すべての PR でスキャンを実行し、ERROR 重大度の検出結果がある場合はマージをブロックします
  • コードベースのアーキテクチャの進化に合わせて、カスタムルールを四半期ごとに見直し、更新します

プラットフォームとの互換性

プラットフォームサポート備考
Cursor完全対応ルールの作成と CI 設定
VS Code完全対応Semgrep 拡張機能
Windsurf完全対応静的解析の統合
Claude Code完全対応クエリ/ルールの生成
Cline完全対応セキュリティルールの作成
aider一部対応YAML/QL ファイルの編集

関連スキル

キーワード

codeql semgrep static-analysis sast taint-tracking custom-rules vulnerability-detection ci-cd-security


© 2026 googleadsagent.ai™ | Agent Skills™ | MIT License

コメント