Security Scanner for Agent Skills
一种尽力而为的 AI 代理技能安全扫描器,可检测提示注入、数据泄露和恶意代码模式。结合了基于模式的检测 (YAML + YARA)、LLM 作为评判以及行为数据流分析,以最大化对可能威胁的检测覆盖率,同时最小化误报。
重要提示: 此扫描器提供尽力而为的检测,而非全面或完整的覆盖。未返回任何发现的扫描并不保证技能完全免受所有威胁。请参阅下方的范围与限制。
支持 OpenAI Codex Skills 和 Cursor Agent Skills 格式,遵循 Agent Skills 规范。使用 --lenient 时,还可扫描非标准格式,如 Claude Code .claude/commands/*.md 和纯 Markdown 技能仓库。
加入 Cisco AI Discord 讨论、分享反馈或与团队联系。
技能扫描器是一个检测工具。它可以识别已知和可能的风险模式,但不对安全性做出认证。
关键限制:
前提条件: Python 3.10+ 和 uv(推荐)或 pip
# 使用 uv(推荐)
uv pip install cisco-ai-skill-scanner
# 使用 pip
pip install cisco-ai-skill-scanner
# AWS Bedrock 支持
pip install cisco-ai-skill-scanner[bedrock]
# Google AI Studio / Gemini 支持
pip install cisco-ai-skill-scanner[google]
# Google Vertex AI 支持
pip install cisco-ai-skill-scanner[vertex]
# Azure OpenAI 支持
pip install cisco-ai-skill-scanner[azure]
# 所有云提供商
pip install cisco-ai-skill-scanner[all]
# 用于 LLM 分析器和元分析器
export SKILL_SCANNER_LLM_API_KEY="your_api_key"
export SKILL_SCANNER_LLM_MODEL="claude-3-5-sonnet-20241022"
# 用于 VirusTotal 二进制扫描
export VIRUSTOTAL_API_KEY="your_virustotal_api_key"
# 用于 Cisco AI Defense
export AI_DEFENSE_API_KEY="your_aidefense_api_key"
不确定使用哪些标志?不带参数运行 skill-scanner 即可启动交互式向导:
skill-scanner
该向导会引导您选择扫描目标、分析器、策略和输出格式,然后在运行之前显示组装好的命令。非常适合学习 CLI。
# 扫描单个技能(核心分析器:静态 + 字节码 + 流水线)
skill-scanner scan /path/to/skill
# 使用行为分析器进行扫描(数据流分析)
skill-scanner scan /path/to/skill --use-behavioral
# 使用所有引擎进行扫描
skill-scanner scan /path/to/skill --use-behavioral --use-llm --use-aidefense
# 使用元分析器进行误报过滤
skill-scanner scan /path/to/skill --use-llm --enable-meta
# 使用触发分析器检查模糊描述
skill-scanner scan /path/to/skill --use-trigger
# 多次运行 LLM 分析器并保留多数同意的发现
skill-scanner scan /path/to/skill --use-llm --llm-consensus-runs 3
# 递归扫描多个技能
skill-scanner scan-all /path/to/skills --recursive --use-behavioral
# 使用跨技能重叠检测扫描多个技能
skill-scanner scan-all /path/to/skills --recursive --check-overlap
# 扫描 GitHub 仓库(owner/repo 简写或完整 URL)
skill-scanner scan-repo owner/repo
skill-scanner scan-repo https://github.com/owner/repo --use-llm
# 宽松模式:容忍格式错误的技能,而不是失败
skill-scanner scan /path/to/skill --lenient
skill-scanner scan-all /path/to/skills --recursive --lenient
# 宽松模式,配合非标准技能格式(不需要 SKILL.md)
skill-scanner scan .claude/commands/deploy --lenient
skill-scanner scan-all .claude/commands --recursive --lenient
# 使用自定义元数据文件名而不是 SKILL.md
skill-scanner scan /path/to/skill --skill-file README.md
# CI/CD:如果发现威胁则构建失败
skill-scanner scan-all ./skills --fail-on-severity high --format sarif --output results.sarif
# 生成带有攻击关联分组的交互式 HTML 报告
skill-scanner scan /path/to/skill --use-llm --enable-meta --format html --output report.html
# 使用自定义 YARA 规则
skill-scanner scan /path/to/skill --custom-rules /path/to/my-rules/
# 使用自定义分类 + 威胁映射配置文件(JSON/YAML)
skill-scanner scan /path/to/skill --taxonomy /path/to/taxonomy.json --threat-mapping /path/to/threat_mapping.json
# VirusTotal 哈希扫描,可选上传未知文件
skill-scanner scan /path/to/skill --use-virustotal --vt-upload-files
# 使用扫描策略预设(strict, balanced, permissive)
skill-scanner scan /path/to/skill --policy strict
# 使用自定义组织策略文件
skill-scanner scan /path/to/skill --policy my_org_policy.yaml
# 生成一个可自定义的策略文件
skill-scanner generate-policy -o my_org_policy.yaml
# 交互式策略配置器(TUI)
skill-scanner configure-policy
LLM 提供商说明: --llm-provider 当前接受 anthropic 或 openai。
对于 Bedrock、Vertex、Azure、Gemini 以及其他 LiteLLM 后端,请设置提供商特定的模型字符串和环境变量(参见 LLM 分析器文档)。
from skill_scanner import SkillScanner
from skill_scanner.core.analyzers import BehavioralAnalyzer
# 使用分析器创建扫描器
scanner = SkillScanner(analyzers=[
BehavioralAnalyzer(),
])
# 扫描一个技能
result = scanner.scan_skill("/path/to/skill")
print(f"发现: {len(result.findings)}")
print(f"最高严重等级: {result.max_severity}")
# 注意:is_safe 表示未检测到 HIGH/CRITICAL 发现。
# 它不能保证技能完全安全,没有风险。
if not result.is_safe:
print("检测到问题——部署前请审查发现")
$ skill-scanner scan ./my-skill --use-behavioral
============================================================
技能: my-skill
============================================================
状态: [OK] 未发现
最高严重等级: NONE
发现总数: 0
扫描耗时: 0.15s
注意: “未发现”表示扫描器未检测到任何已知威胁模式——并不保证技能完全安全、无风险。请参阅范围与限制。
使用可复用工作流在每次推送或 PR 时自动扫描技能:
# .github/workflows/scan-skills.yml
name: 扫描技能
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-config.yaml
repos:
- repo: https://github.com/cisco-ai-defense/skill-scanner
rev: v1.0.0 # 使用最新发布标签
hooks:
- id: skill-scanner
或者直接安装内置钩子:
skill-scanner-pre-commit install
该钩子自动检测哪些技能目录有暂存的更改,并只扫描这些目录,保持提交速度快。使用 --all 扫描所有内容。
我们欢迎贡献!请参阅 CONTRIBUTING.md 了解指南。
Apache 2.0 - 详情请见 LICENSE。
Copyright 2026 Cisco Systems, Inc. and its affiliates
| 指南 | 描述 |
|---|
| 快速入门 | 5 分钟内上手 |
| 架构 | 系统设计与组件 |
| 威胁分类 | 完整的 AITech 威胁分类及示例 |
| LLM 分析器 | LLM 配置与使用 |
| 元分析器 | 误报过滤与优先级排序 |
| 行为分析器 | 数据流分析详情 |
| 扫描策略 | 自定义策略、预设及调优指南 |
| 策略快速参考 | 策略章节与旋钮的紧凑参考 |
| 规则编写 | 如何添加签名、YARA 和 Python 规则 |
| GitHub Actions | 用于 CI/CD 集成的可复用工作流 |
| API 参考 | REST API 文档 |
| 开发指南 | 贡献与开发环境搭建 |
| 分析器 | 检测方法 | 范围 | 要求 |
|---|
| 静态 | YAML + YARA 模式 | 所有文件 | 无 |
| 字节码 | .pyc 完整性验证 | Python 字节码 | 无 |
| 流水线 | 命令污染分析 | Shell 流水线 | 无 |
| 行为 | AST 数据流分析 | Python 文件 | 无 |
| LLM | 语义分析 | SKILL.md + 脚本 | API 密钥 |
| 元 | 误报过滤 | 所有发现 | API 密钥 |
| VirusTotal | 基于哈希的恶意软件 | 二进制文件 | API 密钥 |
| AI Defense | 基于云的 AI | 文本内容 | API 密钥 |
| 选项 | 描述 |
|---|
--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 响应的最大输出令牌数(默认: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 | 包含每个发现的策略指纹、共现元数据,并保留元分析器误报 |
--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 | 容忍格式错误的技能(强制转换错误字段、填充默认值)而不是失败。当 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) |