Communitygithub.com

mstfknn/sast-skills

AIエージェントをSASTスキャナに変えるスキルコレクション

sast-skills とは?

このスキルコレクションは、Claude Code、Codex、CursorなどのAIコーディングアシスタントを、本格的な静的アプリケーションセキュリティテスト(SAST)スキャナに変身させます。28の脆弱性クラスにわたる31のスキルを提供し、インジェクション、アクセス制御、暗号、ファイル処理、サプライチェーン、ビジネスロジック、LLM固有のリスク(プロンプトインジェクションや安全でない出力処理など)をカバーします。スキャンは、偵察、並列検出、統合レポート、エビデンスベースのトリアージという4つのフェーズで自動化され、各フェーズは冪等で再開可能です。CLAUDE.mdやAGENTS.mdを使用してアシスタントにドロップインでき、結果はJSON、SARIF 2.1.0、HTMLにエクスポート可能で、GitHub Code ScanningやCIパイプラインと統合できます。

対応✓Claude Code✓Codex CLI✓Cursor✓Gemini CLI✓OpenCode
npx skills add https://github.com/mstfknn/sast-skills/tree/main

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

プレビュー

スキル README より

npm version
CI
License: MIT
Node.js

ドキュメント

sast-skills は何をしますか?

npm version CI License: MIT Node.js

LLMコーディングアシスタントをフル機能のSASTスキャナに変えます。Claude Code、Codex、Opencode、Cursor、およびCLAUDE.md / AGENTS.mdスキルフォルダを読み込む任意のアシスタント向けのドロップインエージェントスキルです。

Claude CodeとOpusの組み合わせが品質面で推奨されますが、他の有能なモデルでも動作します。

ハイライト

  • 28の脆弱性クラスにわたる31のスキル — インジェクション、アクセス制御の破綻、弱い暗号、ファイル処理、サプライチェーン、ビジネスロジック、LLM固有のリスク(プロンプトインジェクション、安全でない出力処理)に対応。
  • 4フェーズのオーケストレーション — 偵察 → 並列検出 → 統合レポート → エビデンスベースのトリアージ。CLAUDE.md / AGENTS.mdから完全に駆動されます。
  • 冪等で再開可能 — 各フェーズは、出力が既に存在する場合は処理をスキップします。問題修正後に再実行すると、古くなった部分のみが更新されます。
  • 機械可読な出力 — すべてのスキルが正規のJSONを出力。sast-skills exportはJSON、SARIF 2.1.0、またはHTMLに集約し、GitHub Code ScanningとCIで利用できます。
  • クロスアシスタント対応 — Claude Code向け(.claude/skills)と、すべてのAGENTS.md対応アシスタント向け(.agents/skills)に同一のスキルが提供されます。
  • 設定不要のCLI — install / update / uninstall / doctor / export コマンドを提供。GitHub Actionsからnpm provenance(SLSA証明)付きで公開されています。

フロー

オーケストレーターは、偵察、並列検出、統合、トリアージの4フェーズを実行します。

flowchart TD
    U(["ユーザー: 脆弱性スキャンを実行"]) --> R{"CLAUDE.md / AGENTS.md オーケストレーター"}
    R --> S1["ステップ1 — sast-analysis<br/>コードベースとアーキテクチャマッピング"]
    S1 -->|sast/architecture.md| S2["ステップ2 — 並列脆弱性スキャン<br/>28スキル: 偵察、バッチ検証、マージ"]
    S2 -->|sast/*-results.md および *-results.json| S3["ステップ3 — sast-report<br/>統合とランク付け"]
    S3 -->|sast/final-report.md| S4["ステップ4 — sast-triage<br/>誤検知除去、<br/>エビデンスに基づく重要度調整"]
    S4 -->|sast/final-report-triaged.md および triaged.json| EXP["npx sast-skills export<br/>JSON、SARIF、HTML"]
    EXP --> CS(["GitHub Code Scanning、CI、ダッシュボード"])

すべてのステップは冪等です。出力ファイルが既に存在する場合、オーケストレーターはそのステップをスキップします。問題修正後にスキャンを再実行すると、古くなった部分のみが更新されます。


検出内容

すべてのスキルは同じ3フェーズパターンに従います: 偵察 → バッチ検証(並列サブエージェント、1バッチあたり3つ) → マージ。各スキルは人間が読めるマークダウンレポートと、sast-skills exportで集約される正規のJSON結果ファイルを書き出します。

偵察と統合

スキル役割
sast-analysisコードベース偵察、アーキテクチャマッピング、脅威モデル
sast-report脆弱性クラス別の結果を統合し、ランク付けされたレポートを作成
sast-triage誤検知を除去し、コードベースのエビデンスに基づいて重要度を調整

インジェクション

スキル脆弱性クラス
sast-sqliSQLインジェクション
sast-nosqlNoSQLインジェクション (Mongo、Firestore、DynamoDB)
sast-ldapLDAPフィルター/DNインジェクション
sast-graphql安全でないGraphQLドキュメント構築
sast-xssクロスサイトスクリプティング
sast-sstiサーバーサイドテンプレートインジェクション
sast-rceリモートコード実行(コマンドインジェクション、eval、安全でないデシリアライゼーション)
sast-xxeXML外部エンティティ
sast-ssrfサーバーサイドリクエストフォージェリ
sast-openredirectオープンリダイレクト(フィッシング/OAuthトークン窃取)

アクセス制御と認証

スキル脆弱性クラス
sast-idor安全でないダイレクトオブジェクト参照
sast-missingauth認証欠落 / 機能レベル認可の破綻
sast-jwt安全でないJWT実装
sast-csrfクロスサイトリクエストフォージェリ
sast-corsCORS設定ミス

ファイル、暗号、ランタイム

スキル脆弱性クラス
sast-pathtraversalパス/ディレクトリトラバーサル
sast-fileupload安全でないファイルアップロード
sast-crypto弱いプリミティブ、悪いモード、IV再利用、弱いPRNG
sast-prototypeJavaScriptプロトタイプ汚染
sast-redos破滅的バックトラッキングによる正規表現DoS
sast-race競合状態とTOCTOU

データ漏洩とサプライチェーン

スキル脆弱性クラス
sast-hardcodedsecretsクライアント向けコード内のAPIキー/トークン/認証情報
sast-piiログ/テレメトリ/エラーページへのPIIおよび認証情報漏洩
sast-deps既知の脆弱性のある依存関係(ロックファイル内のCVE)
sast-iac安全でないIaC(Dockerfile / Terraform / Kubernetes / GitHub Actions)

ビジネスロジックとLLM固有

スキル脆弱性クラス
sast-businesslogic価格操作、ワークフローバイパス、特典乱用
sast-promptinjectionLLMプロンプトに到達する信頼できないテキスト(OWASP LLM #1)
sast-llmoutputコード/HTML/SQL/シェルシンクに到達する未検証のLLM出力(OWASP LLM #2)

インストール

npx sast-skills install

インストーラーは、対象とするアシスタント(claude / agents / all)と、インストール先(カレントプロジェクトかユーザーホームディレクトリ、project / global)を尋ねます。プロンプトをスキップするには:

npx sast-skills install --yes --assistant claude --scope project

プロジェクトに既に CLAUDE.md または AGENTS.md が存在する場合、インストーラーはデフォルトで上書きを拒否します。バックアップを取るか、--force を渡してください。

手動インストール(npx / npm を使わない場合)

この方法は、npx を実行できない環境(企業プロキシ、npmレジストリにアクセスできない、オフライン環境)や、公開npmパッケージではなくこのフォークのソースを固定したい場合に使用します。CLIインストーラーは、オーケストレーターエントリファイルをプロジェクトルートに配置し、各スキルの SKILL.md を適切な隠しディレクトリにミラーリングするだけなので、単純な cp -R で正確に再現できます。

1. バンドルファイルを取得

git clone https://github.com/mstfknn/sast-skills.git

必要なものはすべて sast-skills/sast-files/ 以下にあります:

sast-files/
├── CLAUDE.md                       # Claude Code用オーケストレーターエントリ
├── AGENTS.md                       # Gemini CLI / Codex / OpenCode / Cursor用オーケストレーターエントリ
├── .claude/skills/sast-*/SKILL.md  # Claude Code形式の31スキル
└── .agents/skills/sast-*/SKILL.md  # AGENTS.mdアシスタント向けにミラーリングされた同一の31スキル

2つのスキルツリーは npm run sync によって同期が保たれています。コンテンツは同一で、ディレクトリ名のみが異なります。

2a. Claude Code用にインストール

以下のコマンドをコピー&ペーストしやすくするため、クローンパスを SAST_SRC に設定します。

export SAST_SRC=/absolute/path/to/sast-skills
cd /path/to/your-project

プロジェクトスコープ(推奨 — リポジトリと一緒にバージョン管理されます):

cp "$SAST_SRC/sast-files/CLAUDE.md" ./CLAUDE.md
cp -R "$SAST_SRC/sast-files/.claude" ./

既にプロジェクトレベルの CLAUDE.md を使用している場合、上書きしないでください。Claude Codeはプロジェクトごとに1つの CLAUDE.md しか読み取りません。代わりに、オーケストレーターのコンテンツ(4フェーズフロー)を既存のファイルにマージしてください。

グローバルスコープ(スキルはすべてのプロジェクトで利用可能。オーケストレーターはプロジェクトごとにコピーされます):

mkdir -p ~/.claude/skills
cp -R "$SAST_SRC/sast-files/.claude/skills/." ~/.claude/skills/
# スキャンフローを実行したい任意のプロジェクトで:
cp "$SAST_SRC/sast-files/CLAUDE.md" /path/to/your-project/CLAUDE.md

2b. Gemini CLI(および他の AGENTS.md 対応アシスタント)用にインストール

export SAST_SRC=/absolute/path/to/sast-skills
cd /path/to/your-project
cp "$SAST_SRC/sast-files/AGENTS.md" ./AGENTS.md
cp -R "$SAST_SRC/sast-files/.agents" ./

AGENTS.md は、Gemini CLI、Codex CLI、OpenCode、Cursor で採用されているクロスアシスタント規約です。Gemini CLIのバージョンが GEMINI.md を探す場合は、名前を変更してください。コンテンツは変わりません:

mv AGENTS.md GEMINI.md

3. インストールを確認

# プロジェクトスコープ(Claude Code)
ls CLAUDE.md && ls .claude/skills/ | head

# プロジェクトスコープ(Gemini / AGENTS.md)
ls AGENTS.md && ls .agents/skills/ | head

# グローバルスコープ(Claude Code)
ls ~/.claude/skills/ | head

すべての31 sast-* スキルディレクトリが表示されるはずです。プロジェクトをアシスタントで開き、"脆弱性スキャンを実行" とプロンプトしてください。CLAUDE.md / AGENTS.md 内のオーケストレーターが、そこから4フェーズを駆動します。

4. 手動インストールの更新

cd "$SAST_SRC" && git pull
# ステップ2a / 2b の cp コマンドを再実行して更新 — 冪等です。

クローンを保持しておけば、cd "$SAST_SRC" && git pull && <cpコマンド再実行> が npx sast-skills update の手動版です。

CLI コマンド

コマンド説明
npx sast-skills installCLAUDE.md / AGENTS.md とスキルツリーをプロジェクトまたは $HOME にコピー
npx sast-skills update既存のインストールを現在のバンドルスキルファイルで更新
npx sast-skills uninstallインストールされたスキルを削除。変更された CLAUDE.md は --force なしでは削除しない
npx sast-skills doctorインストールを検証し、ファイルごとに OK / MISSING / MODIFIED を報告。問題がある場合は非ゼロで終了
npx sast-skills export --input sast/ --format sarif --output report.sarifsast/*-results.json をJSON、SARIF 2.1.0、またはHTMLに集約
npx sast-skills export --input sast/ --triaged --format sarifスキルごとの生の結果よりもトリアージされた sast/triaged.json を優先
npx sast-skills --versionインストールされたCLIのバージョンを表示

インストール時のフラグ

フラグ目的
--yes非対話モード。stdin がTTYでない場合に必要
--assistant <claude|agents|all>インストールするスキルツリーを指定
--scope <project|global>./.claude/skills/ または $HOME/.claude/skills/ にインストール
--target <path>明示的なインストールターゲット(--scope を上書き)
--force既存の CLAUDE.md / AGENTS.md を上書き
--dry-runファイル計画を表示するだけで書き込みはしない

スキャンの実行

インストール後、AIアシスタントでプロジェクトを開き、次のように質問します:

脆弱性スキャンを実行

または

このコードベースの脆弱性を探して

オーケストレーターが引き継ぎます。4つのフェーズすべてを自動的に実行し、冪等性を尊重し(再実行では不足分のみを補完)、すべての出力をプロジェクトルートの sast/ に書き込みます。

出力ファイル

ファイル説明
sast/architecture.mdテクノロジースタック、アーキテクチャ、エントリポイント、データフロー
sast/*-results.md脆弱性クラスごとの検出結果(人間可読)
sast/*-results.json正規の機械可読検出結果(sast-skills export に渡される)
sast/final-report.md重要度でランク付けされた統合生レポート
sast/final-report-triaged.mdトリアージ済みレポート — 誤検知除去、重要度調整、エビデンス付き
sast/triaged.json正規のトリアージ済み検出結果(sast-skills export --triaged で推奨)

検出結果スキーマ

各スキルは sast/<skill>-results.json を検出結果のリストとして書き出します:

{
  "findings": [
    {
      "id": "sast-sqli-0001",
      "skill": "sast-sqli",
      "severity": "critical|high|medium|low|info",
      "title": "SQLインジェクション in /api/user",
      "description": "…",
      "location": { "file": "src/api/user.js", "line": 42, "column": 10 },
      "remediation": "…"
    }
  ]
}

sast-skills export はこれらのファイルを { "run": { "tool": "sast-skills", "version": "<cli-version>" }, "findings": [...] } という run エンベロープでラップされた1つのドキュメントに集約し、レポートを生成したCLIのバージョンをスタンプします。トリアージステップは、同じエンベロープ形式で sast/triaged.json を書き出します。

トリアージされた検出結果には、triage_status(confirmed|upgraded|downgraded|false_positive)、triage_original_severity(重要度が変更された場合)、および具体的なコードベース引用を含む triage_evidence が追加されます。


CI 統合

GitHub Code Scanning(SARIF)

.github/actions/scan/action.yml の複合アクション:

- uses: mstfknn/sast-skills/.github/actions/scan@main
  with:
    input: sast/
    output: sast-skills.sarif

これにより sast-skills export --format sarif が実行され、github/codeql-action/upload-sarif@v3 を介して結果がCode Scanningにアップロードされます。

Pre-commit フック

hooks/pre-commit を .git/hooks/pre-commit にコピーすると、sast-skills doctor がすべてのコミットをチェックするようになります。

Docker

docker build -t sast-skills .
docker run --rm -v "$PWD:/work" sast-skills export --input sast/ --format sarif --output report.sarif

バンドルされた Dockerfile は node:20-alpine ベースで、エントリポイントとして sast-skills が設定されています。


検証とトラブルシューティング

# インストールが期待通りの構成か確認
npx sast-skills doctor --target . --assistant claude

# バージョンチェック
npx sast-skills --version
npm view sast-skills version    # レジストリ上の最新

# アップグレード
npx sast-skills update

doctor は、ターゲット内のすべてのバンドルファイルがインストールバージョンのコピーと一致する場合は 0 で終了し、いずれかのファイルが MISSING または MODIFIED の場合は 1 で終了します。MODIFIED はファイルがバンドルコピーから逸脱していることを意味します。これはエントリファイルを編集した場合に予期され、そうでない場合は update を実行するシグナルです。


コントリビューション

CONTRIBUTING.md を参照してください。開発ループ:

npm install
npm test                                  # vitestスイート(TDDガード有効)
npm run sync                              # .claude/skills → .agents/skills にミラーリング
node scripts/scaffold-skill.js sast-foo   # 新しいスキルを両方のツリーにスタブ作成
node scripts/register-skill.js sast-foo foo "Foo" "Fooインジェクションの説明"
npm run lint:md                           # markdownlint

…(翻訳のため省略)

関連スキル