static-analysis について
コードレビュー担当者やセキュリティチーム向けの、防御目的の静的解析スキルです。CodeQL と Semgrep で脆弱性を検出・評価し、SARIF レポート、検出結果の分類、カスタムクエリやルール、CI/CD スキャンを扱います。
主な機能
- 01CodeQL と Semgrep によるスキャン
- 02SARIF の生成と解析
- 03重大度別の検出結果分類
- 04カスタムクエリとルールの作成
- 05誤検知評価のガイダンス
- 06CI/CD スキャンワークフロー
活用シーン
- 01コードのセキュリティ問題のレビュー
- 02CI/CD へのスキャン統合
- 03検出結果の優先順位付けと報告
- 04プロジェクト固有のセキュリティチェック作成
MCP 対応
Snyk または semgrep/mcp サーバーの設定時に、スキルはスキャンや検索ツールの呼び出し方法を示します。Semgrep と Snyk のコマンドライン手順も記載されています。
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ oimiragieo/ agent-studio --skill static-analysisインストール後、Claude Code で/static-analysisを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
commands/static-analysis.mdhooks/post-execute.cjspre-execute.cjsreferences/research-requirements.mdrules/static-analysis.mdschemas/input.schema.jsonoutput.schema.jsonscripts/main.cjstemplates/implementation-template.md詳細
静的解析
セキュリティに関する注意
許可された用途のみ:これらのスキルは、防御的なセキュリティ分析および許可を得た調査にのみ使用してください。
- 書面による許可を得たセキュリティ評価
- コードレビューと品質保証
- 自動セキュリティスキャンのためのCI/CD パイプライン統合
- コンプライアンス検証(SOC2、HIPAA、PCI-DSS)
- 管理された環境での教育目的
次の目的には絶対に使用しないでください:
- 許可なくシステムをスキャンする
- 発見した脆弱性を開示せずに悪用する
- セキュリティ制御を回避する
- あらゆる違法行為
ステップ 1:環境の評価
解析を実行する前に、対象を評価してください。
# Identify languages in the project
find . -type f -name "*.js" -o -name "*.ts" -o -name "*.py" -o -name "*.java" -o -name "*.go" -o -name "*.c" -o -name "*.cpp" -o -name "*.cs" -o -name "*.rb" | head -20
# Check for existing CodeQL database
ls -la .codeql/ 2>/dev/null || echo "No CodeQL database found"
# Check for existing Semgrep config
ls -la .semgrep.yml .semgrep/ 2>/dev/null || echo "No Semgrep config found"
# Check for SARIF output directory
ls -la sarif/ results/ 2>/dev/null || echo "No SARIF output directory"
ステップ 2:CodeQL 解析
データベースの作成
# Create CodeQL database for JavaScript/TypeScript
codeql database create codeql-db --language=javascript --source-root=.
# Create CodeQL database for Python
codeql database create codeql-db --language=python --source-root=.
# Multi-language database
codeql database create codeql-db --language=javascript,python --source-root=.
クエリの実行
# Run standard security queries
codeql database analyze codeql-db \
--format=sarifv2.1.0 \
--output=results.sarif \
codeql/javascript-queries:Security
# Run specific query suite
codeql database analyze codeql-db \
--format=sarifv2.1.0 \
--output=results.sarif \
codeql/javascript-queries:codeql-suites/javascript-security-and-quality.qls
# Run custom query
codeql database analyze codeql-db \
--format=sarifv2.1.0 \
--output=results.sarif \
./custom-queries/
主な CodeQL クエリパック
| 言語 | セキュリティパック | 品質パック |
|---|---|---|
| JavaScript | codeql/javascript-queries:Security | codeql/javascript-queries:Maintainability |
| Python | codeql/python-queries:Security | codeql/python-queries:Maintainability |
| Java | codeql/java-queries:Security | codeql/java-queries:Maintainability |
| Go | codeql/go-queries:Security | codeql/go-queries:Maintainability |
| C/C++ | codeql/cpp-queries:Security | codeql/cpp-queries:Maintainability |
ステップ 3:Semgrep 解析
Semgrep の実行
# Run with default rules (auto-detect language)
semgrep scan --config=auto --sarif --output=semgrep-results.sarif
# Run with specific rule sets
semgrep scan --config=p/security-audit --sarif --output=semgrep-results.sarif
# Run with OWASP Top 10 rules
semgrep scan --config=p/owasp-top-ten --sarif --output=semgrep-results.sarif
# Run with multiple rule sets
semgrep scan \
--config=p/security-audit \
--config=p/owasp-top-ten \
--config=p/secrets \
--sarif --output=semgrep-results.sarif
# Run with custom rules
semgrep scan --config=./semgrep-rules/ --sarif --output=semgrep-results.sarif
主な Semgrep ルールセット
| ルールセット | 目的 |
|---|---|
p/security-audit | 包括的なセキュリティチェック |
p/owasp-top-ten | OWASP Top 10 の脆弱性チェック |
p/secrets | ハードコードされたシークレットの検出 |
p/ci | CI に最適化されたルールセット |
p/default | 汎用ルール |
p/r2c-security-audit | Trail of Bits のセキュリティルール |
p/javascript | JavaScript 固有のルール |
p/typescript | TypeScript 固有のルール |
p/python | Python 固有のルール |
p/golang | Go 固有のルール |
ステップ 4:SARIF 出力の処理
SARIF の構造
{
"$schema": "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/main/sarif-2.1/schema/sarif-schema-2.1.0.json",
"version": "2.1.0",
"runs": [{
"tool": {
"driver": {
"name": "CodeQL",
"rules": [...]
}
},
"results": [{
"ruleId": "js/sql-injection",
"level": "error",
"message": {
"text": "This query depends on a user-provided value."
},
"locations": [{
"physicalLocation": {
"artifactLocation": { "uri": "src/api/users.js" },
"region": { "startLine": 42, "startColumn": 5 }
}
}]
}]
}]
}
SARIF 結果の解析
# Count findings by severity
jq '[.runs[].results[] | .level] | group_by(.) | map({level: .[0], count: length})' results.sarif
# List critical/error findings
jq '.runs[].results[] | select(.level == "error") | {rule: .ruleId, file: .locations[0].physicalLocation.artifactLocation.uri, line: .locations[0].physicalLocation.region.startLine, message: .message.text}' results.sarif
# Export findings to CSV
jq -r '.runs[].results[] | [.ruleId, .level, .locations[0].physicalLocation.artifactLocation.uri, .locations[0].physicalLocation.region.startLine, .message.text] | @csv' results.sarif > findings.csv
ステップ 5:トリアージとレポート
重大度の分類
| SARIF レベル | 重大度 | 必要な対応 |
|---|---|---|
error | CRITICAL/HIGH | マージ前に直ちに修正 |
warning | MEDIUM | スプリント中に修正 |
note | LOW | 追跡し、対応可能なときに修正 |
none | INFORMATIONAL | レビューして確認 |
誤検知の評価
検出結果ごとに、以下を評価します。
- データフロー:ユーザーが制御するデータは、実際にシンクまで到達しますか?
- サニタイズ:使用前に入力は検証またはサニタイズされていますか?
- コンテキスト:脆弱なパターンはテストコードにありますか、それとも本番コードにありますか?
- 到達可能性:脆弱なコードパスを実行できますか?
- 影響:実際にどの程度悪用可能ですか?
レポートテンプレート
## Static Analysis Report
**Date**: YYYY-MM-DD
**Tools**: CodeQL vX.X, Semgrep vX.X
**Scope**: [project/directory]
### Summary
| Severity | Count | Fixed | False Positive | Remaining |
| -------- | ----- | ----- | -------------- | --------- |
| CRITICAL | X | X | X | X |
| HIGH | X | X | X | X |
| MEDIUM | X | X | X | X |
| LOW | X | X | X | X |
### Critical Findings
1. **[Rule ID]**: [Description]
- File: [path:line]
- Impact: [description]
- Remediation: [code fix]
### Recommendations
- [Prioritized list of actions]
ステップ 6:CI/CD との統合
GitHub Actions との統合
name: Static Analysis
on: [push, pull_request]
jobs:
codeql:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: github/codeql-action/init@v3
with:
languages: javascript
- uses: github/codeql-action/analyze@v3
with:
output: sarif-results
upload: true
semgrep:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: returntocorp/semgrep-action@v1
with:
config: >-
p/security-audit
p/owasp-top-ten
generateSarif: '1'
- uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: semgrep.sarif
OWASP マッピング
| OWASP カテゴリ | CodeQL クエリ | Semgrep ルール |
|---|---|---|
| A01: アクセス制御の不備 | Security/CWE-284 | p/owasp-top-ten |
| A02: 暗号化の失敗 | Security/CWE-327 | p/secrets |
| A03: インジェクション | Security/CWE-089, CWE-078 | p/security-audit |
| A07: 認証の失敗 | Security/CWE-287 | p/owasp-top-ten |
| A09: ログ記録の失敗 | Security/CWE-117 | p/security-audit |
| A10: SSRF | Security/CWE-918 | p/owasp-top-ten |
関連スキル
variant-analysis- コードベース全体からパターンに基づいて脆弱性を発見しますsemgrep-rule-creator- カスタム Semgrep ルールを開発しますdifferential-review- セキュリティに重点を置いた差分分析を行いますinsecure-defaults- ハードコードされた認証情報とフェイルオープンを検出しますsecurity-architect- STRIDE 脅威モデリングと OWASP Top 10code-analyzer- コードメトリクスと複雑度を分析します
エージェントとの統合
- security-architect(主要):セキュリティ評価と脅威モデリング
- code-reviewer(副次):自動コードレビューを強化します
- penetration-tester(副次):脆弱性を検証します
- qa(副次):品質ゲートを適用します
絶対厳守事項
- Semgrep と CodeQL の両方による分析を実行せずに、本番環境へデプロイしてはなりません
- CodeQL データベースは必ず新しく作成してください。古いデータベースでは、最近追加されたコードを見落とします
- コードコメントに誤検知と判断した根拠を記録せずに、検出結果を抑制してはなりません
- CI/CD では CRITICAL/HIGH の検出結果を必ずブロックしてください。未解決の重大な問題がある状態でマージしてはなりません
- テストやフィクスチャのディレクトリで分析を実行してはなりません。本番以外のコードパスは必ず除外してください
アンチパターン
| アンチパターン | 失敗する理由 | 正しい方法 |
|---|---|---|
| 古い CodeQL データベースを使用する | 前回のビルド以降に追加されたコードが分析されない | 分析を実行するたびに、必ず新しいデータベースを作成します |
| 汎用ルールスイートを使用する | 汎用ルールでは、言語固有のセキュリティパターンを見落とします | 言語固有のセキュリティスイート(例:codeql/javascript-queries:Security)を使用します |
| 根拠を記録せずに検出結果を抑制する | セキュリティ上の負債が表面化しないまま蓄積し、監査の不備を招きます | 抑制する前に、コードコメントに誤検知と判断した理由を記録します |
| テストやフィクスチャのコードをスキャンする | 意図的に脆弱性を含めたテストコードによる誤検知が発生します | すべてのスキャンで test/ と fixture/ のディレクトリを除外します |
| 修正後に再実行しない | 修正が確認されず、同じ検出結果が再発します | 解決を確認するため、修正のたびに必ず分析を再実行します |
メモリプロトコル(必須)
開始前:
.claude/context/memory/learnings.md を読みます
完了後:
- 新しいパターン →
.claude/context/memory/learnings.md - 問題の発見 →
.claude/context/memory/issues.md - 決定事項 →
.claude/context/memory/decisions.md
中断を想定してください:メモリに記録されていなければ、実行されていないものとします。
Snyk + Semgrep MCP 統合
Snyk MCP サーバーが設定されている場合は、直接呼び出します:
snyk_test_project— CVSS スコア付きの依存関係の脆弱性レポートsnyk_code_test— SAST スキャン(OWASP Top 10 のパターン)snyk_iac_test— IaC のセキュリティ問題(Terraform、K8s、Helm)snyk_monitor— 継続的なモニタリングに向けてプロジェクトを登録
semgrep/mcp サーバーが設定されている場合:
semgrep_scan— コードベースに対してルールレジストリを実行semgrep_search— セマンティックなコードパターン検索
統合セキュリティパイプライン
semgrep scan --config=auto --json > .claude/context/tmp/semgrep.json
snyk test --json > .claude/context/tmp/snyk.json
コメント
Markdown 対応