Loopjacking in A2A Implementations: Hijacking Human-in-the-Loop Approvals
2 days ago
- 在一个受控的LangGraph Agent Server测试中,一个审批角色对一个小额转账(20单位)的决定被用来通过相同任务状态替换攻击执行一笔大得多的转账(2000单位)到攻击者控制的目标地址。
- 该攻击利用了一个A2A消息/更新端点,在该端点中,“发起者”可以使用相同的任务和工具调用ID将待处理操作从A改为B,而后续审批者的决定被应用于修改后的状态,没有验证操作范围。
- 测试的漏洞是一种Loopjacking形式,其中实现使用对操作A的决定来释放实质上不同的操作B,突出了需要将审批决定绑定到确切的操作而不是任务ID。
- 7.6.4之前的A2A规范在授权期间的相同任务消息是否隐含地包含在先前决定中缺乏明确性;澄清后的规范现在将定义和检查审批范围的责任分配给实现方。
- 该实验使用了合成身份、确定性本地模型和内存服务器,并控制了各种条件以隔离审批绑定失败,包括验证发起者单独无法执行转账。
- 该缺陷存在于LangGraph Agent Server 0.7.5到0.14.0版本中,测试表明,拒绝更新(deny-update)Auth策略可以通过阻止发起者更改待处理操作来阻止攻击。
- 推荐的修复方法涉及将决定绑定到确切的规范操作,使用完整性保护的记录和分发时的原子检查,以确保执行的操作与批准的操作一致。
- A2A审批系统的回归测试应捕获人类可见的操作、决定记录、可变状态路径和接收参数,并测试诸如未更改的A、相同任务替换以及错误主体/范围等分支。
- A2A任务ID标识消息涉及的工作,但不回答人类授权了哪个确切的工具调用;审批范围必须由实现方或凭证签发者明确定义。
- 证据档案保存了原始HTTP请求、授权决定、账目事件和包锁定文件,以供独立验证,支持特定产品的声明而非通用的协议漏洞。