
skill-scanner v2.0.13
エージェントスキル向けセキュリティスキャナー
Skill Scanner
AIエージェントスキル向けのベストエフォート型セキュリティスキャナで、プロンプトインジェクション、データ外部送信、悪意のあるコードパターンを検出します。パターンベース検出(YAML + YARA)、LLM-as-a-judge、ビヘイビアデータフロー解析を組み合わせることで、可能性のある脅威の検出カバレッジを最大化しつつ、誤検知を最小限に抑えます。
重要: このスキャナはベストエフォート型の検出を提供するものであり、包括的または完全なカバレッジを提供するものではありません。findings(検出結果)が返らないスキャンでも、スキルがすべての脅威から解放されていることを保証するものではありません。下記の対象範囲と制限事項を参照してください。
Agent Skills仕様に準拠したOpenAI Codex SkillsおよびCursor 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は検出ツールです。既知および可能性のあるリスクパターンを特定しますが、セキュリティを保証するものではありません。
主な制限事項:
- findingsなし ≠ リスクなし。 "No findings"(検出なし)を返すスキャンは、既知の脅威パターンが検出されなかったことを示します。スキルが安全、無害、または脆弱性がないことを保証するものではありません。
- カバレッジは本質的に不完全です。 このスキャナは、シグネチャベースの検出、LLMベースのセマンティック解析、ビヘイビアデータフロー解析、オプションのクラウドサービス、設定可能なルールパックを組み合わせています。このアプローチによりカバレッジは向上しますが、特に新規の攻撃やゼロデイ攻撃など、あらゆる手法を検出できる自動ツールはありません。
- 誤検知(false positive)と見逃し(false negative)が発生する可能性があります。 コンセンサスモードとメタ解析によってノイズは低減しますが、誤った分類を完全に排除できる設定はありません。スキャンポリシーをリスク許容度に合わせて調整してください。
- 人間によるレビューは引き続き不可欠です。 自動スキャンは多層防御戦略の一要素です。高リスク環境や本番環境へのデプロイでは、スキャナの結果に手動コードレビューや脅威モデリングを組み合わせてください。
ドキュメント
| ガイド | 説明 |
|---|---|
| Quick Start | 5分で始める |
| Architecture | システム設計とコンポーネント |
| Threat Taxonomy | 例付きの完全なAITech脅威分類 |
| LLM Analyzer | LLMの設定と使用方法 |
| Meta-Analyzer | 誤検知のフィルタリングと優先順位付け |
| Behavioral Analyzer | データフロー解析の詳細 |
| Scan Policy | カスタムポリシー、プリセット、チューニングガイド |
| Policy Quick Reference | ポリシーのセクションと設定項目のコンパクトなリファレンス |
| Rule Authoring | シグネチャ、YARA、Pythonルールの追加方法 |
| GitHub Actions | CI/CD統合用の再利用可能なワークフロー |
| API Reference | REST APIドキュメント |
| Development Guide | コントリビューションと開発環境のセットアップ |
インストール
前提条件: Python 3.10以上とuv(推奨)またはpip
# Using uv (recommended)
uv pip install cisco-ai-skill-scanner
# Using pip
pip install cisco-ai-skill-scanner
クラウドプロバイダー追加オプション
# AWS Bedrock support
pip install cisco-ai-skill-scanner[bedrock]
# Google AI Studio / Gemini support
pip install cisco-ai-skill-scanner[google]
# Google Vertex AI support
pip install cisco-ai-skill-scanner[vertex]
# Azure OpenAI support
pip install cisco-ai-skill-scanner[azure]
# All cloud providers
pip install cisco-ai-skill-scanner[all]
クイックスタート
環境設定(オプション)
# For LLM analyzer and Meta-analyzer
export SKILL_SCANNER_LLM_API_KEY="your_api_key"
export SKILL_SCANNER_LLM_MODEL="claude-3-5-sonnet-20241022"
# For VirusTotal binary scanning
export VIRUSTOTAL_API_KEY="your_virustotal_api_key"
# For Cisco AI Defense
export AI_DEFENSE_API_KEY="your_aidefense_api_key"
対話型ウィザード
どのフラグを使えばよいか迷っていますか?引数なしでskill-scannerを実行すると、対話型ウィザードが起動します:
skill-scanner
ウィザードでは、スキャン対象、アナライザ、ポリシー、出力形式の選択を順に案内し、実行前に組み立てたコマンドを表示します。CLIの学習に最適です。
CLIの使用方法
# Scan a single skill (core analyzers: static + bytecode + pipeline)
skill-scanner scan /path/to/skill
# Scan with behavioral analyzer (dataflow analysis)
skill-scanner scan /path/to/skill --use-behavioral
# Scan with all engines
skill-scanner scan /path/to/skill --use-behavioral --use-llm --use-aidefense
# Scan with meta-analyzer for false positive filtering
skill-scanner scan /path/to/skill --use-llm --enable-meta
# Scan with trigger analyzer for vague description checks
skill-scanner scan /path/to/skill --use-trigger
# Run LLM analyzer multiple times and keep majority-agreed findings
skill-scanner scan /path/to/skill --use-llm --llm-consensus-runs 3
# Scan multiple skills recursively
skill-scanner scan-all /path/to/skills --recursive --use-behavioral
# Scan multiple skills with cross-skill overlap detection
skill-scanner scan-all /path/to/skills --recursive --check-overlap
# Scan a GitHub repository (owner/repo shorthand or full URL)
skill-scanner scan-repo owner/repo
skill-scanner scan-repo https://github.com/owner/repo --use-llm
# Lenient mode: tolerate malformed skills instead of failing
skill-scanner scan /path/to/skill --lenient
skill-scanner scan-all /path/to/skills --recursive --lenient
# Lenient mode with non-standard skill formats (no SKILL.md required)
skill-scanner scan .claude/commands/deploy --lenient
skill-scanner scan-all .claude/commands --recursive --lenient
# Use a custom metadata filename instead of SKILL.md
skill-scanner scan /path/to/skill --skill-file README.md
# CI/CD: Fail build if threats found
skill-scanner scan-all ./skills --fail-on-severity high --format sarif --output results.sarif
# Generate interactive HTML report with attack correlation groups
skill-scanner scan /path/to/skill --use-llm --enable-meta --format html --output report.html
# Use custom YARA rules
skill-scanner scan /path/to/skill --custom-rules /path/to/my-rules/
# Use custom taxonomy + threat mapping profiles (JSON/YAML)
skill-scanner scan /path/to/skill --taxonomy /path/to/taxonomy.json --threat-mapping /path/to/threat_mapping.json
# VirusTotal hash scan with optional unknown-file uploads
skill-scanner scan /path/to/skill --use-virustotal --vt-upload-files
# Use a scan policy preset (strict, balanced, permissive)
skill-scanner scan /path/to/skill --policy strict
# Use a custom org policy file
skill-scanner scan /path/to/skill --policy my_org_policy.yaml
# Generate a policy file to customise
skill-scanner generate-policy -o my_org_policy.yaml
# Interactive policy configurator (TUI)
skill-scanner configure-policy
LLMプロバイダーに関する注意: 現在--llm-providerはanthropicまたはopenaiを受け付けます。Bedrock、Vertex、Azure、Gemini、その他のLiteLLMバックエンドでは、プロバイダー固有のモデル文字列と環境変数を設定してください(LLM Analyzerのドキュメントを参照)。
Python SDK
from skill_scanner import SkillScanner
from skill_scanner.core.analyzers import BehavioralAnalyzer
# Create scanner with analyzers
scanner = SkillScanner(analyzers=[
BehavioralAnalyzer(),
])
# Scan a skill
result = scanner.scan_skill("/path/to/skill")
print(f"Findings: {len(result.findings)}")
print(f"Max severity: {result.max_severity}")
# Note: is_safe indicates no HIGH/CRITICAL findings were detected.
# It does not guarantee the skill is free of all risk.
if not result.is_safe:
print("Issues detected -- review findings before deployment")
セキュリティアナライザ
| アナライザ | 検出方法 | 対象 | 要件 |
|---|---|---|---|
| Static | YAML + YARAパターン | すべてのファイル | なし |
| Bytecode | .pyc整合性検証 | Pythonバイトコード | なし |
| Pipeline | コマンドtaint解析 | シェルパイプライン | なし |
| Behavioral | ASTデータフロー解析 | Pythonファイル | なし |
| LLM | セマンティック解析 | SKILL.md + スクリプト | APIキー |
| Meta | 誤検知フィルタリング | すべてのfindings | 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回実行し、多数決で同意されたfindingsのみを保持 |
--llm-max-tokens N | LLM応答の最大出力トークン数(デフォルト:8192) |
--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 | findingsごとのポリシーフィンガープリントと共起メタデータを含め、メタアナライザの誤検知を保持 |
--format | 出力形式:summary、json、markdown、table、sarif、html。html形式は、折りたたみ可能な相関グループ、展開可能なコードスニペット、パイプラインtaintフロー図を備えた自己完結型の対話式レポートを生成します |
--detailed | Markdown出力に詳細なfindingsを含める |
--compact | コンパクトなJSON出力 |
--output PATH | デフォルトの出力ファイルパス(--output-<fmt>で上書き) |
--fail-on-findings | HIGH/CRITICALが見つかった場合にエラー終了(--fail-on-severity highの短縮形) |
--fail-on-severity LEVEL | LEVEL以上のfindingsが存在する場合にエラー終了(critical、high、medium、low、info) |
--custom-rules PATH | ディレクトリからカスタムYARAルールを使用 |
--taxonomy PATH | この実行でカスタムtaxonomyプロファイル(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 # use the latest release tag
hooks:
- id: skill-scanner
または、内蔵フックを直接インストールします:
skill-scanner-pre-commit install
このフックは、ステージングされた変更のあるスキルディレクトリを自動的に検出し、それらのみをスキャンするため、コミット時間を高速に保てます。すべてをスキャンするには--allを使用してください。
コントリビューション
コントリビューションを歓迎します!ガイドラインについてはCONTRIBUTING.mdをご覧ください。
ライセンス
Apache 2.0 - 詳細はLICENSEを参照してください。
Copyright 2026 Cisco Systems, Inc. and its affiliates