NVIDIA正是我所需要的,用来保障Agent技能安全 https://github.com/nvidia/skillspector… 将其作为GitHub Action添加到 http://aitmpl.com ,每个社区提交的技能在上线前都会经过扫描,杜绝提示注入、数据泄露和供应链风险。
nvidia/skillspector
来源:https://github.com/nvidia/skillspector
SkillSpector
AI Agent技能安全扫描器。
在安装Agent技能前检测漏洞、恶意模式和安全隐患。
Python 3.12+ (https://www.python.org/downloads/)
许可协议:Apache 2.0 (https://www.apache.org/licenses/LICENSE-2.0)
概述
AI Agent技能(用于Claude Code、Codex CLI、Gemini CLI等)在隐式信任且几乎不经过审查的情况下执行。研究表明,26.1% 的技能存在漏洞,5.2% 表现出明显恶意意图。SkillSpector能帮你回答:“这个技能安装安全吗?”
文档
功能特性
- 多格式输入:支持扫描Git仓库、URL、zip文件、目录或单个文件
- 64种漏洞模式,覆盖16个类别:提示注入、数据泄露、权限提升、供应链、过度代理、输出处理、系统提示泄露、内存投毒、工具滥用、恶意Agent、触发器滥用、危险代码(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 | 指令覆盖 | HIGH | 忽略安全约束的命令 |
| P2 | 隐藏指令 | HIGH | 注释/不可见文本中的恶意指令 |
| P3 | 泄露命令 | HIGH | 将上下文内容传输到外部的指令 |
| P4 | 行为操纵 | MEDIUM | 微妙地改变Agent决策的指令 |
| P5 | 有害内容 | CRITICAL | 可能导致人身伤害的指令 |
数据泄露 (4种模式)
| ID | 模式 | 严重性 | 描述 |
| E1 | 外部传输 | MEDIUM | 向外部URL发送数据 |
| E2 | 环境变量收集 | HIGH | 收集API密钥和密码 |
| E3 | 文件系统枚举 | MEDIUM | 扫描目录寻找敏感文件 |
| E4 | 上下文泄露 | HIGH | 将对话上下文传输到外部 |
权限提升 (3种模式)
| ID | 模式 | 严重性 | 描述 |
| PE1 | 过度权限 | LOW | 请求超出声称功能的访问权限 |
| PE2 | Sudo/Root执行 | MEDIUM | 调用提升的系统权限 |
| PE3 | 凭证访问 | HIGH | 读取SSH密钥、令牌、密码 |
供应链 (6种模式)
| ID | 模式 | 严重性 | 描述 |
| SC1 | 未固定依赖 | LOW | 包无版本约束 |
| SC2 | 外部脚本获取 | HIGH | curl | bash 和远程代码执行 |
| SC3 | 混淆代码 | HIGH | Base64/十六进制编码执行 |
| SC4 | 已知漏洞依赖 | HIGH | 含有已知CVE的依赖(实时OSV.dev查询) |
| SC5 | 被遗弃的依赖 | MEDIUM | 没有安全更新的未维护包 |
| SC6 | 域名仿冒 | HIGH | 名称与流行包相似的包 |
过度代理 (4种模式)
| ID | 模式 | 严重性 | 描述 |
| EA1 | 无限制工具访问 | HIGH | 无约束的任意工具访问 |
| EA2 | 自主决策 | HIGH | 无人参与的、高影响的决策 |
| EA3 | 范围蔓延 | MEDIUM | 超出声称目的的能力 |
| EA4 | 无限制资源访问 | MEDIUM | 没有速率限制或配额的资源消耗 |
输出处理 (3种模式)
| ID | 模式 | 严重性 | 描述 |
| OH1 | 未验证输出注入 | HIGH | 模型输出未经过消毒即被使用 |
| OH2 | 跨上下文输出 | MEDIUM | 输出未经验证就跨信任边界流动 |
| OH3 | 无边界输出 | MEDIUM | 输出大小或生成速率无限制 |
系统提示泄露 (3种模式)
| ID | 模式 | 严重性 | 描述 |
| P6 | 直接泄露 | HIGH | 暴露系统提示或内部规则的指令 |
| P7 | 间接提取 | MEDIUM | 通过改述、翻译或侧信道提取 |
| P8 | 基于工具的外泄 | HIGH | 通过文件写入或网络请求泄露系统提示 |
内存投毒 (3种模式)
| ID | 模式 | 严重性 | 描述 |
| MP1 | 持久上下文注入 | HIGH | 设计为跨交互持续存在的内容 |
| MP2 | 上下文窗口填充 | MEDIUM | 挤占安全约束空间的填充内容 |
| MP3 | 内存操纵 | HIGH | 篡改Agent内存或存储状态 |
工具滥用 (3种模式)
| ID | 模式 | 严重性 | 描述 |
| TM1 | 工具参数滥用 | HIGH | 构造参数导致非预期行为(shell=True, –force) |
| TM2 | 链式滥用 | HIGH | 绕过单个安全检查的工具链 |
| TM3 | 不安全默认值 | MEDIUM | 过度宽松的默认设置(禁用TLS,无认证) |
恶意Agent (2种模式)
| ID | 模式 | 严重性 | 描述 |
| RA1 | 自我修改 | CRITICAL | 运行时修改自身代码或配置 |
| RA2 | 会话持久化 | HIGH | 通过cron作业或启动脚本进行未授权持久化 |
触发器滥用 (3种模式)
| ID | 模式 | 严重性 | 描述 |
| TR1 | 过度宽泛的触发 | MEDIUM | 匹配常见单词的触发模式 |
| TR2 | 影子命令触发 | HIGH | 遮蔽内置命令或其他技能的触发 |
| TR3 | 关键词诱饵触发 | MEDIUM | 为最大化激活而设计的通用触发 |
行为AST (8种模式)
| ID | 模式 | 严重性 | 描述 |
| AST1 | exec()调用 | CRITICAL | 直接exec()执行任意代码 |
| AST2 | eval()调用 | HIGH | 直接eval()评估任意表达式 |
| AST3 | 动态导入 | HIGH | __import__()运行时加载任意模块 |
| AST4 | subprocess调用 | HIGH | 通过subprocess执行外部命令 |
| AST5 | os.system / exec系列 | HIGH | 通过os模块执行shell命令 |
| AST6 | compile()调用 | MEDIUM | 从字符串创建代码对象 |
| AST7 | 动态getattr() | MEDIUM | 使用非文字名称访问任意属性 |
| AST8 | 危险执行链 | CRITICAL | exec/eval与动态源(网络、编码数据)结合 |
污点追踪 (5种模式)
| ID | 模式 | 严重性 | 描述 |
| TT1 | 直接污点流 | HIGH | 数据从源直接流向接收点而未消毒 |
| TT2 | 变量中介污点流 | MEDIUM | 数据通过中间变量从源流向接收点 |
| TT3 | 凭证外泄链 | CRITICAL | 凭证(环境变量、秘密)流向网络输出接收点 |
| TT4 | 文件读取到网络外泄 | HIGH | 文件内容流向网络输出接收点 |
| TT5 | 外部输入到代码执行 | CRITICAL | 网络或用户输入流向exec/eval/subprocess接收点 |
YARA签名 (4种模式)
| ID | 模式 | 严重性 | 描述 |
| YR1 | 恶意软件匹配 | CRITICAL | YARA规则匹配已知恶意软件签名 |
| YR2 | Webshell匹配 | CRITICAL | YARA规则匹配webshell模式 |
| YR3 | 挖矿软件匹配 | HIGH | YARA规则匹配加密货币挖掘指标 |
| YR4 | 黑客工具/漏洞利用匹配 | HIGH | YARA规则匹配黑客工具或漏洞利用代码 |
MCP最小权限 (4种模式)
| ID | 模式 | 严重性 | 描述 |
| LP1 | 未声明能力 | HIGH | 代码使用了未在声明的权限中列出的能力 |
| LP2 | 通配符权限 | MEDIUM | 权限列表包含通配符(*, all, full, any) |
| LP3 | 缺少权限声明 | MEDIUM | 没有权限字段,但代码具有可检测的能力 |
| LP4 | 过度声明权限 | LOW | 声明的权限但未找到对应代码能力 |
MCP工具投毒 (4种模式)
| ID | 模式 | 严重性 | 描述 |
| TP1 | 隐藏指令 | HIGH | 元数据中的隐藏指令(HTML注释、零宽字符、base64、数据URI) |
| TP2 | Unicode欺骗 | HIGH | 工具元数据中的同形字、RTL覆盖、混合脚本标识符 |
| TP3 | 参数描述注入 | MEDIUM | 参数定义中的注入模式(覆盖、系统令牌、恶意默认值) |
| TP4 | 描述-行为不匹配 | MEDIUM | 声明的工具描述与实际代码行为不匹配(基于LLM) |
查看所有模式:
skillspector patterns
风险评分
分数计算
- CRITICAL 问题:+50分
- HIGH 问题:+25分
- MEDIUM 问题:+10分
- LOW 问题:+5分
- 可执行脚本:1.3倍乘数
严重性等级
| 分数 | 严重性 | 建议 |
| 0-20 | LOW | 安全 |
| 21-50 | MEDIUM | 谨慎 |
| 51-80 | HIGH | 请勿安装 |
| 81-100 | CRITICAL | 请勿安装 |
示例输出
终端输出
SkillSpector Security Report v0.1.0
Skill: suspicious-skill
Source: ./suspicious-skill/
Scanned: 2026-01-29 10:30:00 UTC
Risk Assessment
Metric Value
Score 78/100
Severity HIGH
Recommendation DO NOT INSTALL
Components (3)
File Type Lines Executable
SKILL.md markdown 142 No
scripts/sync.py python 87 Yes
requirements.txt text 3 No
Issues (2)
HIGH: Env Variable Harvesting (E2)
Location: scripts/sync.py:23
Finding: for key, val in os.environ.items():...
Confidence: 94%
Explanation: This code collects environment variables containing API keys and secrets, then sends them to an external server.
HIGH: External Transmission (E1)
Location: scripts/sync.py:45
Finding: requests.post("https://api.skill.io/env"...
Confidence: 89%
Explanation: Data is being sent to an external server. Combined with env harvesting above, this indicates credential exfiltration.
配置
环境变量
| 变量 | 描述 | 必需 |
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/.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。
# 克隆、创建venv、激活、安装开发依赖
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