别再闭眼装 Skill 了:4 万个技能里 26.1% 带漏洞,NVIDIA 开源了个扫描器

你装了几十个 Skill,有没有哪个是你真的从头读到尾的?
说实话,大多数人的安装流程就三步:看见一个 SKILL.md 觉得有用,复制路径,回车。然后它就在你的 Agent 里跑起来了,拿着你给出去的全部权限。
问题就出在这儿。Claude Code、Codex CLI、Gemini CLI 这一票工具,对 Skill 的默认态度是信任。装进来等于直接放进执行链路,能读文件、能调命令、能联网。而绝大多数人,连它的代码块都没展开过。
先搞清楚:它到底在扫什么
SkillSpector 不是杀毒软件。这句得先说,不然期待会错位。
它更像一份体检报告。你丢一个 Skill 进去,它读一遍,告诉你这东西声明了什么、实际干了什么、两边对不对得上、依赖里有没有已知 CVE,最后给一个 0 到 100 的分和一份处置建议。
喂进去的形态很宽:Git 仓库、URL、zip 包、本地目录,或者就一个孤零零的 SKILL.md,都能扫。不用为了审计专门把整个仓库拖下来。
先看个数字。SkillSpector 仓库引用的研究里,扫了 42,447 个 skill,26.1% 至少含一个漏洞,5.2% 显示疑似恶意意图。
但这组数字得打折看。扫描对象是主流 skill 市场的样本,不是 NVIDIA 自己跑的全量普查;样本怎么挑的、恶意意图靠什么判定,都没有公开细节。当趋势看,别当定论。

64 种模式,16 个类别:规则库长什么样
结论先放这儿:覆盖面是真下功夫了,64 种漏洞模式拆成 16 个类别。
- 提示词注入 5 种、数据外泄 4 种、权限提升 3 种、供应链 6 种
- 过度代理权 4 种、输出处理 3 种、系统提示词泄露 3 种、记忆投毒 3 种
- 工具滥用 3 种、流氓 Agent 2 种、触发器滥用 3 种
- 行为 AST 8 种、污点追踪 5 种、YARA 签名 4 种
- MCP 最小权限 4 种、MCP 工具投毒 4 种
前面那几个看名字就懂。后面几类值得单拎出来说。行为 AST 是把代码解析成语法树再看行为,不是简单关键词匹配;污点追踪跟的是数据从哪进来、往哪流出去;YARA 那 4 种,是拿成熟的恶意代码特征库去套。
最后两类都跟 MCP 有关。MCP 现在几乎是 Agent 外接能力的标准接口,挂得越多,权限面越大。SkillSpector 专门给它留了 8 种模式,一半管最小权限,一半管工具投毒。想弄明白这一层为什么值得单独防,可以看看这篇 MCP 协议 的拆解。
冷水也得泼:64 是规则库的覆盖面,不等于 64 种之外的问题它都能抓。静态规则天然有漏检,也有误报。这正是它还要再叠一层语义分析的原因。
静态打底,LLM 补语义:两阶段怎么跑
第一阶段是静态分析。快,确定性,不看心情。抓的是可疑字符串、依赖风险、危险 API 调用,还有一件很关键的事:声明的权限和实际用到的权限对不对得上。
第二阶段是 LLM 语义分析,可选。它干的是比对,这个 skill 说自己要做什么,代码实际在做什么。对不上的地方就是风险。
具体抓三类:描述与行为不符、模糊到容易被误触发的触发器、以及藏在字里行间的隐蔽策略问题。这层是静态规则够不着的地方。
还有个细节挺实在。依赖的实时 CVE 查询走 OSV.dev,断网时自动离线回退,不会因为你网络抽风就扫不动。

装之前那 30 秒:从安装到出报告
安装就这几条命令:
git clone https://github.com/NVIDIA/SkillSpector.git
cd SkillSpector
uv venv .venv && source .venv/bin/activate
make install机器上没有 uv 的话,把第三行换成 python3 -m venv .venv && source .venv/bin/activate,后面照旧。
扫起来更简单:
skillspector scan ./my-skill/
skillspector scan ./SKILL.md
skillspector scan https://github.com/user/my-skill
skillspector scan ./my-skill.zip想留档就换输出格式,JSON、Markdown、SARIF 都支持:
skillspector scan ./my-skill/ --format json --output report.json
skillspector scan ./my-skill/ --format markdown --output report.md
skillspector scan ./my-skill/ --format sarif --output report.sarif这三个里最值得留意的是 SARIF。它能直接接进 GitHub Code Scanning、VS Code 和 CI 流水线,属于能进工程体系的那一种。
要开 LLM 语义分析,先配 provider:
export SKILLSPECTOR_PROVIDER=openai
export OPENAI_API_KEY=sk-...
skillspector scan ./my-skill/可选 provider 三个:openai、anthropic、nv_build。不想配就加 --no-llm,纯静态跑完,该抓的照样抓。
懒得折腾 Python 环境,还有 Docker 这条路:make docker-build 之后,用 docker run --rm -v "$PWD:/scan" skillspector scan ./my-skill/ --no-llm 直接开扫。这几条在 README 里都写得挺分散,凑齐一次能省不少事。
报告怎么读:0 到 100 分意味着什么
分数不是拍脑袋给的,权重写死:
- CRITICAL 一条 +50
- HIGH 一条 +25
- MEDIUM 一条 +10
- LOW 一条 +5
外加一个乘数:带可执行脚本的 skill,总分乘 1.3。会跑脚本的东西,天生比纯文本危险一档。
算完分四档:
- 0 到 20:LOW,SAFE,可以装
- 21 到 50:MEDIUM,CAUTION,建议人工复核
- 51 到 80:HIGH,DO NOT INSTALL
- 81 到 100:CRITICAL,DO NOT INSTALL
官方还给了配套的处置建议,照着做就行:
- Critical 和 High:阻断发布,直到修好或者正式签字接受风险
- 发现隐藏指令或工具投毒:把隐藏内容删掉
- 能力声明不足:补权限声明,或者砍掉那段行为
- 依赖里有已知漏洞:升级、锁版本、或者写书面说明
- 描述和行为对不上:要么改描述,要么改代码
最后这条其实指向一个更根本的问题:skill 该怎么写。写清楚它要干什么、需要哪些权限,既是对用的人负责,也能让扫描器少给你误报。这块的规范可以参考 design.md。
它不完美:这三件事它不管
坑1:扫完它不拦你
现象:报告出来一屏红,你照样能把它装进去。
根因:SkillSpector 不强制执行策略,也不阻止安装。它只出报告和建议,决定权留给你,或者留给你配的 CI。
解法:想真正拦住,就把 SARIF 接进 CI,让流水线去卡阈值。这是第一版的合理边界,别指望它替你做决定。
坑2:扫完也不隔离
现象:你明知某个 skill 有问题,装完之后它还是在你的完整权限下跑。
根因:沙箱隔离不在它的职责里。扫归扫,跑归跑。
解法:高风险又非装不可的,自己找隔离环境跑。别把兜底这件事交给扫描器。
坑3:规则库有边界
现象:有的 skill 扫完 0 分,你还是觉得不对劲。
根因:64 种模式是覆盖面,不是能力上限。静态分析有漏检也有误报,新模式得靠人往库里加。
解法:重要的 skill 别只跑静态那层,把语义分析开起来。说一套做一套这种最阴的问题,只有那层有机会捞出来。
挑姿势:你该用哪一种
三种场景,三种用法,对号入座。
如果你只是偶尔装一两个别人的 skill:skillspector scan ./my-skill/ --no-llm 就够了。快,不用配 API key,静态那层能挡掉绝大多数低级问题。
如果你在给团队搭内部 skill registry:必须上 SARIF 接 CI,每个 skill 进库前过一遍,Critical 和 High 直接卡住,别靠人自觉。
如果你要审的是那种带脚本、带网络请求、还挂了 MCP 连接的重型 skill:语义分析别省。它抓的正是描述和行为对不上这类最难肉眼发现的问题。
顺带提一个容易被忽略的成本。skill 装得越多,Agent 每次要加载的上下文越重,工具调用的选择开销也在涨。这层开销跟安全无关,但一样拖慢你。关于这方面的取舍,Pi 1.0 里有更细的讨论。
别把信任交出去
Skill 生态最舒服的地方,也是最危险的地方:它默认信任你。
SkillSpector 干的事其实很朴素,把这份默认信任换成一次检查。装之前多花三十秒,看一眼它声明了什么、实际干了什么、依赖干不干净。仅此而已。
它不会替你做决定,也不该替你做决定。它只是把你本来就该看、但从来没看过的东西,摆到你面前。
回到开头那句。你装了几十个 Skill,有没有哪个是你真读过的?现在有个工具能替你读一遍了。
信任不该是默认设置,检查才是。
关注圈圈,持续带你玩转 AI 工具。
暂无评论内容