NVIDIA/SkillSpector 源码:https://github.com/NVIDIA/SkillSpector
SkillSpector
AI 代理技能安全扫描器。
检测漏洞、恶意模式和安全风险,在安装代理技能之前。
Python 3.12+(https://www.python.org/downloads/)
许可证:Apache 2.0(https://www.apache.org/licenses/LICENSE-2.0)
概述
AI 代理技能(用于 Claude Code、Codex CLI、Gemini CLI 等)以隐式信任执行,且审查极少。研究表明,26.1% 的技能存在漏洞,5.2% 表现出明显的恶意意图。
SkillSpector 帮助您回答:“这个技能安装安全吗?”
文档
- 开发指南 — 架构、包布局以及如何扩展分析器流水线。
特性
- 多格式输入:扫描 Git 仓库、URL、zip 文件、目录或单个文件
- 64 种漏洞模式,涵盖 16 个类别:提示注入、数据泄露、权限提升、供应链、过度代理、输出处理、系统提示泄露、内存投毒、工具滥用、恶意代理、触发器滥用、危险代码(AST)、污点跟踪、YARA 签名、MCP 最小权限和 MCP 工具投毒
- 两阶段分析:快速静态分析 + 可选的 LLM 语义评估
- 实时漏洞查询:SC4 查询 OSV.dev(https://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 检测 64 种漏洞模式,涵盖 16 个类别:
提示注入(5 种模式)
| ID | 模式 | 严重性 | 描述 |
| P1 | 指令覆盖 | 高 | 忽略安全约束的命令 |
| P2 | 隐藏指令 | 高 | 注释/不可见文本中的恶意指令 |
| P3 | 数据泄露命令 | 高 | 要求将上下文外传的指令 |
| P4 | 行为操纵 | 中 | 微妙地改变代理决策的指令 |
| P5 | 有害内容 | 严重 | 可能导致身体伤害的指令 |
数据泄露(4 种模式)
| ID | 模式 | 严重性 | 描述 |
| E1 | 外部传输 | 中 | 向外部 URL 发送数据 |
| E2 | 环境变量窃取 | 高 | 收集 API 密钥和机密 |
| E3 | 文件系统枚举 | 中 | 扫描目录以查找敏感文件 |
| E4 | 上下文泄露 | 高 | 将对话上下文外传 |
权限提升(3 种模式)
| ID | 模式 | 严重性 | 描述 |
| PE1 | 过度权限 | 低 | 请求超出声明功能的访问权限 |
| PE2 | Sudo/Root 执行 | 中 | 调用提升的系统权限 |
| PE3 | 凭证访问 | 高 | 读取 SSH 密钥、令牌、密码 |
供应链(6 种模式)
| ID | 模式 | 严重性 | 描述 |
| SC1 | 未固定依赖 | 低 | 包无版本约束 |
| SC2 | 外部脚本获取 | 高 | curl | bash 和远程代码执行 |
| SC3 | 混淆代码 | 高 | Base64/hex 编码执行 |
| SC4 | 已知漏洞依赖 | 高 | 具有已知 CVE 的依赖(实时 OSV.dev 查询) |
| SC5 | 废弃依赖 | 中 | 无安全更新的未维护包 |
| SC6 | 域名仿冒 | 高 | 类似流行包的包名 |
过度代理(4 种模式)
| ID | 模式 | 严重性 | 描述 |
| EA1 | 无限制工具访问 | 高 | 无约束的随意工具访问 |
| EA2 | 自主决策 | 高 | 无人工参与的高影响决策 |
| EA3 | 范围扩大 | 中 | 超出声明目的的能力 |
| EA4 | 无限制资源访问 | 中 | 资源消耗无速率限制或配额 |
输出处理(3 种模式)
| ID | 模式 | 严重性 | 描述 |
| OH1 | 未验证输出注入 | 高 | 模型输出未经清理直接使用 |
| OH2 | 跨上下文输出 | 中 | 输出跨越信任边界而未经验证 |
| OH3 | 无限制输出 | 中 | 输出大小或生成速率无限制 |
系统提示泄露(3 种模式)
| ID | 模式 | 严重性 | 描述 |
| P6 | 直接泄露 | 高 | 暴露系统提示或内部规则的指令 |
| P7 | 间接提取 | 中 | 通过改写、翻译或侧信道提取 |
| P8 | 基于工具的外泄 | 高 | 通过文件写入或网络请求泄露系统提示 |
内存投毒(3 种模式)
| ID | 模式 | 严重性 | 描述 |
| MP1 | 持久上下文注入 | 高 | 设计为跨交互持久化的内容 |
| MP2 | 上下文窗口填充 | 中 | 填充内容挤占安全约束 |
| MP3 | 内存操纵 | 高 | 篡改代理内存或存储状态 |
工具滥用(3 种模式)
| ID | 模式 | 严重性 | 描述 |
| TM1 | 工具参数滥用 | 高 | 构造参数导致意外行为(shell=True, –force) |
| TM2 | 链式滥用 | 高 | 绕过单独安全检查的工具链 |
| TM3 | 不安全默认值 | 中 | 过于宽松的默认值(禁用 TLS、无认证) |
恶意代理(2 种模式)
| ID | 模式 | 严重性 | 描述 |
| RA1 | 自我修改 | 严重 | 运行时修改自身代码或配置 |
| RA2 | 会话持久化 | 高 | 通过 cron 任务或启动脚本进行未授权持久化 |
触发器滥用(3 种模式)
| ID | 模式 | 严重性 | 描述 |
| TR1 | 过于宽泛的触发器 | 中 | 匹配常见单词的触发模式 |
| TR2 | 影子命令触发器 | 高 | 覆盖内置命令或其他技能的触发器 |
| TR3 | 关键词诱饵触发器 | 中 | 旨在最大化激活的通用触发器 |
行为 AST(8 种模式)
| ID | 模式 | 严重性 | 描述 |
| AST1 | exec() 调用 | 严重 | 直接 exec() 允许任意代码执行 |
| AST2 | eval() 调用 | 高 | 直接 eval() 评估任意表达式 |
| AST3 | 动态导入 | 高 | __import__() 运行时加载任意模块 |
| AST4 | subprocess 调用 | 高 | 通过 subprocess 执行外部命令 |
| AST5 | os.system / exec 系列 | 高 | 通过 os 模块执行 shell 命令 |
| AST6 | compile() 调用 | 中 | 从字符串创建代码对象 |
| AST7 | 动态 getattr() | 中 | 使用非字面名称进行任意属性访问 |
| AST8 | 危险执行链 | 严重 | exec/eval 结合动态来源(网络、编码数据) |
污点跟踪(5 种模式)
| ID | 模式 | 严重性 | 描述 |
| TT1 | 直接污点流 | 高 | 数据直接从源流向接收器,未经清理 |
| TT2 | 变量中介污点流 | 中 | 数据通过中间变量从源流向接收器 |
| TT3 | 凭证泄露链 | 严重 | 凭证(环境变量、机密)流向网络输出接收器 |
| TT4 | 文件读取到网络泄露 | 高 | 文件内容流向网络输出接收器 |
| TT5 | 外部输入到代码执行 | 严重 | 网络或用户输入流向 exec/eval/subprocess 接收器 |
YARA 签名(4 种模式)
| ID | 模式 | 严重性 | 描述 |
| YR1 | 恶意软件匹配 | 严重 | YARA 规则匹配已知恶意软件签名 |
| YR2 | 网页后门匹配 | 严重 | YARA 规则匹配网页后门模式 |
| YR3 | 挖矿程序匹配 | 高 | YARA 规则匹配加密货币挖矿迹象 |
| YR4 | 黑客工具/漏洞利用匹配 | 高 | YARA 规则匹配黑客工具或漏洞利用代码 |
MCP 最小权限(4 种模式)
| ID | 模式 | 严重性 | 描述 |
| LP1 | 未声明能力 | 高 | 代码使用了权限声明中未列出的能力 |
| LP2 | 通配符权限 | 中 | 权限列表包含通配符(*、all、full、any) |
| LP3 | 缺失权限声明 | 中 | 无权限字段但代码具有可检测的能力 |
| LP4 | 过度声明权限 | 低 | 声明了权限但未找到对应的代码能力 |
MCP 工具投毒(4 种模式)
| ID | 模式 | 严重性 | 描述 |
| TP1 | 隐藏指令 | 高 | 元数据中的隐藏指令(HTML 注释、零宽字符、base64、数据 URI) |
| TP2 | Unicode 欺骗 | 高 | 工具元数据中的同形异义词、RTL 覆盖、混合脚本标识符 |
| TP3 | 参数描述注入 | 中 | 参数定义中的注入模式(覆盖、系统令牌、恶意默认值) |
| TP4 | 描述-行为不匹配 | 中 | 声明的工具描述与实际代码行为不符(LLM 驱动) |
所有检测到的模式均列在上表中。
风险评分
分数计算
- 严重问题:+50 分
- 高问题:+25 分
- 中问题:+10 分
- 低问题:+5 分
- 可执行脚本:1.3 倍乘数
严重等级
| 分数 | 严重性 | 建议 |
| 0-20 | 低 | 安全 |
| 21-50 | 中 | 谨慎 |
| 51-80 | 高 | 请勿安装 |
| 81-100 | 严重 | 请勿安装 |
示例输出
终端输出
SkillSpector 安全报告 v2.0.0
技能: suspicious-skill
来源: ./suspicious-skill/
扫描时间: 2026-01-29 10:30:00 UTC
风险评估
指标 值
得分 78/100
严重性 高
建议 请勿安装
组件 (3)
文件类型 行数 可执行
SKILL.md markdown 142 否
scripts/sync.py python 87 是
requirements.txt text 3 否
问题 (2)
高: 环境变量窃取 (E2)
位置: scripts/sync.py:23
发现: for key, val in os.environ.items():...
置信度: 94%
解释: 该代码收集包含 API 密钥和机密的环境变量,然后将其发送到外部服务器。
高: 外部传输 (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)的凭证。 | 使用 LLM 分析且 SKILLSPECTOR_PROVIDER=nv_build 时必须 |
OPENAI_API_KEY | OpenAI 提供商的凭证(SKILLSPECTOR_PROVIDER=openai)。也作为凭证瀑布中的二级回退(当活动提供商未返回凭证时)。 | 使用 LLM 分析且 SKILLSPECTOR_PROVIDER=openai 时必须 |
OPENAI_BASE_URL | 覆盖 OpenAI 端点(例如指向 Ollama)。 | 可选 |
ANTHROPIC_API_KEY | Anthropic 提供商的凭证(SKILLSPECTOR_PROVIDER=anthropic)。 | 使用 LLM 分析且 SKILLSPECTOR_PROVIDER=anthropic 时必须 |
SKILLSPECTOR_MODEL | 覆盖活动提供商的默认模型。见每个提供商的默认模型上方的 LLM 分析表。 | 可选 |
SKILLSPECTOR_MODEL_REGISTRY | 用自定义路径覆盖绑定的每提供商 YAML 注册表(src/skillspector/providers/<provider>.yaml)。 | 可选 |
SKILLSPECTOR_LOG_LEVEL | 日志级别:DEBUG、INFO、WARNING、ERROR(默认:WARNING)。 | 可选 |
CLI 选项
skillspector scan --help
选项:
-f, --format [terminal|json|markdown|sarif] 输出格式 [默认: 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、动态导入等)
- YARA 签名扫描,检测已知恶意负载
- MCP 最小权限分析(权限声明与代码能力对比)
- 污点跟踪(识别数据从不安全来源流向危险接收器)
- 实时 CVE 查询 OSV.dev,检测已知漏洞依赖
阶段 2:LLM 分析(可选)
当启用时,LLM 分析器执行深度语义评估:
- 用于隐蔽命令和间接数据泄露的提示注入分析
- 文本分类,识别行为操纵、有害内容和系统提示泄露
- 代理意图分析和信任边界映射
- MCP 工具元数据验证,检测隐藏指令、Unicode 欺骗和参数注入
- 描述-行为一致性验证
由 NVIDIA 构建。Made with ❤️ by the SkillSpector team.