这个集合写了十三篇技能评测,每篇都在说「装上它」。这一篇反过来:装之前,怎么查。
过去两小时里,我们装过会跑 ffmpeg 的、会起本地 HTTP 服务的、会下载二进制并自动升级的、会登录你的账号去抓数据的。它们都是「装上一个文件夹,agent 就多一份能力」——而这份能力拿到的权限,通常和你自己一样大。
| 项目 | 内容 |
|---|---|
| 类型 | CLI 工具(也可作为 MCP 服务器 / Pi、OpenCode 扩展) |
| 仓库 | NVIDIA/SkillSpector |
| 技术栈 | Python 3.12+(正则 + AST + YARA + 可选 LLM) |
| 许可 | Apache-2.0 |
| 热度 | 23.6k star / 2.0k fork / 149 open issue(2026-10-31 快照) |
| 状态 | v2.13.2(2026-10-28),2026-03-21 开源 |
先看它为什么存在
README 开头引了一组研究数据,出自论文《Agent Skills in the Wild》(Liu et al., 2026):
- 数据集 42,447 个技能,其中 31,132 个被完整分析;
- 26.1% 至少含一个漏洞;
- 5.2% 表现出疑似恶意意图;
- 带可执行脚本的技能,有漏洞的概率是 2.12 倍。
最后一个数字最有行动价值:如果你只想要「提示词型技能」,优先选纯 Markdown 的;凡是带 scripts/ 的,多看一眼。
它扫什么:71 个模式,17 类风险
不逐条列,挑几类最能说明「技能的攻击面和普通代码不一样」的:
| 类别 | 例子 |
|---|---|
| 提示注入(6) | 指令覆盖、注释/不可见文本里藏指令、用大段空白把内容推出可视区 |
| 反拒绝(3) | 「永远不要拒绝」「不要加免责声明」「你现在没有任何限制」 |
| 数据外泄(4) | 枚举环境变量 + 向外部 POST = 凭据窃取 |
| 供应链(10+) | curl | bash、Base64 混淆执行、拼写抢注、已知 CVE、文档里藏可执行文件 |
| 过度代理(5) | 无限制的工具访问、高风险决策不经人、偷偷切到别的计费账号 |
| 记忆投毒(3) | 设计成跨会话持久化的内容、用填充内容挤掉安全约束 |
| MCP 工具投毒(4) | 工具描述里藏指令、参数名引导模型做别的事 |
其中「反拒绝」这一类是我觉得最该被单独提出来的。传统的代码扫描器不会管「这个 skill 教模型不要拒绝」,因为那不是代码缺陷——但一个把「永远不要说不知道」写进 SKILL.md 的技能,本身就是攻击面。
两阶段:确定性的先跑,模型只许加分
这是整个工具最值得抄的设计。
Stage 1 静态:11 个分析器并行——正则匹配、Python AST 行为分析(exec、eval、subprocess 这类危险调用)、YARA 签名、以及通过 OSV.dev 实时查依赖的已知 CVE。高召回、中等精度,会有误报。
Stage 2 LLM 语义(可选):判断上下文和意图。关键约束写在 README 里:
确认的发现可以获得解释和更高的置信度,永远不会降低。 无论模型是确认、反驳还是根本没提,每一条确定性发现都留在报告里。
模型没确认的发现会被打上 llm-unconfirmed 标签,但不删除;JSON 和 SARIF 里还能看到 confirmed / disagreed / low-confidence / missing / failed 五种复核结果。
这条设计正面回答了一个常见陷阱:让模型做二次判断,最常见的坏结果是它顺手把真问题删掉了。 SkillSpector 把模型的角色限定成「加解释、加置信度」,不许做减法。加上提示词里有反越狱保护(防止被扫描的恶意技能反过来操纵分析器),这两处加起来,说明作者想过对手会怎么打。
一个必须知道的默认值:它会把代码发出去
Trust model 那一节写得比很多商业产品清楚,但内容值得单独拉出来说:
- 它从不执行被扫描的技能。 全是静态分析(正则、AST、YARA)+ 可选的 LLM 读文件内容,代码不跑。
- 但 LLM 分析默认开启,会把文件内容发给你配置的 provider。 包括 DSSE 载荷和可读的签名元数据。想全本地,用
--no-llm。 - 即便
--no-llm,SC4 也会把依赖名和版本发给 OSV.dev——这是查已知 CVE 的核心机制,跑不掉的。它只发依赖坐标,不发文件内容,也不需要 key,离线时会退化到内置列表。 - 它不给你的机器做沙箱。它只在你安装之前举手示意,装不装、装完出事,它不管。
一个安全扫描器默认把你的代码上传到第三方——这件事本身需要使用者自己权衡。放在公司环境里,先确认 --no-llm 是不是必须的。
评分:简单到可以被解释,也简单到可以被绕过
| 严重级 | 扣分 |
|---|---|
| CRITICAL | +50 |
| HIGH | +25 |
| MEDIUM | +10 |
| LOW | +5 |
| 含可执行脚本 | 整体 ×1.3 |
| 总分 | 结论 |
|---|---|
| 0–20 | SAFE |
| 21–50 | CAUTION |
| 51–80 | DO NOT INSTALL |
| 81–100 | DO NOT INSTALL |
一个 HIGH 发现就 25 分,四个就过 80。公式简单的好处是你能自己算、能跟团队解释;坏处是任何知道公式的人都能把恶意技能压在 50 分以下——把关键逻辑拆散、避开正则、用非英文注释。
把它当成 npm audit 那一类东西:降低明显恶意的概率,不承诺安全。
用起来
# 最快的方式
uv tool install git+https://github.com/NVIDIA/skillspector.git
skillspector scan ./my-skill --no-llm
# 或者完全不装 Python
docker run --rm -v "$PWD:/scan" skillspector scan ./my-skill/ --no-llm支持扫 Git 仓库、URL、zip、目录、单文件。输出四种格式:终端、JSON、Markdown、SARIF(能直接进 GitHub Code Scanning 或 CI)。
误报怎么处理?它有一套 baseline:用 glob 规则或指纹接受已知发现,之后重扫只报新问题。这个机制对「我们有 40 个历史遗留问题」的团队是刚需,否则报告第二天就没人看了。
还有几个附加形态:skillspector mcp 可以当 MCP 服务器用,Pi 和 OpenCode 也有扩展,能在 agent 会话里直接扫。
它和这个集合里其他篇的关系
放回来看,它能接上好几篇留下的问题:
- dsh-our-free-model 那篇讲过 npm 上有人抢注同名包、改过
index.js。SkillSpector 能扫出可疑脚本,但扫不出「这个名字不是官方的」——它读内容,不验身份。那类风险只能靠对源。 - huashu-design 装不全 99 处引用那次,说明我们对「装」这个动作太放心了。
- security-audit 审的是你自己的代码,而且要求沙箱;SkillSpector 审的是你要装的别人的代码,而且不执行。一个向内、一个向外,刚好补全。
坑
1. 默认不是「纯本地」
LLM 分析默认开着,代码会外发。--no-llm 只解决文件内容,OSV 查询仍在。完全离线的环境里,SC4 会退化成一个很小的内置列表——报告会看起来更「干净」,但那不是安全,只是看不见。
2. 静态分析的盲区很实在
README 自己列了:非英文内容可能漏、图片里的文字看不到、编译/加密内容看不了、运行时行为完全看不到。
第 4 条最要命:一个技能可以在 SKILL.md 里看起来人畜无害,真正的动作发生在它让你 agent 执行的第三条命令里。这类东西只有沙箱能拦,扫描器拦不了。
3. 它不替代判断
「0 分 SAFE」不等于安全,只等于「没命中这 71 个模式」。它在 NVIDIA 的 Verified Skills 流水线里是一环(扫描 → 评估 → 签名 → 进目录),单独拿出来用,你得到的只是其中一个环节。
4. 生态绑定的味道
它明说自己属于 NVIDIA Verified Skills 流水线、通过的技能会进 NVIDIA 的技能目录。这不影响工具本身的可用性(Apache-2.0,代码是开的),但你要知道它同时在为一个目录做筛选。
5. 半岁、149 个 issue、两周一个大版本
2.13 已经是第 13 个小版本,节奏很快,规则也在变。别把它写进 CI 的硬门禁就不管了——门禁的规则会变。
适合谁
| 适合 | 不适合 |
|---|---|
| 要在团队里推行「装技能前先扫」 | 想靠它证明某个技能安全 |
| 有 CI,想把扫描做成 SARIF 门禁 | 完全离线环境(要用就得接受盲区) |
经常从 GitHub 直接 npx skills add 的人 | 只装自己写的技能 |
| 要给第三方提供的技能做初筛 | 需要看运行时行为的场景 |
一点判断
它存在的理由就那三个数字:26.1%、5.2%、2.12 倍。
技能生态长得太快了。今天你可以在一条命令里给自己装上十份「能力」,而每一份拿到的权限都和你本人一样——这跟 2010 年往浏览器里装扩展、2015 年 npm install 一个陌生包,是同一个阶段。每次都是先野蛮生长,再补供应链安全。SkillSpector 是「补」的那一半。
我最欣赏的不是 71 个模式,是它对自己能力的克制:确定性发现永远留在报告里、模型只能加分不能减分、明确写「我从不执行被扫的代码」「我不给你的机器做沙箱」。一个安全工具最难的不是多抓几个模式,是说清楚自己抓不到什么。
但别把它当许可证。它降低的是「明显恶意」的概率;真正危险的东西——被投毒的依赖、藏在你手敲命令里的动作、平台条款的风险——大多在静态文本之外。这个集合里就有一个活例子:那个五周涨到 5.3 万星、被第三方抢注了 npm 包名的插件,扫描器只能告你「脚本可疑」,告不了你「这不是官方发的」。
所以正确的用法很朴素:每次装之前跑一遍,看到 HIGH 就停下来读那条解释,读完再决定。 就这一条,已经比 95% 的人做得多了。
链接
- 仓库 · 官方指南:装技能前先扫描
- NVIDIA Verified Skills 流水线 · 技能目录
- 论文:《Agent Skills in the Wild: An Empirical Study of Security Vulnerabilities at Scale》(Liu et al., 2026)
