
skill-scanner v2.0.14
代理技能的安全扫描器
Skill Scanner
一款针对 AI Agent Skills 的尽力而为型安全扫描器,可检测提示注入、数据外泄和恶意代码模式。它结合了基于模式的检测(YAML + YARA)、LLM 作为评判者以及行为数据流分析,在最大限度提高对潜在威胁的检测覆盖率的同时,尽量减少误报。
重要提示: 本扫描器提供的是尽力而为的检测,并非全面或完整的覆盖。扫描未返回任何发现,并不保证该 skill 不存在任何威胁。请参阅下方的范围与局限性。
支持遵循 Agent Skills 规范的 OpenAI Codex Skills 和 Cursor Agent Skills 格式。使用 --lenient 时,还可扫描非标准格式,例如 Claude Code 的 .claude/commands/*.md 以及扁平化的 markdown skill 仓库。
亮点
- 多引擎检测 - 静态分析、行为数据流、LLM 语义分析以及基于云的扫描,提供分层、尽力而为的覆盖
- 误报过滤 - 元分析器在保留检测能力的同时显著降低噪声
- CI/CD 就绪 - 支持用于 GitHub Code Scanning 的 SARIF 输出、可复用的 GitHub Actions 工作流、用于构建失败的退出码
- Pre-commit 钩子 - 集成标准 pre-commit 框架,在每次提交前扫描 skills
- 可扩展 - 插件架构,支持自定义分析器
加入 Cisco AI Discord,参与讨论、分享反馈或与团队交流。
范围与局限性
Skill Scanner 是一款检测工具。它能识别已知和潜在的风险模式,但并不能为安全性提供认证。
主要局限性:
- 无发现 ≠ 无风险。 扫描返回“无发现”表示未检测到任何已知威胁模式。它并不保证该 skill 是安全的、良性的或不存在漏洞。
- 覆盖范围本质上是不完整的。 本扫描器结合了基于签名的检测、基于 LLM 的语义分析、行为数据流分析、可选的云服务以及可配置的规则包。尽管这种方法提高了覆盖率,但没有任何自动化工具能够检测出所有技术,尤其是新型或零日攻击。
- 可能出现误报和漏报。 共识模式和元分析可降低噪声,但没有任何配置能消除所有错误分类。请根据您的风险容忍度调整扫描策略。
- 人工审查仍然必不可少。 自动化扫描是纵深防御策略的一个组成部分。高风险或生产环境部署应将扫描器结果与人工代码审查和/或威胁建模相结合。
文档
| 指南 | 描述 |
|---|---|
| 快速开始 | 5 分钟快速上手 |
| 架构 | 系统设计与组件 |
| 威胁分类法 | 完整的 AITech 威胁分类法及示例 |
| LLM 分析器 | LLM 配置与使用 |
| 元分析器 | 误报过滤与优先级排序 |
| 行为分析器 | 数据流分析详情 |
| 扫描策略 | 自定义策略、预设与调优指南 |
| 策略快速参考 | 策略各节与可调项的简明参考 |
| 规则编写 | 如何添加签名、YARA 和 Python 规则 |
| GitHub Actions | 用于 CI/CD 集成的可复用工作流 |
| API 参考 | REST API 文档 |
| 开发指南 | 贡献与开发环境搭建 |
安装
前置条件: 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"
# Optional: disabled, minimal, low, medium, high, xhigh, or max
export SKILL_SCANNER_LLM_REASONING_EFFORT="low"
# 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 提供商说明: --llm-provider 目前接受 anthropic 或 openai。对于 Bedrock、Vertex、Azure、Gemini 及其他 LiteLLM 后端,请设置特定于提供商的模型字符串和环境变量(参见 LLM 分析器文档)。
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 | 命令污点分析 | Shell 管道 | 无 |
| 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 响应的最大输出 token 数(默认: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 | 容忍格式错误的 skills(强制转换错误字段、填充默认值)而非失败。当 SKILL.md 不存在时,回退为扫描目录中的 .md 文件 |
--skill-file FILENAME | 用于替代 SKILL.md 的自定义元数据文件名(例如 README.md) |
--check-overlap | (scan-all)启用跨 skill 描述重叠检查 |
| 命令 | 描述 |
|---|---|
| (无命令) | 启动交互式扫描向导(在终端中运行时) |
interactive | 启动交互式扫描向导(显式) |
scan | 扫描单个 skill 目录 |
scan-all | 扫描多个 skills(配合 --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
注意: “无发现”意味着扫描器未检测到任何已知威胁模式——这并不保证该 skill 不存在任何风险。请参阅范围与局限性。
GitHub Actions
使用可复用工作流在每次推送或 PR 时自动扫描 skills:
# .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 框架在每次提交前扫描 skills:
# .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
该钩子会将变更文件映射到最近的 SKILL.md,并对每个受影响的 skill 扫描一次。在正常提交期间,它读取暂存的 diff。在 CI 中,比较两个修订版本,这样就不需要暂存索引:
pre-commit run skill-scanner --from-ref "$BASE_SHA" --to-ref "$HEAD_SHA"
两个修订版本都必须存在于检出中。要扫描所有已配置的 skills,请直接调用该钩子:
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