三行 Markdown 换一份凭据:Agent 技能的供应链问题

2026-10-18T07:00:00+08:00 | 5分钟阅读 | 更新于 2026-10-18T07:00:00+08:00

@
三行 Markdown 换一份凭据:Agent 技能的供应链问题

装一个 skill,本质上是在自己机器上执行一段陌生人的 Markdown。

大多数人脑子里还没这根弦。去年大家还在手写提示词,今年已经习惯了用一条 npx skills add 装一个技能包。装的过程太轻了:没有权限弹窗,没有安装向导,也不用重启。装完的下一秒,这段文字就开始参与你的每一次任务。

目录上线,性质就变了

昨天 GitHub 趋势榜前列一下冒出三个目录型项目:anthropics/claude-plugins-official 当天 1383 星,定位是官方维护的高质量插件目录;cursor/plugins 384 星,发的是插件规范和官方插件;还有 github/awesome-copilot,社区贡献的指令、agent 与 skill 集合。

单独看都是好事,说明生态在收敛。放在一起看,意义不一样:skill 从「我自己写的几段话」变成了「从目录里装的东西」。

arXiv 上那篇对 agent skill 的实证研究给了个有时间感的数字:社区注册表上线三个月,收录超过 98000 个 skill,基本没有安全审查。

三个月,九万八千个包。

已经发生的事

Snyk 在 2026 年 2 月做了一次全面审计,扫了 ClawHub 和 skills.sh 上的 3984 个 skill:

  • 13.4%,共 534 个,至少有一个 critical 级安全问题
  • 36.82%,共 1467 个,至少有一个任意级别的安全缺陷
  • 人工复核确认 76 个恶意载荷,用途是窃取凭据、装后门、外传数据
  • 报告发布时,这 76 个里还有 8 个公开挂着

另一组数来自 Koi Security 对 ClawHub 的审计:2857 个 skill 里 341 个恶意,感染率 12%,其中 335 个来自同一次协同投放。

OWASP 的 Agentic Skills Top 10 把这类问题编成 AST01,给出的一个实例是:三行 Markdown 就足够把凭据送出去。

手法并不高级。最常见的是伪装成「前置准备」,让你下一个带密码的压缩包,里面是键盘记录器;或者跑一条混淆过的 shell 命令,去拉 AMOS 这类商品化窃密程序,目标是浏览器数据、加密钱包、各类云平台 token。再往下是抢注名字(把 trading 拼成 traiding)、base64 与 Unicode 走私、伪装系统消息,以及最经典的「忽略之前的指令」。这些套路在 npm 生态里都演过一遍。

Snyk 的统计里有个细节值得看:确认恶意的样本中,100% 都带恶意代码模式,91% 同时用了提示注入。两套手法是配套的,先用注入把 agent 的安全判断按下去,再让代码跑起来。

模型的防线拦不住

原因有两条,都跟「模型能不能看出来」无关。

第一条是权限继承。skill 拿到的是 agent 的全部权限:shell、文件读写、环境变量里的凭据、发消息的通道,还有跨会话保留的记忆。它不是沙箱里的一个函数,它是坐在驾驶位上的乘客手册。

第二条更直接,叫 dynamic context。Claude Code 的 skill 支持用 ! 开头写 shell 命令,这些命令在渲染后的内容送进模型之前就已经执行完了。Datadog 安全实验室的测试里,恶意命令就是这样跑掉的:模型看到的是一份干净、合理的技能说明,事后追问它,它反而夸这次攻击设计得巧。

模型级的提示注入防御在这里没有介入点。等它读到这行字,东西已经执行完了。

最容易漏的入口是仓库

大家盯着市场,真正麻烦的是代码仓库。

Claude Code 加载 skill 的位置不止一个:企业策略、~/.claude/skills/、项目里的 .claude/skills/、插件目录,还有 monorepo 中嵌套包的 skills 目录和 --add-dir 引入的目录。优先级是企业高于个人,个人高于项目。

这意味着两件事。

其一,clone 一个仓库就等于安装。别人提交的 .claude/skills/,你 pull 下来,在这个目录里打开 agent,它就加载了。你从来没去过任何市场。

其二,优先级本身可以被利用。同名 skill 会被上层目录盖掉,这是设计意图;反过来,一份根目录干干净净的仓库,也可能把行为藏在嵌套包里,等你切进那个子目录时才生效。

官方目录解决的是来源,不是行为

这里得说清楚官方目录的价值边界。

签名和审核能回答「这是谁发的」,回答不了「它会不会去读你的 ~/.aws/credentials」,也回答不了「它今天更新之后还做不做原来那件事」。元数据可以审,行为得跑起来才知道。而 skill 的行为是用自然语言写的,传统 SAST 扫不到,这就是 Snyk 那类工具要另起一套「模型加规则」的原因。

所以目录上线是必要的一步,但它把风险从「来源不明」换成了「来源可信,行为待查」。后一种更容易让人放松警惕,因为有个官方的章盖在那儿。

我现在的做法

几条今天就能落地的:

  • skill 当代码 review。看 diff,不看 star。一屏 Markdown 里藏一句话,只有逐行读才发现。
  • 把账号年龄和发布历史当信号。一周新号加四十个同模板技能,这个组合本身就够可疑。
  • ! 命令当成执行权限。企业环境可以用 disableSkillShellExecution 关掉,个人环境至少要知道哪个技能里有。
  • 把 .claude/ 的改动纳入 review,写进 CI。它现在和 Dockerfile、CI 配置属于同一类东西。
  • agent 用独立账号或容器跑,环境里不放长期云凭据。真出事的时候,损失面取决于它手上有多少东西。
  • 留遥测。事后要能回答四个问题:跑了什么、碰了什么、连到哪、哪些凭据需要轮换。

最后

包管理器的历史大概率会重演:抢注、投毒、维护者账号被接管、下游大面积受影响。区别在于这次的入口是自然语言,而自然语言没有语法检查器。

skill 的便利和它的攻击面是同一件事。它好用,是因为它能改 agent 的行为;它危险,也是因为它能改 agent 的行为。


参考来源

Me

Cut out summary from your post content here.

The remaining content of your post.