专为AI agent技能设计的安全扫描工具,检测64种漏洞模式,覆盖提示注入、数据泄露、权限提升等16类风险。支持Git仓库、URL、目录等多种输入格式,提供两阶段分析(快速静态扫描+可选的LLM语义评估),并实时查询OSV.dev漏洞库。亮点在于针对AI agent生态的安全空白,填补了技能安装前的风险审查需求,尤其适合使用Claude Code、Codex CLI等工具的开发者。
SkillSpector
AI 智能体技能安全扫描器。 在安装智能体技能前检测漏洞、恶意模式和安全风险。

概述
AI 智能体技能(被 Claude Code、Codex CLI、Gemini CLI 等使用)在执行时带有隐式信任且缺乏审核。研究表明,26.1% 的技能包含漏洞,5.2% 的技能显示出恶意意图。
SkillSpector 帮助你回答:“这个技能安装安全吗?”
文档
- 开发指南 — 架构、包布局以及如何扩展分析器流水线。
特性
- 多格式输入:扫描 Git 仓库、URL、zip 文件、目录或单个文件
- 16 个类别共 64 种漏洞模式:提示注入(prompt injection)、数据外泄(data exfiltration)、权限提升(privilege escalation)、供应链(supply chain)、过度代理(excessive agency)、输出处理(output handling)、系统提示泄露(system prompt leakage)、内存投毒(memory poisoning)、工具滥用(tool misuse)、恶意智能体(rogue agent)、触发器滥用(trigger abuse)、危险代码(AST)、污点追踪(taint tracking)、YARA 签名(YARA signatures)、MCP 最小权限(MCP least privilege)和 MCP 工具投毒(MCP tool poisoning)
- 两阶段分析:快速静态分析 + 可选的 LLM 语义评估
- 实时漏洞查询:SC4 查询 OSV.dev 获取实时 CVE 数据,并自动离线回退
- 多种输出格式:终端、JSON、Markdown 和 SARIF 报告
- 风险评分:0–100 分,附带严重性标签和清晰建议
快速开始
安装
首先创建并激活虚拟环境(所有 make 目标假定虚拟环境已激活)。使用 uv 或 pip;Makefile 优先使用 uv,否则使用 pip。
# 克隆仓库
git clone https://github.com/NVIDIA/skillspector.git
cd skillspector
# 创建并激活虚拟环境
uv venv .venv && source .venv/bin/activate
# 或:python3 -m venv .venv && source .venv/bin/activate
# 安装用于生产使用
make install
# 或安装开发依赖
make install-dev
基本用法
# 扫描本地技能目录
skillspector scan ./my-skill/
# 扫描单个 SKILL.md 文件
skillspector scan ./SKILL.md
# 扫描 Git 仓库
skillspector scan https://github.com/user/my-skill
# 扫描 zip 文件
skillspector scan ./my-skill.zip
输出格式
# 终端输出(默认)— 格式化打印
skillspector scan ./my-skill/
# JSON 输出 — 机器可读
skillspector scan ./my-skill/ --format json --output report.json
# Markdown 输出 — 用于文档
skillspector scan ./my-skill/ --format markdown --output report.md
# SARIF 输出 — 用于 CI/CD 集成和 IDE 工具
skillspector scan ./my-skill/ --format sarif --output report.sarif
LLM 分析
为获得最佳结果,请配置一个兼容 OpenAI 的 LLM 端点用于语义分析。通过 SKILLSPECTOR_PROVIDER 选择提供商;每个提供商自带捆绑的默认模型。SkillSpector 也支持本地 OpenAI 兼容服务器(Ollama、vLLM、llama.cpp)和托管推理网关。
提供商 (SKILLSPECTOR_PROVIDER) |
凭证环境变量 |
端点 |
默认模型 |
openai |
OPENAI_API_KEY (+ 可选 OPENAI_BASE_URL) |
api.openai.com(或任意 OpenAI 兼容 URL) |
gpt-5.4 |
anthropic |
ANTHROPIC_API_KEY |
api.anthropic.com |
claude-opus-4-6 |
nv_build |
NVIDIA_INFERENCE_KEY |
build.nvidia.com |
deepseek-ai/deepseek-v4-flash |
# 标准 OpenAI
export SKILLSPECTOR_PROVIDER=openai
export OPENAI_API_KEY=sk-...
skillspector scan ./my-skill/
# Anthropic
export SKILLSPECTOR_PROVIDER=anthropic
export ANTHROPIC_API_KEY=sk-ant-...
skillspector scan ./my-skill/
# NVIDIA build.nvidia.com
export SKILLSPECTOR_PROVIDER=nv_build
export NVIDIA_INFERENCE_KEY=nvapi-...
skillspector scan ./my-skill/
# 本地 Ollama 或任意 OpenAI 兼容端点
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/
# 覆盖提供商的默认模型
export SKILLSPECTOR_MODEL=gpt-5.2
skillspector scan ./my-skill/
# 跳过 LLM 分析(更快,仅静态分析)
skillspector scan ./my-skill/ --no-llm
漏洞模式
SkillSpector 检测 16 个类别共 64 种漏洞模式:
Prompt Injection(提示注入,5 种模式)
| ID |
Pattern |
Severity |
Description |
| P1 |
Instruction Override |
HIGH |
命令忽略安全约束 |
| P2 |
Hidden Instructions |
HIGH |
注释/不可见文本中的恶意指令 |
| P3 |
Exfiltration Commands |
HIGH |
将上下文外部传输的指令 |
| P4 |
Behavior Manipulation |
MEDIUM |
调整智能体决策的微妙指令 |
| P5 |
Harmful Content |
CRITICAL |
可能导致人身伤害的指令 |
Data Exfiltration(数据外泄,4 种模式)
| ID |
Pattern |
Severity |
Description |
| E1 |
External Transmission |
MEDIUM |
向外部 URL 发送数据 |
| E2 |
Env Variable Harvesting |
HIGH |
收集 API 密钥和机密信息 |
| E3 |
File System Enumeration |
MEDIUM |
扫描目录查找敏感文件 |
| E4 |
Context Leakage |
HIGH |
将对话上下文外部传输 |
Privilege Escalation(权限提升,3 种模式)
| ID |
Pattern |
Severity |
Description |
| PE1 |
Excessive Permissions |
LOW |
请求超出声明功能的权限 |
| PE2 |
Sudo/Root Execution |
MEDIUM |
调用提升的系统权限 |
| PE3 |
Credential Access |
HIGH |
读取 SSH 密钥、令牌、密码 |
Supply Chain(供应链,6 种模式)
| ID |
Pattern |
Severity |
Description |
| SC1 |
Unpinned Dependencies |
LOW |
包没有版本约束 |
| SC2 |
External Script Fetching |
HIGH |
curl | bash 以及远程代码执行 |
| SC3 |
Obfuscated Code |
HIGH |
Base64/十六进制编码执行 |
| SC4 |
Known Vulnerable Dependencies |
HIGH |
具有已知 CVE 的依赖项(实时 OSV.dev 查询) |
| SC5 |
Abandoned Dependencies |
MEDIUM |
没有安全更新的未维护包 |
| SC6 |
Typosquatting |
HIGH |
与流行包相似的包名 |
Excessive Agency(过度代理,4 种模式)
| ID |
Pattern |
Severity |
Description |
| EA1 |
Unrestricted Tool Access |
HIGH |
无限制的工具访问,没有约束 |
| EA2 |
Autonomous Decision Making |
HIGH |
无人工参与的、高影响力的决策 |
| EA3 |
Scope Creep |
MEDIUM |
能力超出声明目的 |
| EA4 |
Unbounded Resource Access |
MEDIUM |
资源消耗没有速率限制或配额 |
Output Handling(输出处理,3 种模式)
| ID |
Pattern |
Severity |
Description |
| OH1 |
Unvalidated Output Injection |
HIGH |
模型输出未经清理直接使用 |
| OH2 |
Cross-Context Output |
MEDIUM |
输出跨越信任边界未经验证 |
| OH3 |
Unbounded Output |
MEDIUM |
输出大小或生成速率没有限制 |
System Prompt Leakage(系统提示泄露,3 种模式)
| ID |
Pattern |
Severity |
Description |
| P6 |
Direct Leakage |
HIGH |
暴露系统提示或内部规则的指令 |
| P7 |
Indirect Extraction |
MEDIUM |
通过改述、翻译或侧信道提取 |
| P8 |
Tool-Based Exfiltration |
HIGH |
通过文件写入或网络请求外泄系统提示 |
Memory Poisoning(内存投毒,3 种模式)
| ID |
Pattern |
Severity |
Description |
| MP1 |
Persistent Context Injection |
HIGH |
设计为跨交互持久存在的内容 |
| MP2 |
Context Window Stuffing |
MEDIUM |
填充内容挤走安全约束 |
| MP3 |
Memory Manipulation |
HIGH |
篡改智能体内存或存储状态 |
Tool Misuse(工具滥用,3 种模式)
| ID |
Pattern |
Severity |
Description |
| TM1 |
Tool Parameter Abuse |
HIGH |
构造参数以实现非预期行为(shell=True、--force) |
| TM2 |
Chaining Abuse |
HIGH |
绕过单项安全检查的工具链 |
| TM3 |
Unsafe Defaults |
MEDIUM |
过于宽松的默认值(禁用 TLS、无认证) |
Rogue Agent(恶意智能体,2 种模式)
| ID |
Pattern |
Severity |
Description |
| RA1 |
Self-Modification |
CRITICAL |
运行时修改自身代码或配置 |
| RA2 |
Session Persistence |
HIGH |
通过 cron 作业或启动脚本进行未授权持久化 |
Trigger Abuse(触发器滥用,3 种模式)
| ID |
Pattern |
Severity |
Description |
| TR1 |
Overly Broad Trigger |
MEDIUM |
匹配常用词的触发模式 |
| TR2 |
Shadow Command Trigger |
HIGH |
影射内置命令或其他技能的触发器 |
| TR3 |
Keyword Baiting Trigger |
MEDIUM |
设计为最大化激活的通用触发器 |
Behavioral AST(行为 AST,8 种模式)
| ID |
Pattern |
Severity |
Description |
| AST1 |
exec() Call |
CRITICAL |
直接 exec() 调用,允许任意代码执行 |
| AST2 |
eval() Call |
HIGH |
直接 eval() 调用,执行任意表达式 |
| AST3 |
Dynamic Import |
HIGH |
__import__() 运行时加载任意模块 |
| AST4 |
subprocess Call |
HIGH |
通过 subprocess 执行外部命令 |
| AST5 |
os.system / exec-family |
HIGH |
通过 os 模块执行 shell 命令 |
| AST6 |
compile() Call |
MEDIUM |
从字符串创建代码对象 |
| AST7 |
Dynamic getattr() |
MEDIUM |
使用非字面量名称进行任意属性访问 |
| AST8 |
Dangerous Execution Chain |
CRITICAL |
exec/eval 结合动态来源(网络、编码数据) |
Taint Tracking(污点追踪,5 种模式)
| ID |
Pattern |
Severity |
Description |
| TT1 |
Direct Taint Flow |
HIGH |
数据直接从源流向汇点,未经清理 |
| TT2 |
Variable-Mediated Taint Flow |
MEDIUM |
数据通过中间变量从源流向汇点 |
| TT3 |
Credential Exfiltration Chain |
CRITICAL |
凭证(环境变量、机密)流向网络输出汇点 |
| TT4 |
File Read to Network Exfiltration |
HIGH |
文件内容流向网络输出汇点 |
| TT5 |
External Input to Code Execution |
CRITICAL |
网络或用户输入流向 exec/eval/subprocess 汇点 |
YARA Signatures(YARA 签名,4 种模式)
| ID |
Pattern |
Severity |
Description |
| YR1 |
Malware Match |
CRITICAL |
YARA 规则匹配已知恶意软件签名 |
| YR2 |
Webshell Match |
CRITICAL |
YARA 规则匹配 webshell 模式 |
| YR3 |
Cryptominer Match |
HIGH |
YARA 规则匹配加密货币矿工迹象 |
| YR4 |
Hack Tool / Exploit Match |
HIGH |
YARA 规则匹配黑客工具或利用代码 |
MCP Least Privilege(MCP 最小权限,4 种模式)
| ID |
Pattern |
Severity |
Description |
| LP1 |
Underdeclared Capability |
HIGH |
代码使用了未在声明权限中列出的能力 |
| LP2 |
Wildcard Permission |
MEDIUM |
权限列表包含通配符(*、all、full、any) |
| LP3 |
Missing Permission Declaration |
MEDIUM |
没有权限字段,但代码具有可检测的能力 |
| LP4 |
Overdeclared Permission |
LOW |
权限已声明但未发现相应的代码能力 |
MCP Tool Poisoning(MCP 工具投毒,4 种模式)
| ID |
Pattern |
Severity |
Description |
| TP1 |
Hidden Instructions |
HIGH |
元数据中的隐藏指令(HTML 注释、零宽字符、base64、data URI) |
| TP2 |
Unicode Deception |
HIGH |
工具元数据中的同形字、RTL 覆盖、混合脚本标识符 |
| TP3 |
Parameter Description Injection |
MEDIUM |
参数定义中的注入模式(覆盖、系统令牌、恶意默认值) |
| TP4 |
Description-Behavior Mismatch |
MEDIUM |
声明的工具描述与实际代码行为不匹配(LLM 增强) |
所有检测到的模式均列在上表中。
风险评分
分数计算
- CRITICAL 问题:+50 分
- HIGH 问题:+25 分
- MEDIUM 问题:+10 分
- LOW 问题:+5 分
- 可执行脚本:1.3 倍乘数
严重性级别
| 分数 |
严重性 |
建议 |
| 0–20 |
LOW |
安全 |
| 21–50 |
MEDIUM |
谨慎 |
| 51–80 |
HIGH |
不要安装 |
| 81–100 |
CRITICAL |
不要安装 |
示例输出
终端输出
SkillSpector 安全报告 v2.0.0
技能:suspicious-skill
来源:./suspicious-skill/
扫描时间:2026-01-29 10:30:00 UTC
风险评估
指标 值
分数 78/100
严重性 HIGH
建议 不要安装
组件(3个)
文件 类型 行数 可执行
SKILL.md markdown 142 否
scripts/sync.py python 87 是
requirements.txt text 3 否
问题(2个)
HIGH:环境变量收集(E2)
位置:scripts/sync.py:23
发现:for key, val in os.environ.items():...
置信度:94%
解释:此代码收集包含 API 密钥和机密的环境变量,
然后将它们发送到外部服务器。
HIGH:外部传输(E1)
位置:scripts/sync.py:45
发现:requests.post("https://api.skill.io/env"...
置信度:89%
解释:数据正在发送到外部服务器。结合上面的环境变量收集,
这表明凭证外泄。
配置
环境变量
| 变量 |
描述 |
必需 |
SKILLSPECTOR_PROVIDER |
活跃的 LLM 提供商:openai、anthropic 或 nv_build。每个提供商有自己的 model_registry.yaml 和默认模型(参见上方 LLM 分析表)。默认为 nv_build。 |
可选 |
NVIDIA_INFERENCE_KEY |
nv_build 提供商(build.nvidia.com)的凭证。 |
当 SKILLSPECTOR_PROVIDER=nv_build 且需要 LLM 分析时必需 |
OPENAI_API_KEY |
OpenAI 提供商(SKILLSPECTOR_PROVIDER=openai)的凭证。在凭证瀑布流中,当活跃提供商无凭证时也作为第二层回退。 |
当 SKILLSPECTOR_PROVIDER=openai 且需要 LLM 分析时必需 |
OPENAI_BASE_URL |
覆盖 OpenAI 端点(例如指向 Ollama)。 |
可选 |
ANTHROPIC_API_KEY |
Anthropic 提供商(SKILLSPECTOR_PROVIDER=anthropic)的凭证。 |
当 SKILLSPECTOR_PROVIDER=anthropic 且需要 LLM 分析时必需 |
SKILLSPECTOR_MODEL |
覆盖活跃提供商的默认模型。参见上方 LLM 分析表中每个提供商的默认值。 |
可选 |
SKILLSPECTOR_MODEL_REGISTRY |
使用自定义路径覆盖捆绑的按提供商 YAML 注册表(src/skillspector/providers/<provider>.yaml)。 |
可选 |
SKILLSPECTOR_LOG_LEVEL |
日志级别:DEBUG、INFO、WARNING、ERROR(默认:WARNING)。 |
可选 |
CLI 选项
skillspector scan --help
Options:
-f, --format [terminal|json|markdown|sarif] 输出格式 [default: terminal]
-o, --output PATH 输出文件路径
--no-llm 跳过 LLM 分析(仅静态)
-V, --verbose 显示详细进度
--help 显示此帮助信息并退出
开发
设置
所有 make 目标假定已创建并激活虚拟环境。Makefile 优先使用 uv,否则使用 pip。
# 克隆、创建虚拟环境、激活、安装开发依赖
git clone https://github.com/NVIDIA/skillspector.git
cd skillspector
uv venv .venv && source .venv/bin/activate
# 或:python3 -m venv .venv && source .venv/bin/activate
make install-dev
# 运行测试
make test
# 运行测试并生成覆盖率报告
make test-cov
# 运行 lint
make lint
# 格式化代码
make format
工作原理
SkillSpector 使用两阶段检测流水线:
阶段 1:静态分析
- 基于正则表达式的快速模式匹配,覆盖 11 个静态分析器
- 基于 AST 的行为分析,检测危险调用(exec、eval、subprocess 等)
- 通过 OSV.dev 实时查询依赖项中的已知 CVE
- 扫描技能中的所有文件
- 高召回率(捕获大多数问题)
- 中等精确度(存在一些误报)
阶段 2:LLM 语义分析(可选)
- 评估上下文和意图
- 过滤误报
- 提供人类可读的解释
- 将精确度提升至约 87%
LLM 提示包含反越狱保护,防止恶意技能操纵分析过程。
实时漏洞查询(SC4)
SC4 使用 OSV.dev API 检查依赖项与完整的开源漏洞数据库 — 覆盖 PyPI 和 npm 上的数万条公告。
- 无需 API 密钥 — OSV.dev 免费且无需认证。
- 批量查询 — 所有依赖项通过一次 HTTP 调用检查。
- 自动回退 — 如果 OSV.dev 不可达(气隙/离线),则使用内置的小型回退列表。
- 缓存 — 结果在内存中缓存 1 小时,避免会话期间重复 API 调用。
该工具需要出站 HTTPS 访问 api.osv.dev 以获取实时漏洞数据。当无法访问时,发现仅限于静态回退列表。
局限性
- 非英语内容:可能遗漏其他语言的模式
- 基于图像的攻击:无法分析图像中的文本
- 加密/二进制代码:无法分析已编译或加密的内容
- 运行时行为:仅静态分析,无动态执行
- 离线 SC4:如果没有网络访问
api.osv.dev,SC4 使用小型静态回退列表
研究背景
基于研究《Agent Skills in the Wild: An Empirical Study of Security Vulnerabilities at Scale》(Liu 等人,2026):
- 数据集:来自主要市场的 42,447 个技能
- 存在漏洞:26.1% 包含至少一个漏洞
- 高严重性:5.2% 显示出恶意意图
- 关键发现:包含可执行脚本的技能漏洞概率高出 2.12 倍
Python API 集成
from skillspector import graph
# 调用 LangGraph 工作流
result = graph.invoke({
"input_path": "/path/to/skill",
"output_format": "json", # terminal, json, markdown, 或 sarif
"use_llm": True, # False 表示仅静态分析
})
# 访问结果
print(f"风险分数:{result['risk_score']}/100")
print(f"严重性:{result['risk_severity']}")
print(f"建议:{result['risk_recommendation']}")
for finding in result["filtered_findings"]:
print(f"[{finding['severity']}] {finding['rule_id']}: {finding['message']}")
许可证
Apache License 2.0 — 详见 LICENSE。
贡献
欢迎贡献!请阅读我们的贡献指南并提交拉取请求。
支持