Skill 是代码,不是文案
Anthropic 的 Agent Skills 规范里,一个 skill 是一个目录:SKILL.md 写指令与元数据,旁边可以带 scripts/、assets/、reference/。agent 在需要时加载它,脚本就可能被执行。它带来的能力很实在,但也意味着你装的不只是「一段提示词」,而是一段能以 agent 权限运行的第三方代码。
这和 IDE 扩展、npm 包是同一类供应链问题。10 月底 Cursor 市场里出现被篡改的 Claude Code 扩展,说明「市场里的东西默认可信」这个假设已经不成立。Skill 目前更多靠 GitHub 分发,没有统一审核,团队得自己补上准入。
第一步:盘点,不要先装
把候选 skill 列成一张表,六列:来源(官方 / 社区 / 个人)、仓库与 commit、许可证、会读什么、会写什么、会不会联网。没有这六列,不要进入试用。来源是个人账号的,至少看一眼提交历史与 issue;只有一两次提交、README 很漂亮但没有测试的,优先级放后。
第二步:读 SKILL.md 和脚本
先读 SKILL.md 的触发条件与权限描述,再读 scripts/ 下的每个文件。重点找这些模式:从网络下载并直接执行、把环境变量整包打印、读写项目目录之外的路径、安装全局包、调用云 API、把用户输入拼进 shell。不是出现就一定恶意,但每一条都要有解释。
grep -RInE 'curl|wget|eval|base64|exec\(|subprocess|os\.environ|~/\.ssh|authorized_keys|token|api[_-]?key' scripts/ SKILL.md
find . -maxdepth 3 -type f -perm -111第三步:隔离运行
- 容器里跑,非 root,项目目录只挂载一份副本,根文件系统只读。
- 默认断网,只放行任务真正需要的域名;需要装包时用内部镜像。
- 用假密钥和假数据跑第一轮,观察它是否尝试读取真实环境变量或 ~/.ssh。
- 记录完整的命令、文件写入与网络请求;没有日志就不算验收。
第四步:锁版本与回滚
不要直接引用 main 分支。把 skill 的 commit SHA 写进清单,最好把目录 vendoring 到仓库里,随代码一起评审。升级走 PR,附上 diff 与三条回归任务的输出;回滚就是 revert 那个 PR,不依赖市场或作者删版本。对必须从远程安装的工具,禁掉自动更新,改为手动升级。
第五步:三条任务验收
给每个 skill 固定三条任务:一条正常路径、一条边界条件、一条应当拒绝的请求。记录输出、耗时、token、是否越权、失败时是否停下来。三条都过,才允许进主分支;任何一条出现「静默失败」或「读到了不该读的文件」,直接退回。
Skill 的准入标准不是「它能不能完成任务」,而是「它失败时会不会越界」。
最后,把这张表放进 CI 或至少放进 PR 模板。人会对新工具兴奋,流程不会。让「来源、commit、权限、回滚」成为合并前必须填的字段,比每次靠人记得检查可靠。