Paper

论文速读:SkillGuard 给 Agent Skills 套上权限沙箱

6 min read ·

💡 一句话总结:SkillGuard 把每个 Agent Skill 当成「带权限的可执行制品」来治理——用清单声明它能干什么,用运行时访问控制保证它不越界,默认拒绝一切未声明的能力。一个被污染的 skill 即使骗过了 agent,也碰不到它没被授权的工具和资源。

一、Agent Skills 火了,但权限是个黑洞

2026 年,Agent Skills 成了扩展 agent 能力的主流方式。无论是 Claude Code 的 skills、各类 MCP server,还是各家 agent 平台的「技能市场」,思路都一样:把可复用的指令、脚本、工具绑定打包成一个「能力包」,让 agent 在需要时自动加载。开发者从社区下载一个 skill,agent 就立刻多了一项本领——体验确实丝滑。

但丝滑的背后藏着一个被普遍忽视的问题:这些 skill 到底有多大权限,谁在管?

SkillGuard(arXiv 2606.03024)一针见血地指出现状的漏洞:skill 能向 agent 注入指令、脚本、工具绑定和上下文依赖,而现有防御机制要么只做静态检查(加载前扫一眼内容),要么只管单次工具调用(每次调工具时审一下)。这中间留下了一个巨大的空隙——

没有人在管「一个 skill 究竟能向 agent 注入什么」和「它在运行时会造成什么实际后果」之间的关系。

类比一下就很清楚:这就像你装手机 App 时,既不看它申请了什么权限,运行时系统也不拦它访问通讯录和相册。在传统软件世界里这是不可想象的,但在 Agent Skills 生态里,这恰恰是默认状态。

二、威胁模型:一个被污染的 skill 能干什么

论文构建了针对 skill 的威胁模型,评估了两类注入攻击,给出的攻击成功率(ASR)相当扎眼:

攻击类型攻击成功率(防护前)
上下文注入(context injection)32.37%
显式注入(overt injection)25.56%

上下文注入指的是把恶意意图藏在 skill 的上下文依赖、示例、描述里,潜移默化地影响 agent 行为,隐蔽性高;显式注入则是更直白的恶意指令。三成左右的成功率意味着什么?意味着如果你的 agent 用了来路不明的 skill,攻击者有不小的概率能让它做出你没授权的事——读取敏感文件、调用危险工具、把数据外发。

更麻烦的是 skill 的复用性放大了风险。一次性的 prompt 注入打一发就没了,但被污染的 skill 会在每次触发该技能时反复生效,相当于一个常驻后门。

三、核心思路:把 skill 当成「带权限的可执行制品」

SkillGuard 的核心主张可以浓缩成一句话:

不要把 skill 当成无害的文本,要把它当成一个「承载权限的可执行制品」(permission-bearing executable artifact)来治理。

这个视角的转变是整篇论文的根。一旦你承认 skill 是「会执行、有副作用」的东西,传统软件安全里成熟的那套——权限声明、最小权限、默认拒绝、运行时监控——就都能搬过来用。skill 不再是个随便加载的 markdown,而是个需要被授权、被约束、被审计的执行单元。

四、双平面治理:清单 + 运行时

基于这个视角,SkillGuard 设计了双平面治理模型,把治理拆成「声明」和「执行」两个平面:

平面一:技能清单(skill manifest) 每个 skill 必须有一份清单,声明它需要的能力——能调用哪些工具、能访问哪些资源、能读写哪些路径。这相当于把「这个 skill 能干什么」从隐藏的、散落在脚本里的行为,提升成显式的、可审计的声明。

平面二:运行时访问控制(runtime access control) agent 真正执行 skill 时,SkillGuard 逐项核验它的行为是否在清单声明的范围内,默认拒绝一切未声明的能力。

围绕这两个平面,论文还配了四个关键机制:

这套组合的精妙在于纵深:清单让风险可见,默认拒绝兜底越权,能力推断降低落地成本,用户中介处理高危操作,行为监测补上运行时的最后一道关。

五、实验数据怎么看

论文在 315 个真实世界 skill 和自建的 SkillInject 数据集上做了评估,几个关键数字:

怎么解读「降到 23% 而非清零」?这正是权限框架的定位——它不负责消灭注入本身,而是限制注入得逞后的破坏半径。攻击者就算骗过了 agent,没在清单里声明的工具和资源它依然碰不到。所以 SkillGuard 是纵深防御的一层,要和输入侧的注入检测、输出侧的监测叠加,而不是单点银弹。论文自己带了行为监测,也正是承认了这一点。

六、对开发者的启示

即使不等官方实现,SkillGuard 的思想今天就能指导你怎么安全地用 skill 生态:

  1. 最小权限:给每个 skill / MCP server 只开它真正需要的工具和路径,别一把梭开全权限。
  2. 来源审查:从公共市场拿来的 skill 当成不可信代码看待,加载前确认它绑定了哪些工具、会跑什么脚本。
  3. 默认拒绝:把「未明确允许即拒绝」设成你 agent 系统的默认安全姿态。
  4. 运行时可见:开启工具调用日志和行为监测,让「某个 skill 在背后做了什么」可观测、可回溯。

结语

Agent Skills 把 agent 的能力扩展做到了极致丝滑,但 SkillGuard 提醒我们:任何能向 agent 注入指令和执行脚本的东西,都应当被当成需要授权的可执行制品,而不是无害文本。它把传统软件安全里验证过的权限治理范式,系统地搬进了 skill 生态。

随着 agent 越来越多地依赖第三方 skill 和 MCP,今天这种「装上就用、权限全开」的草莽阶段注定会过去。SkillGuard 给出的清单 + 默认拒绝 + 运行时监测的框架,很可能是 skill 生态走向成熟时绕不开的基础设施。

Frequently asked questions

Agent Skill 和普通的 prompt 注入有什么不一样,为什么单独研究?
普通 prompt 注入是攻击者在用户输入或检索内容里塞恶意指令,作用范围是一次请求。Agent Skill 的风险面更大:skill 是可复用、可被 agent 自动加载的「能力包」,往往包含自然语言指令、脚本、工具绑定和上下文依赖。一旦某个 skill 被污染(比如从公共市场下载了一个看似无害的 skill),它会在 agent 每次触发该技能时反复生效,还能调用绑定的工具、读写文件、串联其他 skill。换句话说,它从「一次性注入」升级成了「常驻的、带执行能力的注入」,所以值得单独建威胁模型。
SkillGuard 说的「双平面治理」具体指什么?
两个平面分别管「声明」和「执行」。第一个平面是 skill 清单(manifest):每个 skill 必须声明它需要哪些权限——能调哪些工具、能访问哪些资源、能读写哪些路径,相当于手机 App 的权限清单。第二个平面是运行时访问控制:agent 真正执行 skill 时,SkillGuard 按清单逐项核验,没声明的能力一律默认拒绝。前者把「这个 skill 能干什么」显式化、可审计,后者保证「它运行时不能越界」。两个平面合起来,才补上了「能注入什么」和「运行时后果」之间的空隙。
清单要手写吗?给几百个 skill 都补上清单不现实吧?
论文专门处理了这个落地痛点——清单可以自动生成。SkillGuard 通过分析 skill 的内容和行为来推断它需要的能力,自动生成清单,报告的 F1 达到 91.0%。这意味着面对存量的大量 skill,你不必逐个手写权限声明,可以先自动生成一版再人工审核高风险项。能力推断 + 默认拒绝的组合是关键:即使自动生成漏了某项权限,默认拒绝也会兜底,最多是 skill 功能受限,而不是越权执行。
把注入成功率从 32% 压到 23%,这个效果算好吗?没有清零啊。
要分两层看。第一,权限框架的目标不是消灭注入本身,而是「即使注入发生,也限制它能造成的后果」——攻击者就算骗 agent 执行了恶意指令,没有声明的工具和资源它也碰不到,这是纵深防御的思路。第二,23.02% 仍不算低,说明权限治理是必要但不充分的一层,得和输入侧的注入检测、输出侧的行为监测叠加用。论文里 SkillGuard 本身就带行为监测,正是承认单靠权限挡不住全部,需要多层。把它理解成「给 skill 上了沙箱」,而不是「彻底防住注入」,更准确。
我在用 Claude Code 的 skills 或 MCP,这篇论文对我有什么实操价值?
三条可直接落地的原则。一,最小权限:给每个 skill / MCP server 只授予它真正需要的工具和路径访问,别图省事开全权限。二,来源审查:从公共市场或第三方拿来的 skill 当成不可信代码对待,加载前看清楚它绑定了哪些工具、会执行什么脚本。三,运行时可见:开启工具调用日志和行为监测,让「某个 skill 在背后调了什么」变得可观测、可回溯。SkillGuard 的清单 + 默认拒绝 + 监测三件套,本质就是把这三条原则工程化。
// next.txt ›

Some outbound links in this post are affiliate links — see disclosure.