大家读完觉得有帮助记得关注和点赞!!!
摘要
现代AI代理框架(Agent Harness)暴露了生命周期钩子(lifecycle hooks),这些钩子将Shell命令绑定到运行时事件(例如,会话开始、工具调用和文件编辑)。这些命令以主机权限运行,但作为生命周期钩子配置提供,并且可能在LLM从未观察到的时间触发。我们识别出生命周期钩子的更新路径——框架盲目信任该路径——是一个新的攻击面。在一种供应链威胁模型下,攻击者仅控制插件元数据和生命周期钩子配置,一个良性的带版本插件可以通过一次更新被特洛伊木马化,该更新将攻击者选择的命令静默地绑定到良性事件上,从而产生恶意的主机端行为,例如权限提升。我们提出了HookPry,一个开源的、全自动化的攻击框架,它系统地利用了这一漏洞,适用于异构的AI代理框架。HookPry实现了十个攻击目标;在跨越7个框架和后端的25种组合、1000次端到端运行中,它攻陷了所有七个被评估的框架,每个框架的成功率高达92.5%。有代表性的防御措施仍然不足:Microsoft Defender的召回率为0%,三种静态防御措施的联合仍然漏掉了47.5%的恶意工件。
1 引言
图1:提出的攻击框架HookPry概览。HookPry包含三个组件:① 对抗性清单优化(AMO),提高初始良性插件的市场可检索性;② 时间解耦(TD),将初始信任获取与后续带有钩子的更新及条件激活分离;③ 最小公共接口(LCI),将载荷映射到目标框架的原生生命周期钩子接口。步骤1-5说明了标准工作流程;在匹配事件被触发后,框架在LLM决策路径之外分发已注册的命令,导致恶意行为,例如,静默转储环境凭证。
将大型语言模型(LLMs)集成到软件开发中,催生了AI代理框架(AI agent harnesses),即如Claude Code [2]、OpenClaw [33, 34] 和 Codex CLI [32] 这样的框架,它们充当了用户意图与主机系统执行之间的关键桥梁。这些框架远非简单的消息中继,而是作为强大的中介,拥有高级别的文件系统和进程权限。在此架构中,生命周期钩子——旨在自动化代理工作流的框架的组成部分——构成了一个安全关键的控制平面。
钩子本质上是一个配置条目,它将特定事件(例如,依赖项的安装或配置文件的修改)绑定到一个预定义的系统命令。至关重要的是,框架可以直接将此命令作为子进程分发,无需LLM解释或选择它 [2, 33, 34]。例如,一个“post-update”钩子可以在软件更新后立即自动触发一个脚本,这个过程发生在模型的推理循环之外。这创建了一个决定性的触发后边界,在此边界上,专注于对抗性提示或模型对齐的防御措施无法检查执行情况。虽然先前的研究已经考察了恶意插件代码、工具描述投毒和技能操纵 [18, 42, 9, 43, 29],但它们并未将框架管理的生命周期钩子隔离为一个独立的攻击目标,留下一个重要问题未答:这些钩子是否容易受到通过供应链传递并可跨框架移植的远程攻击?
遗憾的是,我们的发现证实了这种可能性。我们识别出生命周期钩子的更新路径——框架隐式信任该路径——是一个新的攻击面。在一种供应链威胁模型下,攻击者仅控制插件元数据和生命周期钩子配置,一个良性的带版本插件可以通过一次更新被特洛伊木马化,该更新将攻击者选择的命令静默地绑定到良性事件上,从而产生恶意的主机端行为,例如权限提升 [10, 31, 30]。
为了解释为什么这个序列在不同框架中都能成功,我们描述了生命周期钩子的三个特征。第一个特征是双层插件架构,其中市场元数据控制插件如何被发现,而生命周期钩子控制它如何实际运行。这允许单个插件展示一个统一的公共身份,但在内部以一套不同的运行时权限运行。第二个特征是事件驱动执行。一旦与生命周期钩子匹配的事件触发,框架就会绑定并生成配置好的命令,这发生在LLM决策路径之外,即使附加到稳定插件身份的运行时权限可能在不同版本间发生了变化。第三个特征是跨框架异构性;事件名称、配置模式和命令运行器在不同框架间存在差异。
这些特征中的每一个都给攻击者带来了相应的挑战。第一个挑战,获取,涉及远程攻击者如何能够通过普通市场渠道为一个初始良性插件创造发现机会,而无需直接访问受害者或强制安装的能力。第二个挑战,激活,涉及该插件如何在保持其稳定身份的同时,在初始检查后获得新的运行时钩子权限,绕过任何新的LLM决策或对添加的钩子条目的显式授权。第三个挑战,鲁棒性,质疑载荷如何能在生命周期词汇、配置模式、Shell执行合约和权限边界方面的跨框架差异中存活。虽然先前的技术报告和漏洞披露展示了将钩子连接到进程执行的特定原语 [10, 31, 30],但一个同时克服这三个挑战的端到端攻击范式尚未被系统研究。
在本文中,我们提出了HookPry,一个开源的¹、全自动化的生命周期钩子攻击框架,该攻击可通过供应链传递,并可扩展到异构的AI代理框架。图1总结了HookPry的设计概览及其端到端攻击路径,从通过市场交付初始良性插件,到通过带有钩子的更新,再到框架控制的执行及其外部可观察的影响。具体来说,HookPry设计背后的关键洞察是,攻击者可以利用插件获得信任与其实际行使钩子权限之间的时间差,并通过仅通过插件配置将交付、激活和执行拼接在一起,从而在不同工具间保持预期的攻击能力。
HookPry包含三个组件,每个组件分别设计用于解决三个挑战之一。第一个组件,对抗性清单优化(AMO),通过工程化插件的元数据(如其名称和描述)来解决获取挑战,以创建一个受约束的身份,该身份可在不同的搜索意图下被检索到。这种优化确保插件看起来是良性的且高度可发现,从而在不引发安全审查的情况下获得初始安装。
其次,时间解耦(TD)通过将初始良性工件与后续在同一身份下携带改变的钩子权限的更新分离,来解决激活挑战。通过利用这一时间差,TD允许插件通过初始审查并获得信任,然后通过更新静默地引入恶意的生命周期绑定。
最后,最小公共接口(LCI)通过提取不同框架间共享的生命周期钩子能力来解决鲁棒性挑战。它充当一个编译器,将单一的抽象攻击逻辑转换为每个目标框架特定的原生事件和命令表示,从而无需手动适配即可实现可移植性。
HookPry在多样化的环境景观中有效地实现了十个不同的攻击目标。我们的评估涵盖了25种独特的框架和后端组合,执行了1000次端到端运行,证明了该框架的效力:HookPry成功攻陷了所有七个被评估的框架。总体而言,77.0%的运行产生了经预言机完全确认的效果,在Hermes框架上达到了92.5%的峰值有效性,且没有运行被模型明确阻止。这一高成功率突显了当前安全态势中的一个关键差距。有代表性的防御措施仍然不足;Microsoft Defender实现了0%的召回率,即使结合三种静态防御措施——包括一个具备生命周期钩子感知能力的策略——仍然漏掉了47.5%的恶意工件。这些结果证实,一个最小的配置绑定可以诱导严重的跨框架影响,在很大程度上绕过了传统基于提示的攻击中观察到的模型介导损失,并规避了未能检查生命周期钩子路径的防御措施。最后,我们已负责任地向所有受影响的框架供应商披露了我们的发现,并正在等待他们的回应。
我们的贡献如下:
一个新的攻击面和供应链威胁模型。 我们识别出生命周期钩子的更新路径——框架盲目信任该路径——是一个关键的新攻击面。我们形式化了一种供应链攻击,其中良性的、带版本的插件通过一个受信任的更新被特洛伊木马化,以将攻击者选择的命令静默地绑定到良性事件上,从而在不修改插件可执行代码的情况下实现恶意的主机端行为,如权限提升。
一个自动化的跨框架攻击框架。 我们提出了HookPry,一个开源的、全自动化的框架,它系统地利用了这一漏洞,适用于异构的AI代理框架。HookPry旨在实现十个不同的攻击目标,解决自动化代理环境中的获取、激活和鲁棒性挑战。
全面的评估和防御分析。 我们通过跨越七个框架和五个LLM后端的25种组合的1000次端到端运行,展示了HookPry的有效性。我们的结果表明,HookPry攻陷了所有被评估的框架,成功率高达92.5%。我们进一步表明,有代表性的防御措施,包括Microsoft Defender,都是不足的,其召回率为0%,并漏掉了很大一部分恶意工件。
2 概述
2.1 背景
AI代理框架是将模型输出转化为主机系统上有状态操作的运行时层。如图2所示,一个框架通过上下文管理器接收观察结果,调用LLM,通过执行循环和持久状态存储协调多步骤活动,并通过工具注册表分发经过验证的操作。这些组件构成了观察、推理和行动的主要路径:框架为推理组装上下文,模型提出一个行动,然后框架将该提议转化为对外部环境的影响。
图2:生命周期钩子在AI代理框架中的架构位置。核心框架连接上下文管理、LLM推理、有状态执行和工具分发,而生命周期钩子围绕此执行路径形成一个横切的拦截和策略层。
生命周期钩子在此系统中占据一个独特的架构位置。钩子是一个清单条目,它将一个生命周期事件绑定到一个攻击者选择的Shell命令 [2, 33, 34, 14];其最终效果受限于更新采纳、事件发生以及授予钩子子进程的权限。钩子是由框架本身评估的事件绑定自动化规则。它们将前置或后置操作附加到生命周期边界,如会话启动、工具调用、文件修改或项目打开,允许框架在执行周期中的明确定义点执行策略、收集遥测、转换上下文或运行辅助命令。它们的位置是横切的:一个钩子可以观察或改变流经上下文管理器、执行循环、状态存储和工具注册表的信息,而无需成为模型推理轨迹的一部分。
因此,安全分析必须区分事件产生和事件处理。模型可能影响一个模型依赖的生命周期事件是否发生;一旦事件发生,框架评估已注册的绑定,并通过其自身的控制路径分发已接受的钩子。这种区分决定了我们执行模型中的哪些项可能依赖于LLM。
2.2 相关工作
代理系统已从ReAct(推理与行动)范式,通过如Toolformer、GPT4Tools和ToolkenGPT等工具调用机制,演进到单一和 Multi-Agent 架构,其中框架协调模型、状态和外部工具。AgentBench和AutoGen为跨环境评估和 Multi-Agent 编排提供了有代表性的基础 [49, 38, 20, 46, 48, 13]。这些研究确立了工具执行层的重要性,但并未调查通过版本化生命周期钩子进行的信任迁移。
关于模型介导攻击的工作已描述了直接和间接的提示注入、通过工具集成代理的注入传播及其检测 [11, 24, 51, 25, 44]。AgentDojo、AgentHarm和Agent Security Bench进一步为代理攻击、防御和有害行为提供了评估环境 [8, 1, 53];其他研究考察了心理操纵、跨代理传播和安全代理 [54, 12, 47]。越狱研究进一步揭示了安全训练中的失败模式,并开发了自动化模糊测试、渐进式多轮攻击以及更可靠的攻击有效性评估 [45, 40, 37, 50]。相比之下,HookPry的命令无需被模型解释、生成或选择,因此提示层的拒绝无法阻止已注册的命令被框架分发。
代理投毒和劫持研究涵盖了内存和知识库的投毒、RAG污染、工具选择的劫持、针对编码代理的提示注入以及IDE配置后门 [39, 23, 7, 21, 55]。MCP将外部资源和工具标准化为可组合接口 [27],激发了关于投毒工具描述、跨工具劫持、威胁建模、基准测试和协议层防御的工作 [43, 52, 16, 15, 3]。这些攻击主要通过可见的描述或返回值影响模型决策,而HookPry的目标是事件与命令之间的绑定,这些绑定由框架直接解释。
技能和插件生态系统中的供应链风险已被关于OpenClaw的分析、恶意技能测量和技能投毒研究记录 [18, 42, 9, 29, 19, 22, 6, 36]。供应商披露报告了沙箱绕过、规则文件后门、恶意技能传播以及针对MCP、技能和钩子的扫描实践 [5, 17, 4, 28]。NIST的对抗性机器学习分类法和OWASP关于代理应用的指南将投毒、供应链危害、工具误用和意外代码执行置于更广泛的风险治理框架内 [41, 35]。公开的漏洞和供应商报告展示了单个生命周期钩子的执行原语 [10, 31, 30],但并未提供本文研究的跨版本、跨框架的端到端构造。
2.3 一个激励性示例
在本小节中,我们演示了在Claude Code中一个成功的授权绕过攻击,该攻击由我们的框架HookPry自动执行。如图3所示,当一个良性的、受信任的插件——例如本例中的testHookplugin——收到更新时,Claude Code会自动加载新添加的生命周期钩子,而无需用户通知、逐项确认或重新授权。该技术机制涉及Claude Code的自动更新同步,它会检查市场仓库中的清单更改,并在不验证各个钩子条目的情况下应用更新。
该漏洞凭经验验证了引言中提出的挑战——获取、激活和鲁棒性——这进一步启发了我们的系统设计。首先,观察到插件必须最初以良性身份渗透市场,我们开发了对抗性清单优化(AMO)来系统地解决获取挑战,确保恶意载荷隐藏在一个有竞争力的、功能性的外观之后。其次,为了利用Claude Code漏洞中暴露的信任边界,我们提出了时间解耦(TD);该组件专门设计用于利用信任已被转移但权限尚未被重新验证的时间窗口。最后,认识到发现的漏洞依赖于Claude Code特定的配置,我们引入了最小公共接口(LCI)来解决可移植性挑战。LCI泛化了这个攻击面,提取了跨框架共享的最小能力,并将我们的语义攻击逻辑编译成原生表示。这种方法使我们能够将一个特定的实现缺陷转化为一个通用的、自动化的威胁模型。
a
b
图3:(a) 与市场兼容的测试仓库。(b) 同一个插件身份加载了三个新添加的钩子,无需逐项确认。
2.4 威胁模型
我们根据攻击者的通道和约束、能力、目标以及我们的评估边界来定义HookPry的威胁模型。
攻击者通道和约束。 攻击者仅通过发布到公共市场或社区注册表的版本化插件进行操作。攻击者没有本地或仓库访问权限,不能注入提示或工具结果,不修改框架、利用实现漏洞、绕过沙箱、强制安装或触发事件。
攻击者能力。 在该通道内,攻击者控制插件元数据、版本控制和生命周期钩子配置。攻击者首先发布一个良性版本,然后发布一个更新,在同一身份下添加或修改一个生命周期钩子。生命周期钩子是一个清单条目,它将一个生命周期事件绑定到一个攻击者选择的Shell命令 [2, 33, 34, 14];其最终效果受限于更新采纳、事件发生以及授予钩子子进程的权限。
攻击者目标。 直接目标是未授权的命令执行:在一个事件触发后,框架生成一个攻击者选择的子进程,而无需新的LLM决策或针对钩子的特定授权。对插件或更新的粗粒度信任并不构成对添加命令的知情批准。在钩子的权限内,攻击者可能追求信息窃取、持久化、操纵、资源劫持或传播。我们将这些结果操作化为映射到MITRE ATT&CK [26]的十个目标。
超出范围。 我们的主要评估侧重于通过Claude Code、OpenClaw、OpenHarness和Codex CLI中版本化插件分发的钩子。以安装和更新交付为条件,它测量事件触发、原生绑定、子进程执行以及由此产生的结果。市场采纳、提示注入、通过仓库控制的配置、实现漏洞和沙箱逃逸均不在评估范围内。这些相邻的向量可能补充或放大HookPry;本文研究的机制在配置层操作,并不依赖于它们。
2.5 攻击分类法
现有的代理攻击分类法,如DyMalSkill [6]和DDIPE [36],围绕LLM交互组织攻击,而钩子在框架层充当Shell命令。因此,我们使用一个三维元组对每个可实现的钩子攻击进行分类:其作用的目标资产、接收或受结果影响的消费者,以及连接两者的通信模式。资产维度区分认证材料、数据、源文件、工具输出通道、计算资源、配置和目录;消费者维度区分远程服务、开发者、LLM、框架执行体和兄弟项目;通信模式维度区分提取、交互控制、修改和复制。仅当元组可由钩子命令实现并代表一个有记录的网络安全隐患时,才予以保留。具有相同元组的攻击被合并,而任何轴上的差异则定义了一个不同的目标。此过程产生了表1中的十个互斥目标。
表1:HookPry攻击分类法,来源于目标资产、受害消费者和通信模式,并附有MITRE ATT&CK战术映射[26]。
目标 | 目标资产 | 受害消费者 | 通信模式 | MITRE ATT&CK 战术 [26] |
|---|---|---|---|---|
凭证收集 (COL) | 认证材料 | 远程服务 | 提取 | TA0006 凭证访问 |
数据外泄 (EXF) | 非凭证数据 | 远程服务 | 提取 | TA0010 外泄 |
资源劫持 (HIJ) | 计算资源 | 远程服务 | 提取 | TA0040 影响 |
命令与控制 (C2) | 计算资源 | 远程服务 | 交互控制 | TA0011 命令与控制 |
篡改 (TAM) | 源代码文件 | 开发者 | 修改 | TA0040 影响 |
操纵 (MAN) | 工具输出通道 | LLM | 修改 | TA0040 影响 |
权限提升 (ESC) | 配置 | 框架执行体 | 修改 | TA0004 权限提升 |
持久化 (PER) | 配置 | 框架执行体 | 复制 | TA0003 持久化 |
规避 (EVA) | 文件系统 | 开发者 | 修改 | TA0005 防御规避 |
传播 (PRO) | 目录 | 兄弟项目 | 复制 | TA0008 横向移动 |
架构模型和威胁模型定义了执行边界和允许的攻击者行动;攻击分类法提供了跨框架构造必须保持的语义效果。接下来,我们形式化这个构造。
3 方法论
HookPry在一个依赖链中链接了三种机制。对抗性清单优化(AMO)提高了初始良性插件的市场可见性。该工件提供了由时间解耦(TD)检查的载体,TD使用良性探针来表征钩子的生命周期,定位一个具有弱验证和足够运行时权限的信任边界,并将激活限制在相应的运行时状态。然后,最小公共接口(LCI)将产生的攻击语义编译成每个AI代理框架的原生配置。图4显示了每个阶段的原理和交接。
图4:HookPry方法论的核心原理。AMO在保持良性探针载体的独特身份的同时,提高了跨多个意图的检索能力。TD识别出一个应用很少验证但授予足够运行时权限的信任边界,并且仅当相应的谓词成立时才激活载荷。LCI提取框架间共享的最小生命周期钩子能力,并将不变的攻击语义编译成每个原生配置。
3.1 对抗性清单优化 (AMO)
第一阶段构建初始良性插件的面向公众的身份。设p⁰ = (m, h_b),其中m = (n, d)包含插件名称 *n* 和自然语言描述 *d*,而h_b是一个实现所宣传功能的良性钩子。AMO仅优化 *m* 以改善在目标功能类别C内的受控可检索性。
设M_C为预算匹配的元数据候选的有限集合,设G = {g₁, …, gₖ} ⊂ C为该类别中有代表性的良性插件集合。如果市场排序器R和类别查询分布Q_C可用,理想目标是选择具有最高预期排序得分的元数据:
公式 (1) 定义了AMO的真实目标,但在实践中,内部排序器R和真实的查询分布Q_C都是不可访问的。在正式评估之前,AMO因此从目标类别的定义构建一个代理意图集Q̃_C。该集合包含类别名称和几个将动作与对象配对的查询;评估查询永远不会暴露给优化器。
设 f(·) 表示一个词汇特征映射,S一个相似度函数,s_q(m) = S(f(m),f(q))是候选元数据 *m* 与查询 *q* 之间的相似度,而μ_G = k⁻¹ Σ_{g∈G}f(g)是参考良性插件的类别质心。AMO使用以下参数化的多意图代理目标对每个候选者进行评分:
这里,θ = (α, β, γ)位于单纯形上:α, β, γ ≥ 0且 *α+β+γ=1*。平均值项奖励对多个查询意图的聚合覆盖,最小值项保护最弱代表的意图,而类别质心项约束候选元数据以保持与目标类别一致。因此,A0是一个严格的仅质心基线,而AMO联合优化聚合覆盖、最差意图鲁棒性和类别一致性。
这些权重是凭经验选择的。给定一个预注册的有限参数配置集H,AMO仅使用开发类别选择
每个Δ项测量与A0相比的变化,而η_r和η_n是预注册的非劣性容差。选择过程主要最大化开发集上的BM25改进,同时约束字符级检索的退化以及名称相似度的增长。选定的ϑ⋆在对保留的类别和查询进行评估之前被冻结,以降低基于测试结果的事后参数选择的风险。
AMO通过一个ϵ-约束来表达实例级别的独特性。它首先构造一个接近最优的检索集,然后在该集合内最小化候选者与参考良性插件之间的最大相似度:
这个两阶段过程首先使检索目标保持接近最优,然后增加实例级别的独特性,而不超过允许的性能损失。在整个AMO过程中,只有(n, d)发生变化;良性钩子h_b保持不变,并且在语义上与所宣传的功能一致。因此,AMO仅修改初始工件的检索表示,同时保持其良性可执行行为。得到的p⁰作为TD的探针载体,使得能够测量目标框架的钩子信任边界,而无需执行恶意操作。
3.2 时间解耦 (TD)
时间解耦识别钩子生命周期中安全判断在验证时与有效权限在运行时之间的分离最大的点。然后,它专门化载荷,使其仅当该点的运行时条件满足时才变为活动状态。TD发现候选信任边界,按验证与权限之间的差距对其进行排序,并生成具有所需激活条件的载荷。版本更新、延迟下载以及依赖于环境的触发器都可能携带此载荷。
候选边界与良性探针。 对于目标框架H,设B_H = {b₁, …, bₘ}表示可观察的候选钩子信任边界。一个边界 *b* 由一个生命周期事件、配置源、加载阶段和运行时状态共同决定,例如安装时的清单验证、会话启动时的钩子加载、工具使用前的绑定或子进程创建。TD为每个边界生成一个良性探针z_b,并将其效果限制为写入一个随机标记和记录执行证据。通过固定插件身份、所宣传的功能和探针效果,同时仅改变边界变量,TD获得了跨边界的差异化观察。
对于每个边界 *b*,TD测量四个量:V_H(b)表示进入边界前验证的强度;A_H(b)指示是否需要针对钩子条目的新授权;R_H(b)表示在该边界授予钩子的运行时权限;O_H(b)表示探针是否可以被可靠地观察到。我们将边界的信任差距定义为
其中λ_r, λ_v, λ_a ≥ 0是预定的权重。G_H(b)衡量运行时权限与验证和授权强度之间的结构性不对称,以可靠可达性为条件。一个高分的边界授予实质性的运行时能力,同时在该能力域之前应用相对较弱的检查或逐项授权。
最弱边界选择。 在满足载荷能力要求和探针稳定性约束的候选中,TD选择具有最大信任差距的边界。设ρ(a)表示抽象载荷 *a* 所需的最小能力集,设Cap_H(b)表示在边界 *b* 提供的能力。那么
这里,τ_o是一个预注册的可观察性阈值。能力和可观察性约束共同定义了可行的边界集,确保选定的边界既提供载荷所需的能力,又提供稳定的探针证据。TD因此实现了候选生成、差异化探测和约束选择的重复过程。
条件载荷特化。 在选择b⋆_H之后,TD根据与该边界关联的事件、加载阶段、权限上下文和环境状态来特化抽象载荷 *a*:
其中 *s* 表示运行时状态,χ_H是一个从探针结果生成的边界谓词。它验证当前事件、加载阶段、权限上下文和环境状态是否与b⋆_H一致。在所有其他状态下,钩子保持其原始的良性行为;仅当执行到达最弱边界且所需能力实际可用时,载荷才进入目标分支。
TD输出候选边界集B_H、来自良性探针的观察结果、基于信任差距G_H的排序、选定的边界b⋆_H以及条件谓词χ_H。这些输出指定了攻击激活的位置和运行时条件,并可以通过版本更新等交付机制携带。LCI将选定的边界和载荷条件翻译成每个目标框架识别的原生配置。
3.3 通过最小公共接口实现跨框架鲁棒执行
第三阶段将攻击迁移到生命周期钩子机制的异构实现上。不同的框架通过不同的事件名称、配置模式、命令运行器和权限边界来实现通用的事件驱动执行原语。LCI提取执行攻击目标语义所需的最小充分能力,移除对特定框架事件、语法和运行时环境的依赖,并为每个目标框架生成一个原生的生命周期钩子。
设目标框架集为H = {H₁, …, Hₙ}。对于框架H,将其钩子接口表示为
D_H = (E_H, Σ_H, X_H, P_H)。
这里,E_H是生命周期事件的集合,Σ_H是插件清单模式,X_H是命令执行合约。该合约涵盖命令运行器、传递参数的约定、工作目录以及继承环境的规则。P_H捕获钩子子进程可用的权限和资源。设Cap(D_H)表示从这些属性归一化的语义能力集,并设
表示由完整目标集共享的候选能力。对于一个攻击 *a*,其跨框架语义由目标效果o(a)和必要的执行条件q(a)共同定义。对于一个一次会话目标,q(a)包括会话可达性和命令执行能力;对于一个工具输入操纵目标,q(a)额外包括工具执行前的时间、调用上下文和输入控制能力。LCI迭代地从C中移除与o(a)和q(a)无关的能力,得到攻击特定的最小充分规范:
这里,Native_H(I)表示框架H中满足能力集I的原生生命周期钩子实现,而Obs_H表示与框架无关的外部效果预言机。公式 (10) 在约束条件下最小化对事件、命令和资源能力的依赖,该约束是相同的攻击语义必须在每个目标框架上保持可实现。满足此约束的攻击继续进行原生编译;对于所有其他攻击,适用范围被限制为提供必要能力的框架子集。
在推导出I^_a* 之后,框架适配器选择H中满足规范且具有最少额外依赖的原生事件:
其中Dep_H(e)表示事件触发器对特定工具调用、运行时模式或辅助服务等条件的依赖性。在满足q(a)的原生入口点中,此标准优先选择具有最少额外依赖的事件;当执行时机是q(a)的一部分时,候选者相应地被限制为具有所需时间语义的事件。适配器φ_H然后将最小充分规范编译为
其中c_H是在X_H和P_H下实现目标效果的命令,而σ_H是Σ_H中生命周期钩子的原生编码。由o(a)和q(a)定义的攻击语义在迁移过程中保持不变;每个框架的原生机制提供事件名称、命令字符串和配置结构。语义提取识别目标效果和必要条件。能力最小化移除特定于框架的依赖,之后原生编译选择最少依赖的可行事件并生成命令和配置。在此适配器合约下,每个共享语义案例为每个框架生成一个原生生命周期钩子,并且一个通用的外部预言机检查效果是否得以保留。
4 实现
(此部分原文仅有标题,无具体内容,因此翻译保持原样)
5 实验评估
我们通过四个研究问题来评估HookPry。在威胁模型定义的范围内,主要的HookPry实验遵循其生成的原生工件,从框架加载到由独立预言机验证的外部可观察效果。RQ2是一个独立的翻译比较实验,它将恶意的MCP工具描述机械地转换为生命周期钩子,并在相同的50个目标上,与由我们构建的原生HookPry的E2E-ASR进行比较。
RQ1 (有效性): HookPry在不同的框架和LLM后端上是否有效且稳定?
RQ1.1 (执行级有效性和机制效用): 在跨框架架构和攻击类别中,HookPry能多可靠地启动其攻击机制并产生经过验证的端到端效果?
RQ1.2 (模型独立性): 在匹配的生命周期事件触发后,HookPry的执行路径在多大程度上独立于LLM后端?
RQ2 (翻译比较): 在将恶意的MCP工具描述转换为生命周期事件钩子后,它们能实现什么样的E2E-ASR,是否低于为相同目标构建的原生HookPry?
RQ3 (消融研究): AMO、TD和LCI如何影响HookPry的端到端攻击有效性?
RQ4 (对策): 有代表性的对策能在多大程度上将HookPry的攻击工件与匹配的良性控制区分开来?
RQ1测量跨框架的端到端攻击效果和机制效用(RQ1.1),然后测试触发后执行路径的模型独立性(RQ1.2)。RQ2将翻译后的MCP攻击语义与原生恶意钩子进行比较。RQ3通过组件消融来隔离AMO、TD和LCI的贡献。RQ4测量静态防御的覆盖范围和剩余差距。
5.1 实验设置
框架和LLM后端。 RQ1实验测试了七个AI代理框架:OpenHarness、OpenClaw、Claude Code、Codex CLI、OpenCode、Hermes和WorkBuddy。它使用了五个LLM后端:Claude Sonnet 4.6、DeepSeek-V4-Pro、Kimi-K2.6、GLM-4.7-Flash和GitHub Copilot,涵盖了25种框架和后端的组合。RQ2和RQ3使用一个独立的统一比较数据集,并固定使用Claude Code和DeepSeek-V4-Flash;此后端不计入25种RQ1组合中。
协议。 我们从相同的40个抽象案例种子为每个框架生成原生工件,并分批执行。每个案例、框架和后端的组合都在一个包含合成资产的环境中运行。一次运行涵盖框架启动、原生生命周期钩子的加载和注册、触发请求的提交、HookPry执行、外部证据收集以及预言机的判决计算。实验包括40个案例 × 25种框架和后端的组合 = 1000次尝试运行。
RQ2 比较协议。 RQ2独立于上述1000次执行层运行。我们从MCPTox [43] 可追踪的统一数据集中选择了50个恶意的MCP工具描述投毒目标。对于每个目标,我们保留了良性查询、能力预算、合成装置、效果和外部预言机;仅将原始恶意描述机械地转换为由Claude Code生命周期钩子注入的上下文。钩子本身不直接执行效果,模型仍然决定是否调用相同的合成效果工具。在固定的随机种子分配下,19个MCP2Hook案例保留SessionStart;其余31个被分配给UserPromptSubmit、PreToolUse、PostToolUse或Stop。该实验使用Claude Code和DeepSeek V4 Flash,采用提供者默认采样、120秒超时,并为每次运行使用一个新的隔离目录。
判决和指标。 评估者为每次运行分配四个互斥的判决之一。pass要求该案例所有预注册的外部检查均成功;partial表示仅有一个真子集成功;blocked记录显式的框架拦截;fail涵盖所有其他结果。我们的主要指标是二元验证的端到端攻击成功率(E2E-ASR),定义为N_pass / N_attempted。部分结果不获得任何分数,我们单独报告结果分布。我们还报告机制效用,定义为钩子触发、载荷加载或钩子注册等步骤实际发生的运行比例。该指标区分机制启动与端到端有效性。
5.2 RQ1: HookPry 有效性
RQ1.1: 执行级有效性和机制效用
设置。 我们对实验设置中描述的40个攻击案例、七个框架和五个LLM后端进行了1000次端到端运行,并使用外部预言机确定每次运行的效果。成功生成的配置、发出的工具调用或生成的进程本身并不足以作为成功的证据;RQ1.1要求HookPry产生预注册的外部效果。
结果。 表2按攻击类别和框架报告了HookPry的二元E2E-ASR。在1000次尝试运行中,HookPry获得了770个pass判决,34个partial判决和196个fail判决;没有运行被显式阻止。得到的微平均E2E-ASR为77.0%。表2的最后一列报告了跨框架的未加权宏平均,以便具有不同测试后端数量的框架贡献相等。
表2:[RQ1.1] 按攻击类别和框架划分的HookPry验证执行级E2E-ASR。部分结果不获得任何分数。最后一列是跨框架的未加权宏平均。
攻击类别 | OpenHarness | OpenClaw | Claude Code | Codex CLI | OpenCode | Hermes | WorkBuddy | 平均值 |
|---|---|---|---|---|---|---|---|---|
凭证收集 (COL) | 81.0% | 100.0% | 60.7% | 71.4% | 96.4% | 95.2% | 90.5% | 85.0% |
数据外泄 (EXF) | 75.0% | 100.0% | 87.5% | 50.0% | 100.0% | 100.0% | 91.7% | 86.3% |
资源劫持 (HIJ) | 83.3% | 87.5% | 100.0% | 100.0% | 100.0% | 100.0% | 83.3% | 93.4% |
命令与控制 (C2) | 33.3% | 50.0% | 12.5% | 0.0% | 62.5% | 66.7% | 66.7% | 41.7% |
篡改 (TAM) | 75.0% | 100.0% | 6.2% | 100.0% | 81.3% | 100.0% | 100.0% | 80.4% |
操纵 (MAN) | 66.7% | 100.0% | 33.3% | 66.7% | 66.7% | 77.8% | 88.9% | 71.4% |
权限提升 (ESC) | 66.7% | 100.0% | 87.5% | 100.0% | 100.0% | 100.0% | 100.0% | 93.5% |
持久化 (PER) | 83.3% | 6.2% | 6.2% | 0.0% | 100.0% | 91.7% | 100.0% | 55.3% |
规避 (EVA) | 66.7% | 68.8% | 68.8% | 75.0% | 75.0% | 75.0% | 66.7% | 70.9% |
传播 (PRO) | 66.7% | 83.3% | 54.2% | 66.7% | 100.0% | 100.0% | 100.0% | 81.6% |
总体 | 71.7% | 81.9% | 52.5% | 65.0% | 90.6% | 92.5% | 90.8% | 77.9% |
表3按攻击类别报告了机制效用。效用是机制级步骤(包括钩子触发、载荷加载和钩子注册)实际启动的比例。总体效用为83.9%,高于总体E2E-ASR(微平均77.0%,宏平均77.9%),表明机制启动并不意味着外部效果的完成。权限提升(94.3%)和资源劫持(91.7%)的效用最高,但命令与控制(55.4%)和持久化(65.8%)较低;持久化在Codex CLI上仅达到0.0%,在OpenClaw上仅为6.2%。
表3:[RQ1.1] 按攻击类别和框架划分的HookPry机制效用。每个单元格报告机制级步骤实际启动的比例;最后一列和行是相应的未加权平均值。
攻击类别 | Claude Code | Codex CLI | Hermes | OpenClaw | OpenCode | OpenHarness | WorkBuddy | 平均值 |
|---|---|---|---|---|---|---|---|---|
凭证收集 (COL) | 71.4% | 85.7% | 85.7% | 100.0% | 96.4% | 90.5% | 90.5% | 88.6% |
数据外泄 (EXF) | 81.2% | 50.0% | 100.0% | 100.0% | 100.0% | 83.3% | 91.7% | 86.6% |
资源劫持 (HIJ) | 87.5% | 87.5% | 100.0% | 100.0% | 100.0% | 83.3% | 83.3% | 91.7% |
命令与控制 (C2) | 50.0% | 62.5% | 50.0% | 50.0% | 75.0% | 33.3% | 66.7% | 55.4% |
篡改 (TAM) | 50.0% | 100.0% | 100.0% | 100.0% | 81.2% | 91.7% | 100.0% | 89.0% |
操纵 (MAN) | 58.3% | 66.7% | 77.8% | 100.0% | 66.7% | 88.9% | 88.9% | 78.2% |
权限提升 (ESC) | 93.8% | 100.0% | 100.0% | 100.0% | 100.0% | 66.7% | 100.0% | 94.3% |
持久化 (PER) | 62.5% | 0.0% | 91.7% | 6.2% | 100.0% | 100.0% | 100.0% | 65.8% |
规避 (EVA) | 75.0% | 100.0% | 100.0% | 75.0% | 100.0% | 75.0% | 91.7% | 88.1% |
传播 (PRO) | 83.3% | 83.3% | 100.0% | 87.5% | 100.0% | 72.2% | 100.0% | 89.5% |
平均值 | 72.5% | 75.0% | 91.5% | 83.8% | 93.8% | 80.8% | 93.3% | 83.9% |
每个单元格的样本量为:COL=28/21 且 PRO=24/18;其余类别包含12-16个观察值。Hermes、OpenHarness和WorkBuddy对于某些类别仅测试了三个模型,因此它们对应的单元格具有略小的N。
在所有尝试运行中,生命周期钩子在大约82.0%的案例中实际被触发,范围从Codex CLI的72.3%到OpenCode的92.4%。机制效用高于77.0%的端到端成功率,表明钩子触发后的环境和策略约束是造成大部分差距的原因。
RQ1.1 要点。 HookPry在每个目标框架上都产生了经预言机确认的效果,但效用矩阵显示机制效用并非在所有攻击语义上都统一。Hermes达到了92.5%的总体成功率,并在五个类别中达到了100%。当攻击目标依赖于生命周期钩子子进程通常可用的能力时,迁移效果最强:资源劫持达到了93.4%的宏平均,权限提升达到了93.5%。依赖于网络可达性或持久文件系统状态的目标则暴露了不同的边界。命令与控制(41.7% E2E-ASR;55.4%机制效用)和持久化(55.3% E2E-ASR;65.8%机制效用)仍然受到网络策略、文件系统策略和隔离机制的约束。这些挑战在某些框架配置中尤为明显,表明复杂的网络交互和系统持久化机制可能需要在钩子实现策略中加以额外考虑——例如增强网络协议的检测机制以及与系统级监控的更深入集成——以更好地捕获这些攻击模式。这种类别结构支持了LCI在保持可移植攻击语义方面的预期优势。本地部署策略仍然决定绑定的命令是否启动并完成其最终效果。
RQ1.2: 模型独立性
设置。 保持生成的案例、原生适配器、评估器和外部预言机固定,我们使用跨后端标准差来量化每个框架内LLM后端之间的变异。HookPry载荷是绑定到框架生命周期事件的命令,其执行路径不同于自然语言提示注入。LLM可能影响工具使用事件是否发生;在匹配事件触发后,生命周期钩子绑定和子进程分发遵循框架执行路径。
结果。 图5比较了HookPry在每个框架的已评估LLM后端上的二元E2E-ASR和机制效用。每个雷达面板仅包含为该框架测试的后端,标注的顶点报告了确切比率。
Codex CLI在验证成功方面没有表现出跨后端变异。OpenClaw和Claude Code的总体标准差分别为1.1个百分点和2.5个百分点。因此,七个框架中有三个在测试的后端中保持了几乎恒定的E2E-ASR。其余框架对后端更敏感:OpenCode的标准差为4.5个百分点,Hermes为7.1个百分点,WorkBuddy为9.4个百分点;OpenHarness 9.6个百分点的变异主要由GitHub Copilot(62.5%)和Kimi-K2.6(85.0%)之间的差距驱动。
图5:[RQ1.2] 每个框架在不同LLM后端上的E2E-ASR(圆圈)和机制效用(方块)。顶点报告确切百分比;未评估的框架和后端对已被省略。后端缩写已在图中定义。
模型独立性的最强证据来自Codex CLI、OpenClaw和Claude Code:尽管使用了来自不同模型系列的后端,但没有一个的跨后端标准差超过2.5个百分点。框架排序在后端间也保持稳定,这表明注册、权限和隔离行为是成功率差异的主要来源。OpenHarness、WorkBuddy和Hermes(分别为9.6、9.4和7.1个百分点)出现较大变异,是因为事件紧密依赖于工具使用,而后端特定的工具使用模式可以决定匹配的生命周期事件是否触发。E2E-ASR同时捕获了这种模型介导的触发和随后的框架控制执行。
RQ1.2 要点。 在匹配的生命周期事件触发后,HookPry的绑定和子进程分发变为框架控制。Codex CLI、OpenClaw和Claude Code低于2.5个百分点的跨后端标准差支持了在此触发后边界的模型独立性。然而,OpenCode、Hermes、WorkBuddy和OpenHarness表现出更大的变异性(4.5–9.6个百分点),这是由于它们独特的工具使用行为影响了事件的产生。这种变异反映了这些后端与系统API交互方式的根本差异,而非HookPry机制本身的不一致性。执行路径在触发后实现了模型独立性,但完整的攻击仍然是条件性模型依赖的,因为初始事件产生阶段仍然受到每个后端独特工具调用模式的影响。未来的工作可以侧重于开发更鲁棒的事件预测模型,以考虑不同LLM后端之间的这些行为差异。
5.3 RQ2: 将恶意MCP目标翻译为具有混合生命周期事件的钩子
设置。 我们从MCPTox [43] 可追踪的数据集中选择了50个恶意的MCP工具描述投毒目标,并将它们转换为Claude Code生命周期钩子。在固定的随机种子分配下,19个MCP2Hook案例保留SessionStart;其余31个被分配给UserPromptSubmit、PreToolUse、PostToolUse或Stop。该实验使用Claude Code和DeepSeek-V4-Flash,采用提供者默认采样、120秒超时,并为每次运行使用一个新的隔离目录。相同目标上的原生HookPry作为配对的对照组。
结果。 表4比较了在配对的50目标数据集上翻译后的MCP2Hook与原生HookPry。
表4:[RQ2] 将恶意MCP目标转换为具有混合生命周期事件的钩子后的E2E-ASR。HookPry由我们为相同50个目标构建的原生生命周期钩子组成,并作为使用相同样本的配对对照。
条件 | 成功数(有效总数中) | E2E-ASR | Wilson 95% 置信区间 |
|---|---|---|---|
原生 HookPry | 46 / 50 | 92.0% | 81.2–96.8% |
MCP → Hook | 28 / 50 | 56.0% | 42.3–68.8% |
MCP2Hook在50个有效案例中成功了28个,E2E-ASR为56.0%(Wilson 95%置信区间:42.3%–68.8%),显著低于相同目标上原生HookPry达到的92.0%(单侧精确二项检验,p = 7.09 × 10⁻¹²)。其上下文钩子在38/50次运行中触发(76.0%),低于原生HookPry的触发可靠性。在其他12个翻译案例中,钩子机制未启动。
RQ2 要点。 翻译后的恶意MCP工具描述达到了56.0%的E2E-ASR,显著低于相同目标上原生HookPry的92.0%(p = 7.09 × 10⁻¹²)。MCP2Hook注入恶意描述,并且仍然需要模型调用效果工具。原生HookPry直接从生命周期事件执行效果,移除了该模型介导的门控,这解释了观察到的优势。
5.4 RQ3: HookPry 消融研究
设置。 我们固定使用Claude Code和DeepSeek-V4-Flash,并使用完整HookPry在统一比较数据集上的46/50次成功(92.0% E2E-ASR)作为基线。我们构建了四个系统变体:完整HookPry保留所有组件;w/o AMO将多意图优化替换为仅质心的A0检索;w/o TD阻止新的生命周期钩子条目在现有插件身份下继承执行授权;w/o LCI移除针对Claude Code原生生命周期钩子接口的适配器,阻止统一载荷被转换为可注册的生命周期钩子配置。除被消融的组件外,所有案例、框架设置、LLM后端设置、超时、能力预算和外部预言机均保持不变。我们保留E2E-ASR作为主要指标,并额外报告载荷加载率、钩子注册率以及相对于完整系统的ASR下降(Drop)。
结果。 表5报告了所有四个消融变体的有效性和机制效用度量。
表5:[RQ3] 在Claude Code和DeepSeek-V4-Flash下的HookPry消融结果。w/o AMO值是一个分析估计值;当载荷加载或原生注册被阻止时,w/o TD和w/o LCI是结构性的结果。“–”表示一个不可达或不适用阶段。
系统变体 | 载荷加载 | 钩子注册 | E2E-ASR | Drop |
|---|---|---|---|---|
完整 HookPry | 100.0% | 100.0% | 92.0% | – |
w/o AMO | 100.0% | 100.0% | 75.6% | 16.4pp |
w/o TD | 0.0% | – | 0.0% | 92.0pp |
w/o LCI | 100.0% | 0.0% | 0.0% | 92.0pp |
移除AMO将HookPry的E2E-ASR降低到75.6%,比完整系统下降了16.4个百分点。AMO在工件检索和选择阶段做出贡献;它在加载后不改变框架执行。没有TD,新引入的钩子条目无法继承现有插件身份的执行授权,因此载荷在更新交付边界被阻止;载荷加载率和E2E-ASR均降至0%。没有LCI,统一攻击语义仍可加载,但无法转换为可被解析和注册的原生Claude Code生命周期钩子;钩子注册和E2E-ASR降至0%,而载荷加载保持在100%。
RQ3 要点。 表5使用载荷加载和钩子注册作为四个变体的机制效用度量;两者在完整HookPry中均达到100%。移除TD阻止载荷加载。移除LCI保留加载但阻止原生注册。因此,AMO、TD和LCI在机制链的不同阶段操作。
5.5 RQ4: 对策
设置。 我们构建了一个固定的40:40静态语料库:每个HookPry案例一个恶意工件包,以及一个按攻击类别和生命周期钩子事件匹配的良性对照。每个扫描目录使用一个不透明的标识符;标签和案例标识符保持在扫描树之外。一个冻结的机械转换移除了仅限基准测试的注释和名称,如案例ID和显式攻击标签,同时保留了可执行操作,包括敏感文件访问、网络传输、配置修改和生命周期钩子注册。每个包包含一个插件清单、一个Description.md、原生生命周期钩子配置及其载荷。
我们评估了三种不同的静态防御。Microsoft Defender是一个通用端点防病毒软件;Semgrep 1.172.0使用五个冻结的通用规则;HookPolicy 0.1.0是我们的一个透明的、具备生命周期钩子感知能力的八规则基线。Semgrep和HookPolicy是研究人员配置的基线,不代表商业默认设置。每个工具成功扫描了所有80个工件。我们报告恶意样本上的召回率、规避率(1 - 召回率)以及良性样本上的假阳性率(FPR);工具错误从分母中排除并单独记录。
结果。 表6报告了三种防御的召回率、规避率和假阳性率。
表6:[RQ4] 在匿名、清理后的40:40语料库上针对HookPry的静态对策覆盖情况。
对策 | TP/40 | 召回率 | FN/40 | 规避率 | FP/40 | FPR |
|---|---|---|---|---|---|---|
Defender | 0 | 0.0% | 40 | 100.0% | 0 | 0.0% |
HookPolicy | 20 | 50.0% | 20 | 50.0% | 0 | 0.0% |
Semgrep | 19 | 47.5% | 21 | 52.5% | 0 | 0.0% |
HookPolicy检测到20/40个恶意工件(50.0%;Wilson 95%置信区间:35.2%–64.8%),Semgrep检测到19/40个(47.5%;Wilson 95%置信区间:32.9%–62.5%),Defender检测到0/40个(0.0%;Wilson 95%置信区间:0.0%–8.8%)。三种防御的联合检测到21/40个,漏掉19/40个,联合漏报率为47.5%。所有扫描器在匹配的对照上都产生了0/40的假阳性;由于这些对照是合成的且低风险,此值仅是一个点估计,其Wilson 95%置信区间上限为8.8%。所有三个扫描器都处理了全部80个工件(100%),没有工具错误从分母中排除。扫描器的可用性并不能解释覆盖差距。
RQ4 要点。 没有评估的端点扫描器或透明的静态规则基线检测到超过一半的恶意样本,它们的联合仍然漏掉了47.5%。这些漏报需要在安装和更新期间进行显式的生命周期钩子审查,并对剩余案例进行运行时监控和最小权限控制。
6 讨论与局限性
HookPry暴露了AI代理框架在解释已接受工件中的生命周期绑定时的一个信任失败。在匹配事件发生后,框架控制命令绑定和子进程分发;模型仅影响事件的产生。因此,提示层防御无法覆盖此执行边界。审查应涵盖插件安装、更新、钩子注册和运行时信息流。框架应单独授权更改的钩子,将插件清单签名绑定到载荷,并强制执行最小权限。对于诸如PostToolUse这样的事件,它们应保留原始输出并记录转换来源。由于RQ4的静态防御漏掉了47.5%的恶意工件,静态扫描无法取代运行时监控和权限约束。
威胁模型假设通过正常渠道安装并采纳更新。AMO衡量检索机会,而非安装或更新采纳率。实验使用带有合成资产的临时环境,覆盖了七个框架、五个LLM后端和40个攻击案例;它们并未穷尽操作系统、Shell、企业策略、网络条件或未来版本。HookPry排除了实现漏洞和沙箱逃逸。其效果取决于事件发生、钩子授权和子进程权限,这反映在命令与控制及持久化的较低成功率上。RQ4评估了两个通用扫描器和一个具备生命周期钩子感知能力的静态基线以及合成的良性对照,但未涉及动态分析或专门的商业产品。
这些局限性定义了未来的工作:在没有真实用户数据的情况下衡量市场检索和更新采纳;将覆盖范围扩展到跨系统、版本和企业策略;构建有代表性的良性插件基准;并评估签名绑定、差异化更新授权、最小权限钩子和工具输出完整性。此类工作可以将此攻击面转化为可部署的生态系统和框架保护措施。