SkillSpector

Claude Code や Codex CLI などが読み込むエージェントスキルを、インストール前にスキャンする NVIDIA 製セキュリティツール。LangGraph 上で静的解析と LLM 意味解析を組み合わせ、「このスキルは安全か?」に答える。

1 — 概要

エージェントスキルは暗黙の信頼のもと実行されるが、大規模調査(Liu et al., 2026)では 42,447 スキル中 26.1% に脆弱性、5.2% に悪意の可能性が報告されている。実行可能スクリプトを含むスキルは脆弱性リスクが 2.12 倍。

64vulnerability patterns
16categories
20analyzer nodes
4output formats

出典: NVIDIA/skillspector の README.md

Stage 1: 正規表現・AST・YARA・OSV.dev による高速静的解析(高リコール)。

Stage 2: 任意の LLM 意味解析で偽陽性を除去し、説明付きフィードバック(精度 ~87%)。

設計原則: CLI は LangGraph ワークフローの薄いラッパー。ビジネスロジックは graph.py と analyzer ノード群に集約される。
2 — 解析パイプライン

入力解決からレポート生成まで、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_inputGit URL・zip・ディレクトリ・単一 SKILL.md をワークスペースに展開
build_contextスキル内ファイル一覧・メタデータ・実行可能フラグを構築
static_patterns_*11 カテゴリの正規表現ベース静的パターン(prompt injection, exfiltration 等)
behavioral_astexec / eval / subprocess 等の危険呼び出しを AST 解析
behavioral_taint_trackingソースからシンクへのデータフロー追跡
mcp_*MCP ツールの権限宣言不一致・メタデータ毒化を検出
semantic_*LLM による開発者意図・品質ポリシー・セキュリティ発見の意味評価
meta_analyzer全 analyzer の findings を統合・重複除去・LLM フィルタ
reportリスクスコア計算と出力フォーマット生成
3 — 検出カテゴリ

パターン ID は skillspector patterns で一覧表示できる。代表的なカテゴリを以下にまとめる(各カテゴリ内に複数ルール)。

Prompt Injection
5 patterns · P1–P5
Data Exfiltration
4 patterns · E1–E4
Privilege Escalation
3 patterns · PE1–PE3
Supply Chain
6 patterns · SC1–SC6
Excessive Agency
4 patterns · EA1–EA4
Output Handling
3 patterns · OH1–OH3
System Prompt Leakage
3 patterns · P6–P8
Memory Poisoning
3 patterns · MP1–MP3
Tool Misuse
3 patterns · TM1–TM3
Rogue Agent
2 patterns · RA1–RA2
Trigger Abuse
3 patterns · TR1–TR3
Behavioral AST
8 patterns · AST1–AST8
Taint Tracking
5 patterns · TT1–TT5
YARA Signatures
4 patterns · YR1–YR4
MCP Least Privilege
4 patterns · LP1–LP4
MCP Tool Poisoning
4 patterns · TP1–TP4
SC4 — Live OSV lookup: 依存関係を OSV.dev API でリアルタイム照合。オフライン時は組み込みフォールバックリストに切り替わる。API キー不要。
4 — CLI と入力形式
1
Install
uv venv .venv → activate → make install
2
Scan local
skillspector scan ./my-skill/
3
Scan remote
Git URL や zip も直接指定可能
4
Review report
スコア > 50 で exit code 1(CI 連携向け)
bash — 代表的なコマンド
# ローカルディレクトリ
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, --formatterminal(既定)| json | markdown | sarif
-o, --output出力ファイルパス(省略時は stdout)
--no-llmLLM 意味解析をスキップ(静的解析のみ)
--yara-rules-dir追加 YARA ルール(.yar / .yara)のディレクトリ
-V, --verbose詳細ログ(DEBUG レベル)
5 — リスクスコア

検出された issue の重大度に基づき 0–100 のスコアを算出。実行可能スクリプトがある場合は 1.3 倍の乗数が適用される。

重大度加点スコア帯推奨
CRITICAL+5081–100DO NOT INSTALL
HIGH+2551–80DO NOT INSTALL
MEDIUM+1021–50CAUTION
LOW+50–20SAFE

ターミナル出力には各 finding の場所(ファイル:行)、信頼度、LLM による説明文が含まれる。

6 — LLM 連携

SKILLSPECTOR_PROVIDER でプロバイダを選択。各プロバイダは model_registry.yaml を同梱し、デフォルトモデルを持つ。Ollama など OpenAI 互換エンドポイントも OPENAI_BASE_URL で指定可能。

Provider認証 envデフォルトモデル
openaiOPENAI_API_KEYgpt-5.4
anthropicANTHROPIC_API_KEYclaude-opus-4-6
nv_buildNVIDIA_INFERENCE_KEYdeepseek-ai/deepseek-v4-flash
bash — ローカル Ollama 例
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/
Anti-jailbreak: LLM 解析プロンプトには、悪意スキルが解析自体を操作するのを防ぐ保護が組み込まれている。

Python API

python
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"])
7 — 出力形式と制限
形式用途
terminal対話的レビュー(Rich による整形表示)
jsonプログラム連携・ダッシュボード取り込み
markdownドキュメント・PR コメントへの貼り付け
sarifCI/CD・IDE 統合(GitHub Code Scanning 等)

既知の制限

  • 非英語コンテンツのパターン検出精度が低下する可能性
  • 画像内テキスト・暗号化/バイナリコードは解析不可
  • 静的解析のみ — 実行時挙動は観測しない
  • オフライン環境では SC4 が静的フォールバックリストに限定

内部参照: docs/DEVELOPMENT.md · docs/LLM_ANALYZER_BASE_GUIDE.md · docs/B.3.1-mcp-least-privilege.md