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 复用更容易操作。生产问题不再是团队能否上传一个文件夹,而是团队能否证明运行的是哪个文件夹、它获得了什么权限、测试中发生了什么,以及下一版本不是已批准版本时,能多快撤回这些权限。
资料来源
- Anthropic announcement for the generally available Skills API
- Claude Platform Agent Skills overview
- Claude Platform guide to using and versioning API skills
- Anthropic engineering note on containing agents and external resources
- Agent Skills prompt-injection preprint
- Agent Skills in the Wild empirical security preprint
- TechRadar report on a typosquatted skill campaign
- Zenity Labs technical report on the skill supply-chain campaign