给 Agent 装一个 Skill,你以为只是多了一份说明文档,实际上可能带进脚本、依赖、工具权限,甚至藏着能改写 Agent 行为的指令。NVIDIA 开源的 SkillSpector 就是干这个的:装之前先做一遍静态审计,让你知道这东西到底会不会越权。
Skill 藏的问题,人工看不全
一个 Skill 早就不只是几段自然语言说明了。它可能带 Python、Shell 脚本,声明第三方依赖,还会申请 MCP 工具权限。自然语言指令可能诱导 Agent 偏离原有规则,脚本可能偷偷读环境变量或者发起网络请求,依赖包里可能藏着已知漏洞,工具描述写的和实际干的也未必是一回事。
官方给过一个数字挺唬人的:被扫描的 Skill 里 26.1% 存在漏洞,5.2% 表现出疑似恶意意图。你光看项目名、截图、Star 数,根本判断不出这些。每个仓库的写法结构都不一样,靠人工逐个核对,很难保证每次都够仔细。
扫完没报错,不代表没风险。静态检查只能做初筛,误报漏报都会有。命中一条规则不等于真有问题,有些恶意指令也压根不会直接写敏感词,而是混在看起来正常的话里,光靠关键词匹配容易漏。SkillSpector 的做法是把快速、可复现的静态检查放前面,再用可选的 LLM 去处理"说明和行为对不对得上"这种更难判断的事。
报告还得能落地才有用。只在终端里瞟一眼,团队没法复用。它同时支持 JSON、Markdown、SARIF 三种格式,给出 SAFE、CAUTION、DO_NOT_INSTALL 三档建议加退出码,你可以直接写进脚本里自动判断。不过 CAUTION 到底是提醒还是直接拦下来,还是得你自己定策略。
扫描怎么跑起来
流程分三段。第一段是摄取输入,不管你给的是本地目录、单个 Markdown、ZIP 还是 Git URL,它都会先纳入受控范围,检查脚本、依赖、工具配置,遇到超大文件或者会膨胀的压缩包会自动限制读取深度和时间,免得把你的检查环境拖垮。命令行入口是 skillspector scan <input>,它本身不会执行被扫描的代码,分析的只是文件内容和元数据。
第二段是风险检查,分静态和 LLM 两路。静态部分覆盖 AST 危险调用识别、污点追踪(数据从哪来、流到哪去)、YARA 签名匹配、依赖漏洞查询,依赖漏洞这块会把包名和版本发给 api.osv.dev 查,断网时退回本地漏洞名单。检测的规则数量官方口径不太统一,README 有的地方写 68 条、有的地方写 71 条,覆盖 17 个类别,这个数字后续大概率还会变。命令示例:
LLM 辅助那一步默认是开着的,会把需要判断的文件内容发给你配置的模型服务,比如 OpenAI。这一步能抓到没写敏感词但语义有问题的指令,但代价是内容要出本机——涉密代码、客户资料、密钥,先想清楚能不能外发,不能外发就一直挂着 --no-llm。
第三段是报告和长期接入。扫描结果打分 0-100,退出码只反映分数是否超过 50,CAUTION 同样返回 0,所以自动化脚本不能只看退出码,得读报告里的 recommendation 字段。如果 analysis_completeness.is_complete 是 false,说明有内容没扫完,分数再低也不能当安全结论。团队长期用的话,可以用 skillspector baseline 把已经人工确认过的问题记下来,下次扫描只提示新增风险;还能跑 skillspector mcp,让其他 Agent 在装 Skill 前直接调用它当工具——但这个 HTTP 服务默认没有登录验证,不能直接暴露到公网。
为什么这套流程站得住
它没有把所有检查塞进一个超长提示词,底层是一条分阶段的 LangGraph 工作流:先解析输入建上下文,再并行跑多个分析器,最后由汇总节点做语义过滤、判断完整度、出报告。这个设计有两个好处——--no-llm 也能走完整的本地静态路径,适合先做隐私敏感的预检;资源边界提前设好,下载、解压、递归扫描都有上限,到了上限就留 partial 或 incomplete 记录,不会把"没来得及看"伪装成"看过没事"。
装起来 & 用的边界
安装用 uv 最简单:
只在需要 MCP 功能时才装带 MCP 的版本,已装过基础版要加 --force 重装:
想改源码可以按 README 配 Python 3.12 以上环境跑 make install,不想装 Python 就用项目自带的 Dockerfile。项目是 Apache-2.0 协议,只做 --no-llm 本地检查不需要任何模型密钥。
它终究是静态审计,不是沙箱,不会隔离你之后真装上的 Skill,高风险环境还是得配合容器或其他运行时隔离,按最小权限原则来。非英语内容、图片里的文字、加密或编译后的代码、只在运行时才触发的行为,都可能扫不到。在线依赖查询和 MCP 部署也各有网络边界,OSV 不可达时能发现的漏洞会变少。
如果你经常从 GitHub、技能市场或者团队仓库往 Agent 里装 Skill,这道安装前的检查值得加进流程里;真要是自己写的、没脚本不碰敏感数据的一份短说明,人工通读可能反而更快。装完之后的权限和隔离,终归还是你自己的责任。