SkillSpector
Claude Code や Codex CLI などが読み込むエージェントスキルを、インストール前にスキャンする NVIDIA 製セキュリティツール。LangGraph 上で静的解析と LLM 意味解析を組み合わせ、「このスキルは安全か?」に答える。
エージェントスキルは暗黙の信頼のもと実行されるが、大規模調査(Liu et al., 2026)では 42,447 スキル中 26.1% に脆弱性、5.2% に悪意の可能性が報告されている。実行可能スクリプトを含むスキルは脆弱性リスクが 2.12 倍。
出典: NVIDIA/skillspector の README.md
Stage 1: 正規表現・AST・YARA・OSV.dev による高速静的解析(高リコール)。
Stage 2: 任意の LLM 意味解析で偽陽性を除去し、説明付きフィードバック(精度 ~87%)。
graph.py と analyzer ノード群に集約される。
入力解決からレポート生成まで、LangGraph の StateGraph で直列+並列を組み合わせる。build_context の後、20 個の analyzer ノードが並列実行され、結果を meta_analyzer が集約する。
flowchart TD
START([START]) --> resolve["resolve_input\nGit / URL / zip / dir"]
resolve --> build["build_context\nファイル収集・正規化"]
build --> static["Static analyzers\n11 regex + YARA + AST"]
build --> behavioral["Behavioral\nAST + taint tracking"]
build --> mcp["MCP analyzers\nleast privilege / poisoning"]
build --> semantic["Semantic LLM\nintent / quality / discovery"]
static --> meta["meta_analyzer\nフィルタ・スコア集約"]
behavioral --> meta
mcp --> meta
semantic --> meta
meta --> report["report\nterminal / JSON / MD / SARIF"]
report --> END([END])
主要ノード
| ノード | 役割 |
|---|---|
resolve_input | Git URL・zip・ディレクトリ・単一 SKILL.md をワークスペースに展開 |
build_context | スキル内ファイル一覧・メタデータ・実行可能フラグを構築 |
static_patterns_* | 11 カテゴリの正規表現ベース静的パターン(prompt injection, exfiltration 等) |
behavioral_ast | exec / eval / subprocess 等の危険呼び出しを AST 解析 |
behavioral_taint_tracking | ソースからシンクへのデータフロー追跡 |
mcp_* | MCP ツールの権限宣言不一致・メタデータ毒化を検出 |
semantic_* | LLM による開発者意図・品質ポリシー・セキュリティ発見の意味評価 |
meta_analyzer | 全 analyzer の findings を統合・重複除去・LLM フィルタ |
report | リスクスコア計算と出力フォーマット生成 |
パターン ID は skillspector patterns で一覧表示できる。代表的なカテゴリを以下にまとめる(各カテゴリ内に複数ルール)。
uv venv .venv → activate → make installskillspector scan ./my-skill/# ローカルディレクトリ
skillspector scan ./my-skill/
# Git リポジトリ
skillspector scan https://github.com/user/my-skill
# 静的解析のみ(高速)
skillspector scan ./my-skill/ --no-llm
# JSON レポート出力
skillspector scan ./my-skill/ --format json --output report.json
対応入力形式
- ローカルディレクトリ(スキルバンドル全体)
- 単一
SKILL.mdファイル - Git リポジトリ URL
- ファイル URL・zip アーカイブ
主な CLI オプション
| オプション | 説明 |
|---|---|
-f, --format | terminal(既定)| json | markdown | sarif |
-o, --output | 出力ファイルパス(省略時は stdout) |
--no-llm | LLM 意味解析をスキップ(静的解析のみ) |
--yara-rules-dir | 追加 YARA ルール(.yar / .yara)のディレクトリ |
-V, --verbose | 詳細ログ(DEBUG レベル) |
検出された issue の重大度に基づき 0–100 のスコアを算出。実行可能スクリプトがある場合は 1.3 倍の乗数が適用される。
| 重大度 | 加点 | スコア帯 | 推奨 |
|---|---|---|---|
| CRITICAL | +50 | 81–100 | DO NOT INSTALL |
| HIGH | +25 | 51–80 | DO NOT INSTALL |
| MEDIUM | +10 | 21–50 | CAUTION |
| LOW | +5 | 0–20 | SAFE |
ターミナル出力には各 finding の場所(ファイル:行)、信頼度、LLM による説明文が含まれる。
SKILLSPECTOR_PROVIDER でプロバイダを選択。各プロバイダは model_registry.yaml を同梱し、デフォルトモデルを持つ。Ollama など OpenAI 互換エンドポイントも OPENAI_BASE_URL で指定可能。
| Provider | 認証 env | デフォルトモデル |
|---|---|---|
openai | OPENAI_API_KEY | gpt-5.4 |
anthropic | ANTHROPIC_API_KEY | claude-opus-4-6 |
nv_build | NVIDIA_INFERENCE_KEY | deepseek-ai/deepseek-v4-flash |
export SKILLSPECTOR_PROVIDER=openai
export OPENAI_API_KEY=ollama
export OPENAI_BASE_URL=http://localhost:11434/v1
export SKILLSPECTOR_MODEL=llama3.1:8b
skillspector scan ./my-skill/
Python API
from skillspector import graph
result = graph.invoke({
"input_path": "/path/to/skill",
"output_format": "json",
"use_llm": True,
})
print(result["risk_score"], result["risk_recommendation"])
| 形式 | 用途 |
|---|---|
terminal | 対話的レビュー(Rich による整形表示) |
json | プログラム連携・ダッシュボード取り込み |
markdown | ドキュメント・PR コメントへの貼り付け |
sarif | CI/CD・IDE 統合(GitHub Code Scanning 等) |
既知の制限
- 非英語コンテンツのパターン検出精度が低下する可能性
- 画像内テキスト・暗号化/バイナリコードは解析不可
- 静的解析のみ — 実行時挙動は観測しない
- オフライン環境では SC4 が静的フォールバックリストに限定
- GitHub: NVIDIA/skillspector — 本体リポジトリ(Apache 2.0)
- OSV.dev — SC4 のライブ脆弱性データベース
- GitHub Issues — バグ報告・機能要望
内部参照: docs/DEVELOPMENT.md · docs/LLM_ANALYZER_BASE_GUIDE.md · docs/B.3.1-mcp-least-privilege.md