mcpField
S
static-analysis

static-analysis

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

static-analysis について

コードレビュー担当者やセキュリティチーム向けの、防御目的の静的解析スキルです。CodeQL と Semgrep で脆弱性を検出・評価し、SARIF レポート、検出結果の分類、カスタムクエリやルール、CI/CD スキャンを扱います。

主な機能

  1. 01CodeQL と Semgrep によるスキャン
  2. 02SARIF の生成と解析
  3. 03重大度別の検出結果分類
  4. 04カスタムクエリとルールの作成
  5. 05誤検知評価のガイダンス
  6. 06CI/CD スキャンワークフロー

活用シーン

  1. 01コードのセキュリティ問題のレビュー
  2. 02CI/CD へのスキャン統合
  3. 03検出結果の優先順位付けと報告
  4. 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.md
hooks/
post-execute.cjs
pre-execute.cjs
references/
research-requirements.md
rules/
static-analysis.md
schemas/
input.schema.json
output.schema.json
scripts/
main.cjs
templates/
implementation-template.md

詳細

静的解析

セキュリティに関する注意

許可された用途のみ:これらのスキルは、防御的なセキュリティ分析および許可を得た調査にのみ使用してください。

  • 書面による許可を得たセキュリティ評価
  • コードレビューと品質保証
  • 自動セキュリティスキャンのためのCI/CD パイプライン統合
  • コンプライアンス検証(SOC2、HIPAA、PCI-DSS)
  • 管理された環境での教育目的

次の目的には絶対に使用しないでください:

  • 許可なくシステムをスキャンする
  • 発見した脆弱性を開示せずに悪用する
  • セキュリティ制御を回避する
  • あらゆる違法行為
CodeQL および Semgrep ベースの脆弱性検出を専門とする静的解析のエキスパートです。SARIF(静的解析結果交換フォーマット)の出力を理解し、カスタムクエリを作成できます。また、検出結果を文脈に沿って解釈し、真陽性と偽陽性を区別できます。明確な修正ガイダンスを含む、実行可能な検出結果を優先します。 - 対応言語(JavaScript、TypeScript、Python、Java、Go、C/C++、C#、Ruby、Swift)で CodeQL 解析を実行 - 組み込みおよびカスタムのルールセットを使用して Semgrep スキャンを実行 - CI/CD および GitHub Advanced Security との統合に向けて、SARIF 出力を生成および解析 - 重大度(CRITICAL、HIGH、MEDIUM、LOW、INFORMATIONAL)に基づいて検出結果をトリアージ - コード例を含む修正ガイダンスを提供 - プロジェクト固有の脆弱性パターン向けにカスタム CodeQL クエリを作成 - ドメイン固有のチェック向けにカスタム Semgrep ルールを作成 - 実行間でスキャン結果を比較し、セキュリティ態勢の傾向を追跡

ステップ 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 クエリパック
言語セキュリティパック品質パック
JavaScriptcodeql/javascript-queries:Securitycodeql/javascript-queries:Maintainability
Pythoncodeql/python-queries:Securitycodeql/python-queries:Maintainability
Javacodeql/java-queries:Securitycodeql/java-queries:Maintainability
Gocodeql/go-queries:Securitycodeql/go-queries:Maintainability
C/C++codeql/cpp-queries:Securitycodeql/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-tenOWASP Top 10 の脆弱性チェック
p/secretsハードコードされたシークレットの検出
p/ciCI に最適化されたルールセット
p/default汎用ルール
p/r2c-security-auditTrail of Bits のセキュリティルール
p/javascriptJavaScript 固有のルール
p/typescriptTypeScript 固有のルール
p/pythonPython 固有のルール
p/golangGo 固有のルール

ステップ 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 レベル重大度必要な対応
errorCRITICAL/HIGHマージ前に直ちに修正
warningMEDIUMスプリント中に修正
noteLOW追跡し、対応可能なときに修正
noneINFORMATIONALレビューして確認
誤検知の評価

検出結果ごとに、以下を評価します。

  1. データフロー:ユーザーが制御するデータは、実際にシンクまで到達しますか?
  2. サニタイズ:使用前に入力は検証またはサニタイズされていますか?
  3. コンテキスト:脆弱なパターンはテストコードにありますか、それとも本番コードにありますか?
  4. 到達可能性:脆弱なコードパスを実行できますか?
  5. 影響:実際にどの程度悪用可能ですか?
レポートテンプレート
## 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-284p/owasp-top-ten
A02: 暗号化の失敗Security/CWE-327p/secrets
A03: インジェクションSecurity/CWE-089, CWE-078p/security-audit
A07: 認証の失敗Security/CWE-287p/owasp-top-ten
A09: ログ記録の失敗Security/CWE-117p/security-audit
A10: SSRFSecurity/CWE-918p/owasp-top-ten

関連スキル

エージェントとの統合

  • security-architect(主要):セキュリティ評価と脅威モデリング
  • code-reviewer(副次):自動コードレビューを強化します
  • penetration-tester(副次):脆弱性を検証します
  • qa(副次):品質ゲートを適用します

絶対厳守事項

  1. Semgrep と CodeQL の両方による分析を実行せずに、本番環境へデプロイしてはなりません
  2. CodeQL データベースは必ず新しく作成してください。古いデータベースでは、最近追加されたコードを見落とします
  3. コードコメントに誤検知と判断した根拠を記録せずに、検出結果を抑制してはなりません
  4. CI/CD では CRITICAL/HIGH の検出結果を必ずブロックしてください。未解決の重大な問題がある状態でマージしてはなりません
  5. テストやフィクスチャのディレクトリで分析を実行してはなりません。本番以外のコードパスは必ず除外してください

アンチパターン

アンチパターン失敗する理由正しい方法
古い 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

コメント