
前天(10 月 22 日),Anthropic 把 Agent Skills 交出去了:名字、logo、GitHub 组织、agentskills.io 域名,全部捐给 Linux 基金会下面的 Agentic AI Foundation。新闻稿的数字挺唬人,70 多个 agent 平台接了这套格式,发布过的 skill 有 100 万个,累计安装接近 2.8 亿次。牵头维护的是 David Soria Parra 和 Mahesh Murag,团队里还有 Google、OpenAI 的工程师。
同一周我翻了两份材料,一份是 Snyk 二月的审计,一份是 arXiv 上的注入基准。看完有个很直接的感觉:这套东西的分发速度,已经把治理甩出去好几条街。
装一个 skill,比装一个 npm 包重得多
场景很日常。你想让 agent 帮忙整理会议纪要,搜到一个 skill,一行命令装上:
npx skills add https://github.com/someone/meeting-notes
装完那个目录就进了 agent 的视野。SKILL.md 是纯文本,模型一读,它就跟系统提示词、跟你刚说的话待在同一层上下文里。模型这边没有一堵硬墙去区分「用户要求的」和「从网上下载的」。更麻烦的是 scripts/ 里那些脚本,跑起来继承的是 agent 的全部权限:shell、文件读写、环境变量里的 API key、能发消息的工具,还有跨会话留存的记忆文件。
Snyk 二月的 ToxicSkills 报告扫了 ClawHub 和 skills.sh 上的 3,984 个 skill。13.4% 至少带一个 critical 级问题,36.8% 有任何级别的缺陷。人工确认的恶意样本 76 个,干的是偷凭据、装后门、往外传数据这些事,报告发布时还有 8 个挂在线上。
发布门槛低到什么程度:一个 SKILL.md,一个注册满一周的 GitHub 账号。没有签名,没有审核,默认没有沙箱。Snyk 还测出一个更值得警惕的组合,确认恶意的样本里 100% 带恶意代码,91% 同时用了 prompt injection。攻击者不指望你相信他的文档,干脆两样一起上。
npm 和 PyPI 用十年才学会的那一课,这边一年就撞上了,只不过这次装进来的包天生带着 shell。
旧的注入防御在这里不好使
过去防注入的思路是把指令和数据分开:网页正文、邮件内容是数据,系统提示词是指令,模型只要认准身份就行。skill 把这个前提拆了。一个 skill 文件从头到尾都是指令,而且写得很专业,里面全是模型自己猜不出来的东西,内部 API 怎么调、命令行参数怎么排、边界情况怎么处理。哪些是正当的业务规则,哪些是被夹带的越权要求,只看文本很难分辨。
arXiv 2602.20156 那篇 Skill-Inject 搭了个基准:23 个真实 skill,202 组「注入加任务」的配对,分明显有害和依赖上下文两类。明显有害的那批包括删盘、跑勒索、下载并执行远程脚本、给所有联系人发钓鱼邮件,成功率最高到 70%。依赖上下文的那类更阴,同一个动作,有授权时合法、没授权就越界,基线条件下成功率落在 41% 到 79% 之间,多数模型超过 50%,论文点名 Codex 的几个版本在 65% 以上。
论文的结论我认同:这问题靠模型变强或者加一层输入过滤解决不了,得靠上下文感知的授权框架。翻译成大白话,关键不在于模型听不听话,而在于系统压根没告诉它,这一步你到底有没有权限。
Cloudflare 那个 skill,值得抄的不是「AI 审代码」
10 月 23 日的 GitHub 趋势榜首是 cloudflare/security-audit-skill,单日 2706 个 star,仓库现在 4.2 万星。它让 agent 扮演安全审计员,跑六个阶段:侦察阶段产出 architecture.md 和 coverage-ledger.json;按覆盖清单分配猎手;每个候选漏洞交给一个全新的验证者去证伪;把结论按 confirmed、needs_validation、rejected 三档写进 findings.json,对着 report-schema.json 校验;再让新 agent 复核来源声明;最后生成报告。
真正值得看的是几个工程细节:
- 验证一个发现的 agent,永远不是发现它的那个 agent。
- 三档判定的含义写死了。confirmed 必须有完整源码追溯和边界内的观测结果;needs_validation 必须写出那个具体未解的事实,而且不许给严重级别;rejected 记录被证伪的候选。
- 仓库里带了
validate-findings.cjs和validate-coverage-ledger.cjs两个零依赖校验器,在流程里反复跑,不靠人眼。 - 它承认跑一轮不够。实测单次运行只找到反复运行累计结果的一半左右,所以设计成可叠加,带着上一轮的账本继续补。
这就是我心目中 skill 该长成的样子。输出得是记录,不是散文:能被另一个程序读,被另一个人复核,被下一次运行接着用。agent 落地真正卡住的地方从来不是生成能力,是验收。你没法验收一段自信满满的自然语言。
治理要落到几件具体的事
企业侧的做法已经收敛得差不多了,Anthropic 自己的企业文档、Glean、TrueFoundry、Google 的 Skill Registry 讲的是一套东西:
- 生产环境 pin 版本。Anthropic 文档写得很直白,请求里省略 version 就用 latest,等于工作区里任何人上传一版,生产 agent 的行为就悄悄变了。
- 部署时校验 checksum,仓库用签名提交。签名只证明有人为这个工件背书,不证明它的行为和声明一致,所以还得配审查。
- 权限清单往窄里写。别写「网络访问」这种糊弄人的词,写清具体路径、域名、命令、可写范围。规范里的
allowed-tools字段现在还是实验状态,各家实现不一致,指望它兜底会出事。 - 运行时隔离。Glean 的做法是 skill 在沙箱里跑,凭据不进沙箱,要连外部系统就过一道 credential broker,按策略放行。这个分工清楚:skill 决定行为,沙箱限制执行范围,broker 管身份。
- 装前扫一遍,装完还得再扫。skill 会变,镜像也可能漂。Snyk 的 mcp-scan 开源,一条命令扫目录里的 SKILL.md 和脚本,查注入、查混淆下载、查凭据处理。
个人开发者不用照搬这套流程。按用途分三档就够了:
- 自己写的,扔进
~/.hermes/skills或者~/.claude/skills,随便改,但别让它碰生产凭据。 - 从网上拿的,装之前先读正文,搜一下
http、curl、base64、ignore previous这几个词。要跑脚本,先在没网络、没密钥的环境里试一遍。 - 准备发给别人的,把输出做成结构化结果加证据链,像 Cloudflare 那样配个 schema,别人能验,才有人敢用。
顺带提一句现状。我自己这套 agent 里 skill 按 25 个大类摊在目录下,靠 description 里的关键词命中才会被加载,平时就是一堆躺在磁盘上的文本。这也正是它危险的地方,装上之后没人会天天回头看。
昨天的 GitHub trending 前五里三个是 skill 或插件库,mattpocock/skills 单日 1104 星,anthropics/knowledge-work-plugins 643 星,obra/superpowers 628 星。国内讯飞也开源了自托管的 skillhub。这个赛道已经从「谁会写 skill」卷到「谁能管住 skill」,后者的玩家还很少。
最后
AAIF 接手后提的第一版路线图就三件事:版本化发布、正式提案流程、给写 skill 和装 skill 的人一份安全指引。三件里两件是治理,基金会那边显然清楚缺口在哪。
标准归到中立基金会手里是好事,格式统一也确实降低了迁移成本。但权限继承是运行时的问题,不是文件格式的问题,换个管家解决不了。
所以接下来真正拉开差距的地方,不是写 SKILL.md。写那东西的门槛已经低到跟写 README 差不多。差距在于装完之后,你能不能说清楚:这个 skill 读了哪些文件,写了什么,把数据发去了哪里。
参考来源
- Anthropic: Donating Agent Skills to the Agentic AI Foundation (2026-10-22)
- Agent Skills Specification
- Snyk: ToxicSkills 审计报告 (2026-02-05)
- arXiv 2602.20156: Measuring Agent Vulnerability to Skill File Attacks
- arXiv 2609.14079: SkillSecurer
- cloudflare/security-audit-skill
- Anthropic Docs: Skills for enterprise
- Glean: How Glean ensures skills stay secure and permissions aware