Claude Skills API 正式可用:可复用提示词变成供应链风险

Claude Skills 可以捆绑指令、脚本和依赖。正式可用让不可变版本与运行时边界变得更加重要。

分享这篇文章

Anthropic 在 8 月 20 日让 Skills API 正式可用,将一个包含指令、脚本和模板的文件夹变成了一个有版本的组件,开发者可以把它附加到 Claude API 请求上。这是有用的打包方式,也是一项软件供应链决策:这个捆绑包可以影响代理读取什么、运行哪些代码、处理什么数据,以及尝试使用哪些其他能力。

安全的默认做法是:将每个 skill 视为可执行材料,一次只接纳一个经过审查的版本,并拒绝任何无法复现其来源、所请求能力、测试证据和回滚路径的更新。一份精心制作的 SKILL.md、市场显示的下载量,或一个沙箱标签,都不够。

一个 skill 同时是指令和执行材料

Anthropic 的正式可用公告将 skill 定义为可以包含指令、脚本和模板的文件夹。开发者上传自定义 skill 并为其建立版本,然后将它们附加到使用代码执行环境的请求上。

这种混合物会击穿一种常见的审查捷径。只阅读传统源文件,会漏掉能够重定向模型的自然语言指令。只阅读 SKILL.md,会漏掉稍后加载的脚本和被引用文件。只审查一次顶层文件夹,会漏掉批准后变得可变的依赖,或批准后上传的新版本。

两篇尚未经过同行评审的论文说明了为什么整个捆绑包都很重要。一篇 2025 年提示词注入预印本展示了隐藏在长篇 skill 指令和被引用脚本中的攻击,包括一个经过测试的案例:先前针对特定任务的批准被带到了一个有害的相关操作中。它的实验覆盖特定代理和配置,而不是每种产品或部署,但它确立了指令文件可以参与真实执行链这一点。

另一篇大型实证预印本从两个市场收集了 42,447 个 skill,并使用结合静态分析和 LLM 分类器的扫描器分析了其中 31,132 个。作者报告称,26.1% 的 skill 至少触发了 14 种漏洞模式中的一种,而包含可执行脚本的 skill 被标记的可能性是仅含指令 skill 的 2.12 倍。

这个结果并不意味着 26.1% 的 skill 具有恶意性。论文报告其检测方法的精确率为 86.7%、召回率为 82.5%,而作者认为强烈暗示恶意意图的高严重性模式只出现在 5.2% 的已分析 skill 中。自动化发现会混合敌意、疏忽、歧义和误分类案例。它们是审查的理由,而不是裁决。

在不同 Claude 界面上,“沙箱化”意味着不同的事情

Agent Skills 概览记录了三种不同的环境。把它们压缩成一个安全性主张,会导致错误的接纳决定。

界面 自定义 skill 如何管理 记录在案的执行与共享边界 接纳后果
Claude API 通过 Skills API 上传,并在整个工作区可用 代码执行容器没有网络访问或运行时安装软件包的能力;除非请求指定现有容器,否则使用全新容器 固定确切版本,按工作区分离租户,并审查请求可用的所有其他工具和上传数据
Claude Code 个人或项目目录下的文件系统 skill 在用户的计算机上运行,并拥有本地程序可用的网络访问权限 将文件系统、Shell、凭据、网络和本地依赖安装视为明确的主机权限
Claude.ai 按用户上传 网络访问随用户和管理员设置而变化;自定义 skill 不会在组织内集中共享 记录实际账户政策,不要继承 API 或 Claude Code 的威胁模型

API 容器的无网络规则是一道有意义的硬边界。它阻止该容器中的脚本调用外部 API,也防止运行时安装软件包。但这不会让捆绑包变得可信。恶意指令仍然可以破坏输出、滥用刻意提供给容器的文件,或将更广泛的代理引向另一个已经授予的工具。审查完整的代理请求和工具集,而不是孤立地审查 skill 容器。

工作区范围同样重要。Anthropic 的 API 指南称,工作区中的每个 API 密钥都可以读取、调用和删除其中的每个自定义 skill。它建议多租户服务为每个租户使用独立工作区。因此,共享的默认工作区是一道授权边界,而不仅是组织标签。

市场事件也是一次版本控制失败

一次当前的攻击活动说明,安装时的声誉不能替代不可变的来源证明。TechRadar 报道,攻击者用相似名称克隆合法 skill,积累下载量,之后引入窃取凭据的行为。

发现并帮助遏制这次活动的安全公司 Zenity 提供了技术时间线。这个恶意家族模仿了 Paperclip 和 Browser Use 项目。它的 skill 文档起初是干净的;后来的修订将有害指令放入一个辅助设置文件,而主 skill 只在安装时加载该文件。Zenity 称,在被下架前,这个家族的聚合显示安装量超过了 170 万,同时警告这些计数既不是独立用户数,也不是受害者数量。

这个案例证明了一次真实活动,而不是证明 Anthropic 的托管 API 沙箱遭到入侵。受影响的 skill 针对的是代理和开发者主机,在那里指令可能导致安装软件包和访问凭据。它留下的持久教训更窄:名称、流行度和先前一次干净的扫描,都不能绑定明天运行的字节。

Anthropic 的 API 已经提供了避免这种歧义所需的控制。自定义 skill 的更新会获得版本 ID,每个版本都是完整快照。API 指南明确建议在生产环境固定一个特定版本;选择 latest 会让新上传的工作区版本立即改变已部署的行为。

正式可用让版本身份成为信任边界的一部分

一个可信的部署必须绑定经过审查的源、完整捆绑包及其依赖、Anthropic 存储的版本,以及运行时授予它的权限。只审查主指令文件,会漏掉辅助设置文件和脚本;只固定仓库提交,会漏掉单独上传的平台快照。刻意使用 latest 就是放弃这种绑定。

运行时遏制和工件审查解决的是不同问题。API 容器的无网络边界限制了已执行代码能够触达的范围,但不能证明某条指令是良性的,也不能证明更广泛的代理不会滥用另一个已授予的工具。反过来,干净的源审查也不会让权限过大的工作区变得安全。市场活动之所以重要,是因为它结合了可变分发、声誉信号和延迟的恶意更改——而不可变版本正是要将这些条件分开。

同一边界也出现在 Snowflake GitHub Actions 调查中:当拥有特权的系统把文本当作代码处理时,文本就变得危险。Slack Code 分析沿着这条链路,从单个代理继续追踪到代码仓库、CI 和部署控制。

当任何实质性边界移动时,批准就会失效

任何信任决定都只覆盖一个捆绑包、一个版本、一个运行时界面和一组能力。指令、被引用文件、依赖、权限、数据类别、外部工具、运行时政策或工作区边界发生变化,就会创建一个实质不同的系统。即使捆绑包没有变化,如果其来源消失或所有权改变,它也可能变得更加危险。

Anthropic 的遏制工程说明明确说明了更广泛的原因:外部代理资源同时带来传统的代码执行风险和提示词注入风险。源审查和版本固定只解决前者的一部分;它们不能证明模型会如何解释每条指令。沙箱限制后果,但模型级防御具有概率性,不能替代环境边界。

正式可用让 skill 复用更容易操作。生产问题不再是团队能否上传一个文件夹,而是团队能否证明运行的是哪个文件夹、它获得了什么权限、测试中发生了什么,以及下一版本不是已批准版本时,能多快撤回这些权限。

资料来源

  1. Anthropic announcement for the generally available Skills API
  2. Claude Platform Agent Skills overview
  3. Claude Platform guide to using and versioning API skills
  4. Anthropic engineering note on containing agents and external resources
  5. Agent Skills prompt-injection preprint
  6. Agent Skills in the Wild empirical security preprint
  7. TechRadar report on a typosquatted skill campaign
  8. Zenity Labs technical report on the skill supply-chain campaign