先看一组比例,再决定要不要扫

NVIDIA 的 SkillSpector(Apache-2.0,约 1.8 万 star)在 README 里给了一组统计:在分析过的 31132 个技能子集中,26.1% 含有可被利用的漏洞,5.2% 表现出可能是恶意的意图。技能文件在 Claude Code、Codex CLI、Gemini CLI 里是被隐式信任执行的——安装一个技能,等于引入一段没有审过的代码并给它工具权限。这个比例就是为什么要先扫再装。

它要回答的问题很具体:「这个技能能不能装?」做法是两阶段分析——先跑快速静态分析(覆盖 71 类漏洞模式,分属提示注入、数据外泄、权限提升、供应链、输出处理、记忆污染、工具滥用、MCP 最小权限等 17 个类别),可选再加一层 LLM 语义评估;最后给出 0-100 的风险分与分级建议。

第一步:安装

# 用 uv 装 CLI(推荐)
uv tool install git+https://github.com/NVIDIA/skillspector.git
# 之后升级:uv tool update skillspector

# 需要 skillspector mcp 时,在安装时带上 extra
uv tool install 'skillspector[mcp] @ git+https://github.com/NVIDIA/skillspector.git'
  • 也可以从源码装:git clone 后在激活的虚拟环境里跑 make install(开发用 make install-dev);
  • 不想装 Python 就用 Docker:仓库自带 Dockerfile,把当前目录挂到 /scan 即可。

第二步:先扫一个技能

skillspector scan ./my-skill/                          # 本地目录
skillspector scan ./SKILL.md                            # 单个技能文件
skillspector scan https://github.com/user/my-skill      # Git 仓库
skillspector scan ./my-skill.zip                        # 压缩包

默认会跑 LLM 语义评估;只想看静态结论就加 --no-llm。想用 LLM 那一层需要自备 provider 凭据(例如 Anthropic),用 Docker 时通过 --env-file 或 -e 传入,不要写进镜像。

Docker 路线的一条完整命令长这样:把当前目录挂载到 /scan,扫描其中的技能目录并把 JSON 报告写回宿主机。

docker build -t skillspector .
docker run --rm -v "$PWD:/scan" skillspector scan ./my-skill/ --no-llm --format json --output report.json

第三步:换成机器可读输出,接进流程

skillspector scan ./my-skill/ --format json     --output report.json    # 自己写门禁
skillspector scan ./my-skill/ --format sarif    --output report.sarif   # 给 CI / IDE
skillspector scan ./my-skill/ --format markdown --output report.md      # 给人和文档

接 CI 用 SARIF 最省事:代码托管平台的告警面板能直接读,不用自己解析 JSON。想把风险分卡在流水线里,就用 JSON 输出自己写一条阈值判断。

第四步:批量扫整个技能仓库

python -m contrib.batch_scan.batch_scan ./my-skills/ --no-llm
python -m contrib.batch_scan.batch_scan ./my-skills/ --workers 20 -f json -o report.json

仓库带一个批量扫描脚本,支持并行、多语言检测与三种输出格式。第一次建议只跑静态扫描——快,而且不用配 LLM 凭据;确认噪音水平可接受之后再考虑开语义评估。批量跑 LLM 时官方支持配置多个 API key 组成池来提升吞吐与容错。

第五步:把已知问题压成基线,只盯新增

安全扫描最常见的死法是「第一天全红、第三天没人看」。它的解法是基线:把已确认无需修复的发现写进 glob 规则或指纹基线,之后的扫描只报新增问题。这样告警数量能长期维持在一个团队真会看的水平。

边界与注意事项

  • 它扫的是技能包本身的风险模式,不替你判断技能来源是否可信——作者是谁、仓库历史是否干净,仍要自己看;
  • 输入有硬上限:单次摄入 100MiB、压缩包条目 10000 条,超限直接失败(fail closed),不会静默跳过;
  • 单文件分析上限是 1MB,超出部分不分析——重要脚本别塞在超大文件里;
  • LLM 语义评估需要自备 provider key,走 Docker 时用环境变量或 --env-file 传,别固化进镜像。
技能装进智能体就等于给它工具权限,扫描这一步该像依赖审计一样默认存在,而不是出事之后再补。