
skill-scanner v2.0.14
エージェントスキル向けセキュリティスキャナー
Skill Scanner
AIエージェントスキル向けのベストエフォート型セキュリティスキャナで、プロンプトインジェクション、データ窃取、悪意のあるコードパターンを検出します。パターンベース検出(YAML + YARA)、LLM-as-a-judge、行動データフロー分析を組み合わせることで、誤検知を最小限に抑えながら、想定される脅威の検出範囲を最大化します。
重要: 本スキャナはベストエフォート型の検出を提供するものであり、包括的または完全なカバレッジを保証するものではありません。検出結果がゼロであっても、スキルがすべての脅威から解放されていることを保証するものではありません。適用範囲と制限を参照してください。
OpenAI Codex Skills および Cursor Agent Skills の形式を、Agent Skills仕様に従ってサポートします。--lenient を使用すると、Claude Code の .claude/commands/*.md やフラットな Markdown スキルリポジトリなどの非標準形式もスキャンします。
ハイライト
- マルチエンジン検出 - 静的解析、行動データフロー、LLM意味解析、クラウドベーススキャンによる多層的なベストエフォートカバレッジ
- 誤検知フィルタリング - メタアナライザが検出能力を維持しながらノイズを大幅に低減
- CI/CD対応 - GitHub Code Scanning 向け SARIF 出力、再利用可能な GitHub Actions ワークフロー、ビルド失敗用の終了コード
- Pre-commit フック - 標準 pre-commit フレームワークとの統合により、コミット前にスキルをスキャン
- 拡張可能 - カスタムアナライザ用のプラグインアーキテクチャ
Cisco AI Discord に参加 して、議論、フィードバック共有、チームとの交流ができます。
適用範囲と制限
Skill Scanner は検出ツールです。既知および想定されるリスクパターンを識別しますが、セキュリティを認定するものではありません。
主な制限事項:
- 検出なし ≠ リスクなし。 「No findings」を返すスキャンは、既知の脅威パターンが検出されなかったことを示します。スキルが安全、無害、または脆弱性がないことを保証するものではありません。
- カバレッジは本質的に不完全です。 本スキャナは、シグネチャベース検出、LLMベースの意味解析、行動データフロー分析、オプションのクラウドサービス、設定可能なルールパックを組み合わせています。このアプローチはカバレッジを向上させますが、自動化ツールがすべての手法、特に新規またはゼロデイ攻撃を検出できるわけではありません。
- 誤検知と見逃しが発生する可能性があります。 コンセンサスモードとメタ分析はノイズを低減しますが、すべての誤分類を排除する設定はありません。スキャンポリシーをリスク許容度に合わせて調整してください。
- 人間によるレビューは引き続き不可欠です。 自動スキャンは多層防御戦略の1つの構成要素です。高リスクまたは本番環境へのデプロイでは、スキャナの結果を手動コードレビューや脅威モデリングと組み合わせる必要があります。
ドキュメント
| ガイド | 説明 |
|---|---|
| クイックスタート | 5分で始める |
| アーキテクチャ | システム設計とコンポーネント |
| 脅威分類法 | 例付きの完全なAITech脅威分類法 |
| LLMアナライザ | LLMの設定と使用方法 |
| メタアナライザ | 誤検知フィルタリングと優先順位付け |
| 行動アナライザ | データフロー分析の詳細 |
| スキャンポリシー | カスタムポリシー、プリセット、チューニングガイド |
| ポリシークイックリファレンス | ポリシーセクションと調整項目のコンパクトなリファレンス |
| ルール作成 | シグネチャ、YARA、Pythonルールの追加方法 |
| GitHub Actions | CI/CD統合用の再利用可能なワークフロー |
| APIリファレンス | REST APIドキュメント |
| 開発ガイド | コントリビューションと開発環境のセットアップ |
インストール
前提条件: Python 3.10+ および uv(推奨)または pip
# uv を使用(推奨)
uv pip install cisco-ai-skill-scanner
# pip を使用
pip install cisco-ai-skill-scanner
クラウドプロバイダー拡張機能
# AWS Bedrock サポート
pip install cisco-ai-skill-scanner[bedrock]
# Google AI Studio / Gemini サポート
pip install cisco-ai-skill-scanner[google]
# Google Vertex AI サポート
pip install cisco-ai-skill-scanner[vertex]
# Azure OpenAI サポート
pip install cisco-ai-skill-scanner[azure]
# すべてのクラウドプロバイダー
pip install cisco-ai-skill-scanner[all]
クイックスタート
環境設定(オプション)
# LLMアナライザとメタアナライザ用
export SKILL_SCANNER_LLM_API_KEY="your_api_key"
export SKILL_SCANNER_LLM_MODEL="claude-3-5-sonnet-20241022"
# オプション: disabled, minimal, low, medium, high, xhigh, または max
export SKILL_SCANNER_LLM_REASONING_EFFORT="low"
# VirusTotal バイナリスキャン用
export VIRUSTOTAL_API_KEY="your_virustotal_api_key"
# Cisco AI Defense 用
export AI_DEFENSE_API_KEY="your_aidefense_api_key"
対話型ウィザード
どのフラグを使えばよいか不明ですか?引数なしで skill-scanner を実行すると、対話型ウィザードが起動します:
skill-scanner
ウィザードは、スキャンターゲット、アナライザ、ポリシー、出力形式の選択を案内し、実行前に組み立てられたコマンドを表示します。CLIの学習に最適です。
CLIの使用方法
# 単一スキルのスキャン(コアアナライザ: static + bytecode + pipeline)
skill-scanner scan /path/to/skill
# 行動アナライザを使用したスキャン(データフロー分析)
skill-scanner scan /path/to/skill --use-behavioral
# すべてのエンジンでスキャン
skill-scanner scan /path/to/skill --use-behavioral --use-llm --use-aidefense
# 誤検知フィルタリング用のメタアナライザを使用したスキャン
skill-scanner scan /path/to/skill --use-llm --enable-meta
# 曖昧な説明チェック用のトリガーアナライザを使用したスキャン
skill-scanner scan /path/to/skill --use-trigger
# LLMアナライザを複数回実行し、多数決で合意された検出結果のみを保持
skill-scanner scan /path/to/skill --use-llm --llm-consensus-runs 3
# 複数のスキルを再帰的にスキャン
skill-scanner scan-all /path/to/skills --recursive --use-behavioral
# スキル間の重複検出を有効にして複数のスキルをスキャン
skill-scanner scan-all /path/to/skills --recursive --check-overlap
# GitHub リポジトリのスキャン(owner/repo 短縮形または完全なURL)
skill-scanner scan-repo owner/repo
skill-scanner scan-repo https://github.com/owner/repo --use-llm
# レニエントモード: 不正なスキルをエラーにする代わりに許容
skill-scanner scan /path/to/skill --lenient
skill-scanner scan-all /path/to/skills --recursive --lenient
# 非標準スキル形式でのレニエントモード(SKILL.md 不要)
skill-scanner scan .claude/commands/deploy --lenient
skill-scanner scan-all .claude/commands --recursive --lenient
# SKILL.md の代わりにカスタムメタデータファイル名を使用
skill-scanner scan /path/to/skill --skill-file README.md
# CI/CD: 脅威が見つかった場合にビルドを失敗させる
skill-scanner scan-all ./skills --fail-on-severity high --format sarif --output results.sarif
# 攻撃相関グループ付きの対話型HTMLレポートを生成
skill-scanner scan /path/to/skill --use-llm --enable-meta --format html --output report.html
# カスタムYARAルールを使用
skill-scanner scan /path/to/skill --custom-rules /path/to/my-rules/
# カスタム分類法 + 脅威マッピングプロファイルを使用(JSON/YAML)
skill-scanner scan /path/to/skill --taxonomy /path/to/taxonomy.json --threat-mapping /path/to/threat_mapping.json
# VirusTotal ハッシュスキャン(オプションで未知ファイルのアップロード)
skill-scanner scan /path/to/skill --use-virustotal --vt-upload-files
# スキャンポリシープリセットを使用(strict, balanced, permissive)
skill-scanner scan /path/to/skill --policy strict
# カスタム組織ポリシーファイルを使用
skill-scanner scan /path/to/skill --policy my_org_policy.yaml
# カスタマイズ用のポリシーファイルを生成
skill-scanner generate-policy -o my_org_policy.yaml
# 対話型ポリシー設定ツール(TUI)
skill-scanner configure-policy
コンセンサスモードでは、設定された実行回数の過半数以上で出現した検出結果のみを保持します。重大度について投票が一致しない場合、応答順序に関係なく、観測された最高の重大度が採用されます。失敗した実行と、検出結果を含まない成功した実行は投票しませんが、分母には残ります。これにより、多数決で合意された検出結果の重大度選択が安定します。個々のLLMサンプルを決定論的にするものではなく、同等の重大度の投票、単一実行出力、非多数決の検出結果からの説明フィールドは、スキャン間で変わる可能性があります。
LLMプロバイダーに関する注意: --llm-provider は現在 anthropic または openai を受け付けます。Bedrock、Vertex、Azure、Gemini、その他のLiteLLMバックエンドでは、プロバイダー固有のモデル文字列と環境変数を設定してください(LLMアナライザのドキュメントを参照)。
Python SDK
from skill_scanner import SkillScanner
from skill_scanner.core.analyzers import BehavioralAnalyzer
# アナライザを使用してスキャナを作成
scanner = SkillScanner(analyzers=[
BehavioralAnalyzer(),
])
# スキルをスキャン
result = scanner.scan_skill("/path/to/skill")
print(f"Findings: {len(result.findings)}")
print(f"Max severity: {result.max_severity}")
# 注: is_safe は HIGH/CRITICAL の検出結果がないことを示します。
# スキルがすべてのリスクから解放されていることを保証するものではありません。
if not result.is_safe:
print("Issues detected -- review findings before deployment")
セキュリティアナライザ
| アナライザ | 検出方法 | 適用範囲 | 要件 |
|---|---|---|---|
| Static | YAML + YARAパターン | すべてのファイル | なし |
| Bytecode | .pyc整合性検証 | Pythonバイトコード | なし |
| Pipeline | コマンド汚染分析 | シェルパイプライン | なし |
| Behavioral | ASTデータフロー分析 | Pythonファイル | なし |
| LLM | 意味解析 | SKILL.md + スクリプト | APIキー |
| Meta | 誤検知フィルタリング | すべての検出結果 | APIキー |
| VirusTotal | ハッシュベースのマルウェア | バイナリファイル | APIキー |
| AI Defense | クラウドベースのAI | テキストコンテンツ | APIキー |
CLIオプション
| オプション | 説明 |
|---|---|
--policy | スキャンポリシー: プリセット名(strict、balanced、permissive)またはカスタムYAMLへのパス |
--use-behavioral | 行動アナライザを有効化(データフロー分析) |
--use-llm | LLMアナライザを有効化(APIキーが必要) |
--llm-provider | CLIルーティング用のLLMプロバイダー: anthropic または openai |
--llm-consensus-runs N | LLM分析を N 回実行し、多数決で合意された検出結果を保持し、観測された最高の重大度を維持 |
--llm-max-tokens N | LLM応答の最大出力トークン数(デフォルト: 8192) |
--llm-reasoning-effort LEVEL | オプションの推論深度(disabled、minimal、low、medium、high、xhigh、または max); 未設定の場合はプロバイダーのデフォルトを維持 |
--use-virustotal | VirusTotal バイナリスキャナを有効化 |
--vt-api-key KEY | VirusTotal APIキーを直接指定(オプション) |
--vt-upload-files | 未知のバイナリをVirusTotalにアップロード(オプション) |
--use-aidefense | Cisco AI Defense アナライザを有効化 |
--aidefense-api-url URL | AI Defense API URLを上書き(オプション) |
--use-trigger | トリガー特異性アナライザを有効化 |
--enable-meta | 誤検知フィルタリング用のメタアナライザを有効化 |
--verbose | 検出結果ごとのポリシーフィンガープリント、共起メタデータを含め、メタアナライザの誤検知を保持 |
--format | 出力: summary、json、markdown、table、sarif、html。html 形式は、折りたたみ可能な相関グループ、展開可能なコードスニペット、パイプライン汚染フロー図を備えた自己完結型の対話型レポートを生成 |
--detailed | Markdown出力に詳細な検出結果を含める |
--compact | コンパクトなJSON出力 |
--output PATH | デフォルトの出力ファイルパス(--output-<fmt> で上書き) |
--fail-on-findings | HIGH/CRITICALが見つかった場合にエラーで終了(--fail-on-severity high の短縮形) |
--fail-on-severity LEVEL | LEVEL以上の検出結果が存在する場合にエラーで終了(critical、high、medium、low、info) |
--custom-rules PATH | ディレクトリからカスタムYARAルールを使用 |
--taxonomy PATH | この実行用にカスタム分類法プロファイル(JSON/YAML)を読み込み |
--threat-mapping PATH | この実行用にカスタムスキャナ脅威マッピングプロファイル(JSON)を読み込み |
--lenient | 不正なスキルを許容(不正なフィールドを強制変換、デフォルトを埋める)。SKILL.md がない場合は、ディレクトリ内の .md ファイルのスキャンにフォールバック |
--skill-file FILENAME | SKILL.md の代わりに使用するカスタムメタデータファイル名(例: README.md) |
--check-overlap | (scan-all)スキル間の説明重複チェックを有効化 |
| コマンド | 説明 |
|---|---|
| (コマンドなし) | 対話型スキャンウィザードを起動(ターミナルで実行時) |
interactive | 対話型スキャンウィザードを起動(明示的) |
scan | 単一のスキルディレクトリをスキャン |
scan-all | 複数のスキルをスキャン(--recursive、--check-overlap 付き) |
generate-policy | カスタマイズ用のスキャンポリシーYAMLを生成 |
configure-policy | カスタムスキャンポリシーを構築/編集する対話型TUI(--input 対応) |
list-analyzers | 利用可能なアナライザを表示 |
validate-rules | ルールシグネチャを検証(--rules-file 対応) |
出力例
$ skill-scanner scan ./my-skill --use-behavioral
============================================================
Skill: my-skill
============================================================
Status: [OK] No findings
Max Severity: NONE
Total Findings: 0
Scan Duration: 0.15s
注: 「No findings」は、スキャナが既知の脅威パターンを検出しなかったことを意味します。スキルがすべてのリスクから解放されていることを保証するものではありません。適用範囲と制限を参照してください。
GitHub Actions
再利用可能なワークフローを使用して、プッシュまたはPRのたびにスキルを自動スキャンします:
# .github/workflows/scan-skills.yml
name: Scan Skills
on:
pull_request:
paths: [".cursor/skills/**"]
jobs:
scan:
uses: cisco-ai-defense/skill-scanner/.github/workflows/scan-skills.yml@main
with:
skill_path: .cursor/skills
permissions:
security-events: write
contents: read
結果は、GitHub Code Scanning を介してPRにインライン注釈として表示されます。LLM統合、シークレット設定、ブランチ保護の設定については、完全なガイドを参照してください。
Pre-commit フック
pre-commit フレームワークを使用して、コミットのたびにスキルをスキャンします:
# .pre-commit-config.yaml
repos:
- repo: https://github.com/cisco-ai-defense/skill-scanner
rev: v1.0.0 # 最新のリリースタグを使用
hooks:
- id: skill-scanner
または、組み込みフックを直接インストール:
skill-scanner-pre-commit --install
フックは変更されたファイルを最も近い SKILL.md にマッピングし、影響を受ける各スキルを1回スキャンします。通常のコミット中は、ステージングされた差分を読み取ります。CIでは、ステージングインデックスが不要なように2つのリビジョンを比較します:
pre-commit run skill-scanner --from-ref "$BASE_SHA" --to-ref "$HEAD_SHA"
両方のリビジョンがチェックアウトに存在する必要があります。設定されたすべてのスキルをスキャンするには、フックを直接呼び出します:
skill-scanner-pre-commit --scan-all
または、.pre-commit-config.yaml でフックに args: [--scan-all] を設定します。
コントリビューション
コントリビューションを歓迎します!ガイドラインについては CONTRIBUTING.md を参照してください。
ライセンス
Apache 2.0 - 詳細は LICENSE を参照してください。
Copyright 2026 Cisco Systems, Inc. and its affiliates