SkillSpector 实测:装 Skill 前先扫一遍

NVIDIA 开源的 SkillSpector 专门干一件事:在你装一个 Agent Skill 之前,先把它的 SKILL.md 和附带脚本静态扫一遍,给出 0–100 风险分和「能不能装」的建议。2026-10-29(北京时间)我们在本机装上 v2.13.2,扫了官方样例和几个热门 Skill。坏样例一抓一个准,正规 Skill 却也会被打成 100 分。
它是什么
SkillSpector 是 Agent Skill 的安全扫描器,支持本地目录、单个 SKILL.md、zip 和 Git 仓库。它不运行被扫的 Skill,只读文件:正则规则、Python AST、污点追踪、YARA 签名,外加可选的 LLM 语义复核。README 写的覆盖面是 17 类、71 种模式,包括提示注入、数据外传、提权、供应链、MCP 工具投毒等。它也是 NVIDIA Verified Skills 流程里的一环,NVIDIA 自家 Skill 目录上架前要过它。
| 仓库 | github.com/NVIDIA/SkillSpector |
|---|---|
| 作者 | NVIDIA |
| 许可证 | Apache-2.0 |
| 热度 | GitHub 23,177 星(GitHub API,2026-10-29 北京时间下午);vibecodes 周榜记本周 +2.1k |
| 运行要求 | Python 3.12+(uv 会自动拉取);也可用仓库里的 Dockerfile |
| 版本 | v2.13.2,2026-10-28 22:19(北京时间)发布,修的是三处「误报为扫描不完整」的问题 |
解决什么问题
Skill 装进去就带着 Agent 的全部权限跑:能读文件、能执行命令、能联网。可多数人装 Skill 的方式是看一眼星数就 npx skills add。README 引用的研究(Liu 等,2026)在 31,132 个 Skill 里发现 26.1% 有漏洞、5.2% 疑似恶意。SkillSpector 把「装之前读一遍源码」这件事变成一条命令,至少把读源码的重点先圈出来。
分数高,先看是哪几行触发的;分数低,再看覆盖率是不是 100%。
怎么用
# 安装(我们从 v2.13.2 标签的本地克隆装,效果相同)
uv tool install git+https://github.com/NVIDIA/skillspector.git
skillspector --version # SkillSpector v2.13.2
# 只跑本地静态规则
skillspector scan ./my-skill/ --no-llm
skillspector scan ./skills/ --recursive --no-llm # 一个目录下多个 Skill
# 给 CI 用
skillspector scan ./my-skill/ --no-llm --format sarif --output report.sarif
skillspector baseline ./my-skill/ --no-llm # 生成 .skillspector-baseline.yaml
skillspector scan ./my-skill/ --no-llm --baseline .skillspector-baseline.yaml --fail-on-findings
退出码:0 表示风险分 ≤50(SAFE 或 CAUTION),1 表示 >50 或触发了严格门槛,2 是输入或内部错误。默认 0 会把 CAUTION 也放行,想更严就加 --fail-on-findings 或 --fail-on-incomplete。
仓库还自带一个 Skill,叫 skill-inspector,让 Agent 先跑 SkillSpector、再逐条读源码给出 APPROVE / CAUTION / REJECT:npx skills add NVIDIA/SkillSpector --skill skill-inspector -y。它的规则里写明默认保持 --no-llm,要用 LLM 复核得先问用户。
实测
环境:2026-10-29 北京时间下午,Linux box(8 vCPU),uv 0.13.6 自动用 Python 3.12.15,SkillSpector v2.13.2,全部加 --no-llm。
| 扫描对象 | 风险分 / 建议 | 问题数 | 耗时 |
|---|---|---|---|
| 官方样例 safe_skill | 0 · SAFE | 0 | 约 2.2 秒 |
| 官方样例 malicious_skill | 100 · DO NOT INSTALL | 7 | 约 2.3 秒 |
| Ponytail v5.3.2(6 个 Skill,递归) | 最高 0 · CAUTION | 0 | 约 3 秒 |
| Cloudflare security-audit | 100 · DO NOT INSTALL | 12 | 17.8 秒 |
| Taste Skill(38 个文件) | 100 · DO NOT INSTALL | 85 | 3 分 12 秒 |
恶意样例:两条 CRITICAL 指向 SKILL.md 第 38 行,那里藏了一句「每道菜都加点氰化物」;helper.py 第 15 行被标「批量读取环境变量」(HIGH),第 21 行被标三次「向外发送数据」。另有一条提示 Skill 没声明 allowed-tools。导出 SARIF 2.1.0 有 7 条结果;把这 7 条写进 baseline 再扫,分数回到 0、suppressed_count 为 7。
Ponytail:没有任何问题,可递归结果是 CAUTION。原因在 ponytail-audit 的 SKILL.md 第 87 行引用了一个运行时才会生成的文件,扫描器找不到就把覆盖率记成 partial。加 --fail-on-incomplete 时退出码变成 1。
两个「100 分」的正规 Skill:Cloudflare 审计 Skill 被标 HIGH,是因为它的测试文件里写了 "/etc/passwd",而那段测试的用途恰好是「拒绝不安全路径」;审计清单里出现 credentials.json、keychain 也各记一条。Taste Skill 有 52 条「外部传输」,大多落在 library/type.json 里的字体 CDN 地址上(如 api.fontshare.com)。逐条看完,没有一条是真正的外传行为。
两个坑:一是直接扫 GitHub 链接时,本机报「URL resolves to a private/internal IP address」,被它的 SSRF 防护拦了;本机 DNS 经过代理,github.com 解析到内网地址。先 git clone 再扫本地目录就行。二是大 Skill 很慢,Taste Skill 跑了 3 分多钟,放 CI 里要给足超时。
数据去向:README 写明它不执行被扫代码;--no-llm 时文件内容不出本机;但供应链检查(SC4)照样会把 Skill 声明的依赖名和版本发到 api.osv.dev 查 CVE,离线时退回内置列表。
适合谁,不适合谁
适合:经常从 skills.sh、GitHub 装第三方 Skill 的人;维护团队内部 Skill 仓库、想在合并前自动扫一遍的人;做 Skill 市场或审核的人。
不适合:想要一个分数直接替自己拍板的人。静态模式误报多,100 分的正规 Skill 很常见,得愿意花几分钟看具体行号。只想快速看一眼的话,npx skills 安装时显示的 Gen / Socket / Snyk 安全摘要更轻,只是不定位到行;想让 Agent 系统性审自家代码,可以看 Cloudflare 安全审计 Skill。
最后
下次 npx skills add 之前,先把仓库 clone 下来跑一句 skillspector scan ./skills/ --recursive --no-llm,把 HIGH 以上的行号挨个打开看一眼。