Skip to content

这个集合写了十三篇技能评测,每篇都在说「装上它」。这一篇反过来:装之前,怎么查。

过去两小时里,我们装过会跑 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–20SAFE
21–50CAUTION
51–80DO NOT INSTALL
81–100DO NOT INSTALL

一个 HIGH 发现就 25 分,四个就过 80。公式简单的好处是你能自己算、能跟团队解释;坏处是任何知道公式的人都能把恶意技能压在 50 分以下——把关键逻辑拆散、避开正则、用非英文注释。

把它当成 npm audit 那一类东西:降低明显恶意的概率,不承诺安全。

用起来 ​

bash
# 最快的方式
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% 的人做得多了。

链接 ​