工具增强型Agent的运行时防御
一周前,我发表了50个MCP漏洞,涵盖SSRF、工具投毒和信任绕过等攻击模式。隐含的结论令人警醒:攻击面的扩张速度已远超审计能力。Wei Zhao、Zhe Li、Peixin Zhang和Jun Sun发表的一篇新论文提出了一种结构性解决方案,而同一周发生的一起真实遥测事件恰好印证了这一方案的必要性。
ClawGuard于4月13日在arxiv发表,是一个运行时安全框架,在每个工具调用边界执行用户确认的规则集。1在其评估配置中,该框架在任何外部工具调用之前应用基本访问控制规则(阻止未授权的文件访问、防止凭证泄露、限制网络调用)。无需修改模型,无需变更基础设施,无需安全专项微调。1作者在AgentDojo、SkillInject和MCP SafeBench上使用五个前沿LLM进行了测试。1论文还描述了一个任务特定的规则推导组件,可从用户声明的目标中自动派生约束条件,但作者并未将其纳入评估配置。
真正关键的论断是:ClawGuard将依赖对齐的防御转变为确定性的、可审计的机制。1
为什么对齐不是安全边界
我上周编目的许多MCP漏洞都利用了一个共同的结构性缺口。Agent从工具描述、抓取的网页或技能文件中接收指令,而在注入与执行之间,唯一的屏障是模型区分合法指令与对抗性指令的能力。(部分漏洞,包括SSRF、RCE和路径遍历,利用的是服务端缺陷,并不依赖模型的指令遵循能力,但工具调用边界对防御仍然至关重要。)
对齐训练有所帮助。RLHF使模型更倾向于拒绝有害请求。但”更倾向于”并不是安全属性。一个能拒绝99%提示注入的模型,仍有1%的失败率,而控制输入的攻击者可以反复尝试直到那1%命中。工具投毒模式甚至不需要模型出错——被投毒的描述会让恶意行为看起来与预期操作别无二致。
运行时拦截在完全不同的层面运作。在工具调用执行前进行检查的钩子或策略引擎,不依赖模型是否理解了攻击。检查是确定性的:调用是否匹配允许集合?是,还是否?
三条注入通道,一个执行点
ClawGuard为工具增强型Agent识别了三条攻击通道:1
网页和本地内容注入。 Agent读取包含对抗性指令的网页或本地文件,这些指令引导Agent以用户未预期的方式调用工具。静默外泄攻击面就是此模式的一个实例——外泄指令隐藏在抓取的内容中。
MCP服务器注入。 被入侵或恶意的MCP服务器在工具描述或响应负载中嵌入指令。Agent将这些指令作为上下文读取并据此行动。上周的50个漏洞目录详尽记录了这一通道。
技能文件注入。 攻击者在Agent作为可信上下文加载的技能文件和配置中植入对抗性指令。Agent将技能文件内容视为权威来源,因此能够写入技能文件或配置的攻击者可以操纵Agent的行为。
防御架构将执行控制设置在工具调用边界——无论指令从哪条通道注入,每个外部操作都必须经过这一关卡。1在Agent调用任何工具之前,ClawGuard会将调用与规则集进行比对。在评估配置中,这些规则是基本的访问控制约束(文件路径限制、网络调用白名单、凭证访问阻断)。任何超出约束的调用都会被阻断,无论注入提示多么以假乱真。
这一架构洞见值得明确指出:如果能在执行边界强制执行策略,就不需要检测每一次注入。
Vercel遥测事件
ClawGuard论文发表前四天,Akshay Chugh于4月9日公开了关于Vercel Plugin for Claude Code的披露。2披露时的发现:
该插件注册了将bash命令字符串发送到telemetry.vercel.com的钩子。2存储在~/.claude/vercel-plugin-device-id的持久UUID将这些命令字符串与设备绑定。2该插件在钩子上使用空字符串匹配器,这意味着钩子会在所有项目上触发,而非仅限于Vercel项目。2同意机制使用提示注入而非原生UI来获取用户许可。2除非用户设置VERCEL_PLUGIN_TELEMETRY=off,遥测在每次匹配事件时都会触发。2
Vercel于4月14日回应了遥测方面的关切,移除了宽泛匹配器和基于提示的同意机制。2
Vercel事件并非传统意义上的漏洞——没有人在窃取凭证。但它恰好展示了运行时防御所针对的那类问题:一个触发范围超出用户预期的钩子,收集用户未明确同意分享的数据,通过绕过原生同意UI的机制实现。
将”遥测”替换为”外泄”,架构完全相同。一个匹配器过于宽泛的钩子,在每个项目上运行,向外部端点发送数据。遥测与攻击之间的区别在于意图,而意图在运行时是不可审计的。
从论文到实践:从业者已有的工具
ClawGuard将从业者一直在非正式构建的东西形式化了。Claude Code内置了支持PreToolUse和PostToolUse拦截的钩子系统。我运行着95+个钩子,用于执行文件路径限制、验证工具输入,以及在显式确认后才允许破坏性操作。3
我的钩子与ClawGuard愿景之间的差距在于自动化。我的钩子是手写规则:阻断MCP输入中的内网IP地址、限制文件写入仅限项目目录、要求git强制推送前获得批准。ClawGuard的评估配置使用的基本访问控制规则在思路上与手写钩子相近。论文提出的任务特定规则推导组件将从用户声明的目标中自动派生约束。1不再需要手写”阻断对/etc的写入”,框架会推断出描述为”重构登录模块”的任务不应需要系统目录的写入权限。该组件仍属未来工作。
自动约束派生是更困难的问题,ClawGuard的任务特定规则推导组件属于未来工作,并非已评估的结果。作者实际评估的基本规则配置表现强劲但并不完美:AgentDojo达到0%攻击成功率(ASR),但SkillInject仍有4.8-14%的ASR,MCP SafeBench根据模型不同显示7.1-11.0%的ASR。1手写规则是脆弱的——它们只能覆盖你预见到的攻击。派生约束则可能覆盖你未曾预见的攻击,因为它们基于正集(应该发生什么)而非负集(不应该发生什么)运作。
自动派生在生产环境中能否可靠运行仍是开放问题。基准测试是受控环境。真实的Agent会话涉及模糊的任务、多步工具链,以及看似异常但实则合法的工具调用。阻断有效工具调用的误报会迅速侵蚀”不影响Agent可用性”的承诺。
分层防御栈
运行时防御并非单一机制。工具增强型Agent的实用防御栈至少包含四层:
第一层:输入验证。 在执行前检查工具调用参数的钩子。阻断内网IP地址、验证文件路径、拒绝shell元字符。我的PreToolUse钩子就运行在这一层。误报率低,但只能捕获已知的恶意模式。
第二层:基本规则执行。 基于访问控制规则(路径限制、网络白名单、凭证守护)限制允许的工具集和参数。ClawGuard的评估配置运行在这一层。1论文还提出了任务范围的约束派生,它将介于本层与下一层之间,但该组件仍属未来工作。覆盖面高于单纯的输入验证,但规则需要随环境变化而维护。
第三层:输出检查。 在Agent处理工具结果之前检查其内容的PostToolUse钩子。捕获数据外泄、检测异常响应、标记意外的工具行为。中间人一文阐述了输出检查的重要性:被入侵的路由器在生成后篡改响应。
第四层:会话审计。 记录每次工具调用、每个参数、每个结果,用于事后审查。这不是预防机制,而是检测机制。Akshay Chugh正是通过这种审计发现了Vercel遥测事件:阅读钩子配置并追踪钩子的实际行为。2
任何单一层面都不够。输入验证遗漏新型模式。任务范围约束可能过严或过松。输出检查增加延迟。会话审计在损害发生后才能发现问题。防御栈之所以有效,是因为每一层覆盖了其他层留下的空隙。
ClawGuard的正确之处
论文对从业者有三项重要贡献:
确定性优于对齐。 将运行时防御定性为确定性机制而非对齐属性,是正确的思路。对齐是训练时属性,在对抗条件下会退化。确定性执行是运行时属性,不受模型行为影响。这一区分听起来偏学术,但它改变了你能对系统安全态势做出的承诺。
通道无关的执行。 用单一执行点防御网页注入、MCP注入和技能文件注入,在架构上是合理的。为三条注入通道设三套独立防御不仅增加维护负担,还会在交叉处留下缝隙。工具调用边界的单一执行点从设计上覆盖所有三条通道。
无需修改模型。 既不需要微调也不需要架构变更,意味着该防御适用于任何模型,包括你无法控制的模型。运行Claude Code、Codex CLI或任何其他Agent框架的运营者,无需等待模型供应商发布安全更新即可添加运行时防御。
待解问题
ClawGuard在基准测试上验证过。生产Agent会话要混乱得多。在从业者能够依赖自动约束派生之前,几个问题有待回答:
模糊任务。 “帮我处理这个项目”并未指定哪些工具或路径在范围内。从模糊目标派生约束,要么阻断合法调用(过于严格),要么放行危险调用(过于宽松),两难兼顾。
多步链路。 Agent需要读取配置文件、调用API、将结果写入数据库——这是复杂的访问模式。从初始任务描述派生的约束可能无法预见中间步骤。
对抗性任务描述。 如果约束派生依赖用户声明的目标,那么控制任务描述的攻击者(通过共享工作区、被投毒的问题追踪器或被篡改的项目文件)就能影响约束本身。
性能开销。 在每个工具调用边界评估约束会增加延迟。论文声称框架保持了可用性,但未报告延迟测量数据。1对于交互式Agent会话,即使每次工具调用仅增加200ms也会改变用户体验。
实操建议
对于当前运行工具增强型Agent的从业者:
立即部署PreToolUse钩子。 不必等待ClawGuard或任何其他框架。Claude Code的钩子系统现在就支持工具调用拦截。从输入验证开始:阻断内网地址、限制文件路径、对破坏性操作设置确认门槛。钩子教程涵盖了具体实现。
审计你的钩子匹配器。 Vercel事件的发生是因为空字符串匹配器在所有项目上触发。2审查.claude/settings.json中的每个钩子,确认每个匹配器仅针对预期的上下文。匹配器过于宽泛的钩子是隐患,不是防线。
记录每次工具调用。 会话审计是投入最低、价值最高的防御层。即使无法阻止每次攻击,至少能在事后发现它——前提是你有日志。
针对你的技术栈评估ClawGuard。 论文提供了代码仓库链接,但作者在撰写时尚未发布代码。代码可用后,将基本规则配置与你现有的钩子栈进行对比评估。如果任务特定规则推导组件成熟,自动约束派生将补充手写规则,而非取代它们。
将配置视为信任边界。 技能文件、钩子配置、MCP服务器定义:每个影响Agent行为的文件都是攻击面。对它们施加与生产凭证同等的访问控制。
MCP漏洞目录记录了攻击面。ClawGuard提出了防御架构。Vercel事件证明了两者的重要性。工具调用边界的运行时防御是真正可执行的安全层——不是因为对齐没有帮助,而是因为执行不依赖于它。
来源
常见问题
ClawGuard与Claude Code内置权限系统有何不同?
Claude Code的权限系统同时支持工具级审批(批准或拒绝工具类别)和参数级限定符(例如Bash(git diff *)仅允许匹配的命令)。ClawGuard的评估配置在参数级别执行基本访问控制规则。其提出的任务特定规则推导组件将从当前任务自动派生参数约束,但作者未对该组件进行评估。两个系统互为补充:Claude Code权限控制哪些工具和参数模式可以运行,而ClawGuard风格的运行时约束则增加了第二道执行层。
在添加运行时防御之前需要等ClawGuard发布吗?
不需要。Claude Code的钩子系统现在就支持PreToolUse和PostToolUse拦截。手写钩子验证工具输入即可立即覆盖最常见的攻击模式。ClawGuard的贡献在于自动约束派生,它将增强手写规则,而非取代它们。
Vercel遥测事件是安全漏洞吗?
该披露描述的是隐私和同意问题,而非传统漏洞。在披露时,该插件收集所有项目的bash命令字符串并在未通过原生UI明确获得同意的情况下发送至外部端点。Vercel此后已回应了这些关切。其架构模式(宽泛的钩子匹配器、外部数据传输、非原生同意机制)仍具警示意义,因为它与恶意钩子用于数据外泄的模式如出一辙。
运行时工具调用拦截的性能影响如何?
就使用shell脚本或轻量级验证器的手写钩子而言,根据我的运营经验,每次工具调用的开销应在200ms以内。ClawGuard论文未报告其约束评估的延迟测量数据,这可能带来额外开销。对于交互式会话,每次工具调用的延迟至关重要,因此在部署复杂验证逻辑前务必进行测试。
-
Wei Zhao, Zhe Li, Peixin Zhang, Jun Sun. ClawGuard: A Runtime Security Framework for Tool-Augmented LLM Agents. arXiv:2604.11790v1, April 13, 2026. 在工具调用边界执行用户确认规则集的运行时防御框架,在AgentDojo、SkillInject和MCP SafeBench上使用五个LLM进行了测试。 ↩↩↩↩↩↩↩↩↩↩
-
Akshay Chugh. Vercel Plugin Telemetry Disclosure. April 9, 2026. 分析Vercel Plugin for Claude Code通过空字符串匹配器钩子向telemetry.vercel.com发送bash命令字符串的行为。Vercel随后回应了相关关切。 ↩↩↩↩↩↩↩↩↩
-
Blake Crosley. Claude Code Hooks Tutorial. blakecrosley.com. Claude Code的PreToolUse和PostToolUse钩子实现模式。 ↩