codeql-semgrep について
CodeQLとSemgrepでコードを解析し、プロジェクト固有のルール作成や修正案の提示を行う、エージェント向けセキュリティ分析技能です。データフロークエリと構造パターンの照合を組み合わせます。
主な機能
- 01CodeQLとSemgrepによる解析
- 02プロジェクト固有のセキュリティルール作成
- 03入力から危険な処理までの追跡
- 04実行可能な修正案の提示
- 05CI/CDスキャンの設定
活用シーン
- 01コードの脆弱性スキャン
- 02認証やORM規約の適用
- 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 ファイルの編集 |
関連スキル
- エージェントのセキュリティスキャン - 依存関係の CVE やエージェント固有の脅威モデルを含む、より広範な脆弱性検出
- シークレット保護 - 静的解析をシークレット専用のパターンマッチングで補完する、認証情報の漏えいスキャン
- CI/CD パイプライン - CodeQL と Semgrep のスキャンを自動化された品質ゲートとして実行するパイプライン設定
キーワード
codeql semgrep static-analysis sast taint-tracking custom-rules vulnerability-detection ci-cd-security
© 2026 googleadsagent.ai™ | Agent Skills™ | MIT License