sast-skills は何をしますか?
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-sqli | SQLインジェクション |
sast-nosql | NoSQLインジェクション (Mongo、Firestore、DynamoDB) |
sast-ldap | LDAPフィルター/DNインジェクション |
sast-graphql | 安全でないGraphQLドキュメント構築 |
sast-xss | クロスサイトスクリプティング |
sast-ssti | サーバーサイドテンプレートインジェクション |
sast-rce | リモートコード実行(コマンドインジェクション、eval、安全でないデシリアライゼーション) |
sast-xxe | XML外部エンティティ |
sast-ssrf | サーバーサイドリクエストフォージェリ |
sast-openredirect | オープンリダイレクト(フィッシング/OAuthトークン窃取) |
アクセス制御と認証
| スキル | 脆弱性クラス |
|---|---|
sast-idor | 安全でないダイレクトオブジェクト参照 |
sast-missingauth | 認証欠落 / 機能レベル認可の破綻 |
sast-jwt | 安全でないJWT実装 |
sast-csrf | クロスサイトリクエストフォージェリ |
sast-cors | CORS設定ミス |
ファイル、暗号、ランタイム
| スキル | 脆弱性クラス |
|---|---|
sast-pathtraversal | パス/ディレクトリトラバーサル |
sast-fileupload | 安全でないファイルアップロード |
sast-crypto | 弱いプリミティブ、悪いモード、IV再利用、弱いPRNG |
sast-prototype | JavaScriptプロトタイプ汚染 |
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-promptinjection | LLMプロンプトに到達する信頼できないテキスト(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 install | CLAUDE.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.sarif | sast/*-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
…(翻訳のため省略)