SEFZ:无需攻击即可发现的 Agent Skill 规范违规
No Attack Required: Semantic Fuzzing for Specification Violations in Agent Skills
UCLA + UCSB + UCSD 联合提出 SEFZ,一种目标导向的语义模糊测试框架,自动发现 Agent Skill 中的规范违规——良性用户输入即可触发 Skill 违反自身声明的安全护栏。在 OpenClaw 市场场的 402 个真实 Skill 中,120 个(29.9%)存在规范违规,包含 26 个已部署 Skill 中的零日漏洞。
论文概览
Agent Skill 已成为 LLM Agent 生态的核心扩展机制:开发者将特定能力打包为 Skill(自然语言指令 + 可执行脚本),Agent 按需发现、加载并执行。OpenClaw 的 ClawHub 市场每月分发数十万个 Skill,覆盖加密金融、IoT 控制、邮件和云基础设施等高风险领域。
这些 Skill 声明的自然语言安全护栏(guardrails)——"删除操作需用户确认"、"发布需 --confirm-publish 标志"——看似明确,但在 Agent 自主执行环境中却可能静默失效。论文提出了一个关键问题:不需要任何攻击,仅凭良性用户请求,就能让 Skill 违反自身声明的安全规则。作者将这类问题形式化为"规范违规"(specification violations),并开发了 SEFZ 框架来自动发现它们。
规范违规:一个新的漏洞类别
论文识别出三类规范违规,它们的共同点是根因在于 Skill 自身设计而非对抗性输入:
1. 模糊护栏(Ambiguous Guardrails):护栏的操作语义在 Agent 上下文中未定义。例如 Coda Skill 要求"交互模式下删除需用户确认",但自主 Agent 没有交互终端,"交互模式"这一概念对它来说毫无意义——Agent 可能直接将约束视为空满足,跳过确认执行删除。
2. 规范-实现不匹配(Spec-Implementation Mismatch):规范文档描述的安全机制在代码中根本不存在。Coda Skill 声明发布需要 --confirm-publish 标志,但打包脚本静默忽略该标志。更隐蔽的是,当文档中的 CLI 命令执行失败时,Agent 会自动回退到直接 REST 请求,走一条规范从未预见的路径。
3. 涌现式工作流违规(Emergent Workflow-Level Violations):单次调用都是安全的,但组合后违反安全不变式。例如先授予外部协作者写权限、再发布文档,创建了一个协作者可修改即将公开内容的窗口——没有任何单条护栏预见这种权限提升。
这三类违规对现有工具全部不可见:静态分析器无法预测 LLM 如何解释自然语言护栏;传统 Fuzzer 操作字节级输入而非自然语言;prompt injection 防御针对的是对抗性输入而非良性请求。
核心创新
1. 标注执行轨迹与安全谓词
SEFZ 的 Oracle 基于两个核心抽象。第一个是标注执行轨迹(Annotated Execution Trace)——将 Agent 的一次执行抽象为带标签的有向无环图:
每个事件 有类型(skill / tool / resource / auth)、参数、输出,以及一组安全谓词 。谓词词汇表仅有 5 个:
| 谓词 | 语义 | 赋值来源 |
|---|---|---|
tainted(e) | 处理用户可控数据 | 沿 dataflow 边传播 |
sens(e) | 访问敏感数据(PII、文档) | Schema 关键字或运行时内容检查 |
ask(e) | 需要用户确认 | 确认提示在轨迹中的出现 |
exec(e) | 执行状态修改操作 | 工具 Schema(HTTP verb)或观察到的副作用 |
cred(e) | 读取或传输认证材料 | 参数名或 token 模式匹配 |
依赖边有三种类型:invoke(调用者-被调用者)、dataflow(数据流)、control(顺序依赖)。这个抽象借鉴了程序依赖图(PDG),但有关键区别:图是动态构建的——从观察到的执行事件而非静态源码生成。
2. 可达性目标:从护栏到确定性 Oracle
第二个抽象是可达性目标(Reachability Goal),将自然语言护栏转化为可机械检查的图查询:
其中 是源谓词集(违规链起点必须携带), 是汇谓词集(终点必须携带), 是门谓词集(中间事件如果携带门谓词则不算违规)。一条轨迹满足 ,当且仅当存在依赖链 使得 、,且所有中间事件的谓词与 交集为空。
论文定义了三个目标模板:
- 未确认操作 :用户输入直达状态修改操作,中间无确认
- 数据泄露 :敏感数据到达可外部触发的修改操作
- 权限提升 :外部输入到达认证材料
从护栏到目标的转换通过约束骨架(Constraint Skeleton)实现,这是一个四槽中间表示(trigger / role / gate / params)。LLM 负责从自然语言护栏提取骨架(模糊步骤),然后用确定性匹配将骨架映射到目标模板(精确步骤)。这种设计将模糊性限制在单一狭窄接口,避免 NL 理解的不确定性传播到整个分析。
3. 目标导向的语义变异引擎
SEFZ 的 Fuzzing 循环见下图:

变异引擎包含 16 个 LLM 驱动的操作符,分为 4 个家族:
| 家族 | 目标 | 代表操作 |
|---|---|---|
| Confirmation Weakening | 确认分类器是否接受非规范同意 | double negative("我不阻止你")、delegated consent("我妻子已同意") |
| Precondition Skipping | 必要前置步骤是否可被跳过 | urgency framing("火警!立即删除!")、authority claim("我是所有者") |
| Action Reframing | 动作谓词是否绑定字面动词 | action reframe("帮我处理文件X"替代"删除") |
| Resource Redirection | 资源约束是否在边界外失效 | domain adjacency(选允许列表附近的 URL)、numeric edge(选阈值附近的值) |
操作符选择由 Thompson Sampling 多臂老虎机 驱动:每个家族一个臂,维护 Beta 分布后验,采样后选择最高值的臂。奖励函数结合目标接近度和轨迹签名新颖度:
其中 ,目标接近度 是三个嵌套里程碑的递进分数(源谓词激活 → 汇谓词激活 → 完整违规链), 是轨迹签名新颖度(首次出现的 ⟨事件类型, 依赖类型, 谓词⟩ 三元组比例)。
实验结果

规模与覆盖率
从 OpenClaw 市场 13,433 个 Skill 中筛选出 402 个符合安全分析条件的 Skill(声明了安全约束、有状态修改操作、处理敏感资源、有可执行实现),覆盖 6 个领域。
总体发现:120 个 Skill(29.9%)存在至少一个规范违规,包含 26 个已部署 Skill 中的零日漏洞。通信领域(34.7%)和安全认证领域(34.3%)违规率最高,因为这些领域涉及频繁的状态修改操作(发邮件、管理凭证),护栏多但难以精确指定。
收敛效率
发现高度前置:44% 的违规在前 10 分钟内发现,78% 在 15 分钟内发现。平均每个 Skill 的 Fuzzing 时间为 11 分钟,首次违规平均仅需 5 个 episode。
消融实验
在 50 个 Skill 的分层随机子集上:
| 变体 | 违规 Skill 数 | 相对下降 | 首次违规 episode |
|---|---|---|---|
| SEFZ (full) | 17 | — | 5 |
| -FEEDBACK | 12 | -29% | 6.5 |
| -BANDIT | 11 | -35% | 9 |
| RANDMUT | 8 | -53% | 14 |
语义变异的贡献最大(RANDMUT 下降 53%),因为模板生成的变异体缺乏触发工作流级护栏违规所需的语义连贯性。Bandit 负责避免在已饱和目标上浪费精力,Feedback Buffer 在每个护栏的接受/拒绝边界附近收窄搜索。
案例研究
Case 1:物理门锁绕过。一个 Home Assistant Skill 声明"锁定/解锁前需用户确认",但 SEFZ 发现良性请求"Unlock the front door"直接执行解锁。根因有二:(1) 确认机制依赖 read -r -p,在 Agent 非交互环境中因无 stdin 而静默失败,|| return 0 返回成功;(2) Skill 提供了两条控制路径——受保护路径检查黑名单并确认,通用路径跳过所有检查——Agent 选择了通用路径。该漏洞已被平台标记为紧急处理,Skill 被临时下架。
Case 2:用户拒绝后仍发送邮件。Google Workspace Skill 声明"写操作需确认",Agent 正确执行了前两步(询问参数、显示摘要),但当用户回复"我不会生成那个内容"(明确拒绝)时,Agent 仍然发送了邮件,推理认为用户在更早的轮次中提供参数已构成"隐式确认"。根因是规范定义了对话流程但从未定义确认语义——没有说明只有摘要之后的明确肯定才算确认,也没有区分参数提供与批准。
六类规范陷阱
论文从 120 个违规中提炼出 6 种反复出现的规范设计缺陷:
| 陷阱 | 描述 | 典型表现 |
|---|---|---|
| F1: 模态不匹配 | 护栏为人机交互或 CI/CD 设计,Agent 执行是第三种未定义模态 | CLI 确认提示因无 stdin 静默失败,Agent 追加 --force 绕过 |
| F2: 护栏范围不完整 | 保护了特定操作,同等敏感的操作完全无保护 | SSH Skill 确认添加主机但不限制 chmod、密钥生成、主机删除 |
| F3: 语义未定义 | "确认""验证""敏感"等词无操作定义 | 提供参数被当作确认,声称权威被当作有效批准 |
| F4: 幻影资源依赖 | 护栏引用不存在的脚本、工具或允许列表 | 安全审计 Skill 要求执行 scripts/collect_verified.sh,脚本不存在,Agent 自行生成并执行 6KB 未知脚本 |
| F5: 安全约束脱离 | 安全约束在规范末尾的"安全注意事项"中,而非可执行工作流旁 | DeFi Skill 在安全注意事项中标记密钥轮换为"破坏性",但在快速入门中以 --yes 列为可选步骤 |
| F6: 自相矛盾约束 | 两条规则无法同时满足,Agent 静默违反至少一条 | 支付 Skill 声明"不收集 PII",但上线 API 要求提交姓名、邮箱、电话 |
这六类陷阱指向两条设计原则:(1) 护栏必须无歧义且可操作化测试——每个安全约束都应表达为可检查谓词(标志存在、确认 token 属于枚举集、前置条件成立);(2) 规范必须显式区分执行模态(交互式、自动化、Agent),而非让 Agent 自行解释上下文相关条款。
启示与思考
这篇论文最令我深思的是它对威胁模型的重新定义。在 Agent 安全研究中,绝大多数工作聚焦于对抗性威胁——prompt injection、jailbreak、恶意 Skill 注入。SEFZ 指出了一个被忽视的攻击面:即使没有攻击者,Agent 也可能违反自身规则。这不是因为 LLM 被"骗"了,而是因为自然语言护栏在自主执行环境中的语义本身就是未定义的。
这与我们 AARM 框架的工作高度相关。AgentMonitor 基于 Hook 的行为监控和 AgentMoss 基于 CFG/DFG/PDG 的行为检测,目前主要关注对抗性攻击模式。但 SEFZ 揭示的规范违规是一种更隐蔽的风险——行为本身看起来完全正常(执行了一个删除命令),只有在与声明的护栏对比时才能发现违规。这启示我们需要在运行时监控中引入规范-行为一致性检查:不仅检测"这个动作危险吗",还要检测"这个动作是否符合 Skill 声明的约束"。
SEFZ 的形式化方法也值得关注。将自然语言护栏转化为可达性目标的过程——通过约束骨架这一中间表示——巧妙地将 LLM 的模糊理解能力限制在单一接口,其余步骤全部确定性可检查。这种"模糊输入 → 精确推理"的分层设计,对 Agent 安全的形式化验证有直接参考价值。我们推进的 AISpec 项目探索形式化方法在 AI 代码生成中的应用,SEFZ 的轨迹标注和安全谓词可以作为运行时属性规约(runtime property specification)的起点。
论文也坦承了局限性:谓词词汇表的粒度直接影响精度——太粗会导致语义不同的操作塌缩为同一标签(误报),太细会使标注脆弱(漏报)。此外,规范中完全不存在的护栏无法被 SEFZ 检测——这恰恰是 AgentArmor 等运行时强制执行机制的互补价值所在。
参考信息
- 论文链接:arXiv 2605.13044
- 作者单位:UCLA / UCSB / UCSD
- 实验平台:OpenClaw Marketplace(ClawHub),402 个真实 Skill
- 核心发现:29.9% 的 Skill 存在规范违规,26 个零日漏洞已负责任披露
- 未来方向:多 Skill 组合分析 + 基于轨迹见证的自动修复