一个AI代理拿到授权:付给谁、付多少、用什么币种、到什么时候为止。AP2在签名那一刻验证一次这份授权,之后代理就自己跑了。
问题出在"之后"。在Google的AP2 Python SDK里,verify_chain的文档写明它会在终端跳上强制校验expected_aud。但verify_expected_claims只在typ属于TYP_TERMINAL时才执行,而一个kb+sd-jwt+kb令牌——只要payload里带cnf,SDK自己就会产出这种令牌——落进了TYP_INTERMEDIATE。
结果就是下面这组对照:令牌里的aud是https://attacker.example/ap2,期望的expected_aud是https://honest-merchant.example/ap2,校验结果却是ACCEPTED——一个发给错误受众的令牌被放行了。
代理把花钱的权限托付给这套协议,协议却不验证这份权限有没有被替换。drift要补的就是这一环。
它的做法是六条规则,动作发生前检查,默认拒绝:amount(金额)、payee(收款方)、audience(受众)、currency(币种)、window(时间窗)、intent(意图)。
工程细节上,金额用整数最小单位表示,授权一旦签发即冻结,账本只追加、带链式指纹。对外接口是MCP的三个工具:drift_check、drift_session、drift_explain。只依赖标准库。
免费额度是每天100次检查,无需注册。测试共136个通过,其中核心21个、协议41个、限流26个、x402相关48个。
这个缺口不是推演出来的。项目站点上给出了完整分析和复现脚本,指向同一件事:在AP2 Python SDK里,受众校验对key-bound跳被跳过,于是为另一个受众铸造的令牌照样被接受。
如果你的代理会花钱,它需要这道闸。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.