返回更新列表
新发布Sep 4, 2026

skill-scanner v2.0.14

代理技能的安全扫描器

分享

Skill Scanner

License Python 3.10+ PyPI version CI Discord Cisco AI Defense AI Security Framework Ask DeepWiki

一款针对 AI Agent Skills 的尽力而为型安全扫描器,可检测提示注入、数据外泄和恶意代码模式。它结合了基于模式的检测(YAML + YARA)、LLM 作为评判者以及行为数据流分析,在最大限度提高对潜在威胁的检测覆盖率的同时,尽量减少误报。

重要提示: 本扫描器提供的是尽力而为的检测,并非全面或完整的覆盖。扫描未返回任何发现,并不保证该 skill 不存在任何威胁。请参阅下方的范围与局限性

支持遵循 Agent Skills 规范OpenAI Codex SkillsCursor 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 目前接受 anthropicopenai。对于 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")

安全分析器

分析器检测方法范围要求
StaticYAML + YARA 模式所有文件
Bytecode.pyc 完整性验证Python 字节码
Pipeline命令污点分析Shell 管道
BehavioralAST 数据流分析Python 文件
LLM语义分析SKILL.md + 脚本API 密钥
Meta误报过滤所有发现API 密钥
VirusTotal基于哈希的恶意软件检测二进制文件API 密钥
AI Defense基于云的 AI文本内容API 密钥

CLI 选项

选项描述
--policy扫描策略:预设名称(strictbalancedpermissive)或自定义 YAML 的路径
--use-behavioral启用行为分析器(数据流分析)
--use-llm启用 LLM 分析器(需要 API 密钥)
--llm-provider用于 CLI 路由的 LLM 提供商:anthropicopenai
--llm-consensus-runs N运行 LLM 分析 N 次,保留多数一致的发现,并保留其观测到的最高严重性
--llm-max-tokens NLLM 响应的最大输出 token 数(默认:8192)
--llm-reasoning-effort LEVEL可选的推理深度(disabledminimallowmediumhighxhighmax);未设置则保留提供商默认值
--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输出:summaryjsonmarkdowntablesarifhtmlhtml 格式会生成自包含的交互式报告,包含可折叠的关联组、可展开的代码片段以及管道污点流图
--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-overlapscan-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


GitHubDiscordPyPI

分类