Loopjacking:当您批准的操作并非最终执行的操作
2026 年 9 月的一篇论文提出 Loopjacking:人工批准绑定的是界面呈现,而非真正被派发的调用。已在多个已发布的智能体框架中复现。
这是什么?
人工批准(human-in-the-loop)是各方普遍依赖的控制手段。当智能体即将转账、删除存储桶或执行 shell 命令时,公认的做法是:把操作展示给一个人,等待其点击确认。2026 年 9 月 17 日提交至 arXiv、并于 2026 年 9 月 21 日在 cs.CR 列表中公布的论文 Loopjacking: Hijacking Human-in-the-Loop Approval(arXiv:2609.21081,作者 Adithyan Arun Kumar)提出了随之而来的问题:人所审阅的那个操作,是否就是系统随后执行的那个操作?
作者报告,在若干已发布的智能体产品中并非如此。论文将这一类失效命名为 Loopjacking:人批准了他所理解的操作 A,而产品自身的逻辑却用这一决定去授权一个实质不同的操作 B。批准是真实的,点击是本人的,审计日志记录着”人已同意”——但最终抵达执行点的效果却是另一回事。
工作原理
论文提出了一条批准绑定不变式:只有当在使用时刻所评估的完整操作与人所审阅的内容实质等价,且该决定对当前主体、任务与范围仍然有效时,这一决定才可以授权该操作。“完整操作”包括动作、每一个实质性参数、目标资源、发起主体与任务范围,以及任何可能改变执行效果的运行上下文。论文区分了破坏该不变式的两种方式。
- 表示层 Loopjacking。 在决定作出之前,B 已经编码在请求之中,但产品所显示或规范化的却是一个实质不完整的 A。批准是准确的——只是针对了错误的对象。shell 包装器一例最为清晰:批准事件仅呈现了内联载荷,而在批准之前就已准备好的完整位置参数向量,携带了用于选择真实命令与目标的额外参数。
- 批准后状态替换。 人看到并批准的确实是 A。在该决定被消费之前,某个仅具备有限状态更新能力的行为者,将待处理的任务、线程或续行状态改为 B。执行时评估的是当前的 B,却沿用了为 A 所作的决定。
攻击者模型刻意设定得很克制:不需要控制模型,不需要与批准者竞速,也不需要伪造确认,只需要权限不对称——一个低权限的任务发起者、一个仓库写入者,或一个能够更新待处理状态、却永远无法直接调用 B 的远程智能体。作者明确排除了以下情形:B 在任何决定之前就已执行;批准提示被跳过;以及人在看到 B 的情况下知情地予以批准。实验衡量的是系统绑定,而非人的易受骗程度:批准角色由脚本担任,且仅在测试已确认并记录产品对 A 的确切呈现之后才继续。
论文评估了四条产品路径,这是一组有目的选取的样例,而非随机抽样。批准后状态替换在截至 3.0.9 的七个 Agno AgentOS 版本点上复现——其续行路径校验了调用标识,却未将当前工具参数与已批准记录中的描述符作比对。该变体同样在截至 0.14.0 的十二个 LangGraph Agent Server 内存态条件组合版本上复现,途径是其随附的 A2A 命令更新接口,前提是所设定的授权策略允许发起者更新共享的待处理线程但不得恢复执行。表示层不一致在 OpenClaw 2026.2.23 上复现,并在 2026.2.24 中被拒绝——该版本增加了对完整参数向量的一致性校验。
最有价值的是阴性对照。OpenAI Agents SDK 0.22.0 与 0.22.2 在每一次试验中都拒绝了该变更:序列化续行保持了逐次调用的精确绑定,同一调用标识下被改为 B 的调用触发了错误,账本保持为空。可见,续行与序列化本身并不是失效的成因——绑定才是。
为何重要
批准恰恰是组织在风险最高时所倚重的控制,也是唯一能在”模型可能已被攻陷”这一威胁模型下依然成立的控制。Loopjacking 攻击的是它底下的管道。论文点名了三种不充分的绑定捷径:仅绑定调用标识符——当归约器可以替换该标识符所关联的参数时;仅绑定运行级的”已批准”标志——当续行可以装入另一个工具调用时;以及仅在呈现时刻校验——当状态可以在派发之前改变时。这三种做法都很常见,而且都会产出一个在演示中看起来完全正确的系统。
另有一项趋同的结果值得对照阅读。Silence Is Endorsement: Verification-Status Laundering in LLM Agent Pipelines(arXiv:2609.20211,2026 年 7 月 25 日提交、9 月 18 日公布)在更高一层考察了同一缺口——把关者是 LLM 监控器而非人。当”该授权主张未经验证”这一限定被摘要器、记忆压缩器或一次普通交接抹去后,在所报告的实验中,对高风险动作的批准率在 Llama-3.1-8B 上由 5% 升至 60%,在 Qwen2.5-14B 上由 9% 升至 98%;一条完整的提议者—摘要器—记忆—监控器流水线,在三个下游监控器上把批准率推高至 57%–81%。研究指出,明确指示监控器拒绝未经验证的授权,并非一个跨模型可靠的修复。
两篇论文指向同一结论:智能体系统中的授权决定,目前是以文本与标志位在有损流水线中传递的,而它们本应以绑定到确切执行效果的结构化状态来传递。
防御
论文的处方可归结为一条规则:保留人所批准的操作,重建将要真正执行的操作,并在最后一个授权点上比对二者的完整规范描述符——比对须发生在所有解析、模板渲染、状态归约、续行、默认值注入、包装器展开与参数解析之后。
让批准记录成为规范记录。 它至少应绑定:动作或工具标识及每一个实质性参数;目标资源与副作用类别;发起主体与任务范围;批准主体;带创建时间、过期时间与消费状态的一次性随机数;以及对展示给人的同一份完整描述符的摘要。界面展示必须由该描述符生成,而不能在执行使用更丰富对象的同时,只向人展示一条便捷字符串。
把真正的校验放在使用时刻,而非渲染时刻。 论文给出的流程,在释放效果之前执行:若决定缺失、过期、已撤销、已消费或超出主体与任务范围,则拒绝;若当前操作与已批准描述符存在实质差异,则拒绝或重新请求批准;对解析后的效果重新评估当前策略;将决定的消费与效果的释放原子化完成,或记录可防重放的幂等提交令牌;将已批准描述符、当前描述符、决定与效果写入审计记录。
对 shell 与命令包装器格外留意。 内联载荷、位置参数、环境变更、工作目录、解释器标志与重定向都会改变执行效果。折叠视图仍可保留,但批准环节必须或者暴露被隐藏的实质字段,或者拒绝对其授权。
把阻止变更视为纵深,而非答案。 在所测试的 LangGraph 组合中,禁止非批准者更新共享的待处理线程确实阻断了状态替换变体,在业务角色允许的场合值得采用。但这是组合相关的做法,凡是合法更新、重试或迁移可能改变操作状态之处,它都不能替代精确的动作绑定。
把它纳入每个版本的回归测试。 捕获批准视图与完整请求,通过每一个受支持的审阅后接口变更一个实质字段,并在执行点断言确切的操作。最小测试集为:未改动的 A 成功执行;拒绝不产生任何效果;攻击者无法直接执行 B;A 到 B 的替换被拒绝或被重新授权;错误范围失败;已消费或已过期的批准无法重放。
让授权来源以结构化状态随行。 配套研究的结论对 LLM 监控器与人同样适用:一项主张是否经过验证,必须作为附着于该主张的字段一路随行,且不能被摘要器悄然丢弃。
Status
| 项目 | 详情 |
|---|---|
| 主要来源 | Loopjacking: Hijacking Human-in-the-Loop Approval(arXiv:2609.21081),2026 年 9 月 17 日提交,9 月 21 日公布 |
| 类别 | 批准绑定失效——决定未与使用时刻所评估的操作相绑定 |
| 变体 | 表示层(批准时呈现不完整);批准后状态替换(待处理状态在消费前被变更) |
| 已复现 | 批准后状态替换:截至 3.0.9 的七个 Agno AgentOS 版本点;截至 0.14.0 的十二个 LangGraph Agent Server 内存态条件组合版本。表示层不一致:OpenClaw 2026.2.23 |
| 已修复 / 已拒绝 | OpenClaw 2026.2.24(对完整参数向量的一致性校验)。OpenAI Agents SDK 0.22.0 / 0.22.2 作为阴性对照——每次试验均拒绝该变更 |
| 尚无确定修复 | 论文指出,截至其数据截止日,未确认存在已修复的 Agno 版本或厂商修复的 LangGraph 版本;Agno 上的精确动作对照由研究者自行编写,LangGraph 的安全结果依赖一项受支持的拒绝更新策略 |
| 范围限定 | 有目的选取而非随机抽样;结果与具体配置和版本相关;未给出普遍性估计;未指派 CWE 或 CVSS;单一研究者,无独立复现;未评估生产环境 Postgres 部署 |
| 相关研究 | Silence Is Endorsement(arXiv:2609.20211),2026 年 7 月 25 日提交,9 月 18 日公布——把关者为 LLM 监控器时的同一绑定缺口 |
| 研究截止 | 证据与公开来源梳理截至 2026 年 9 月 10 日 |