事件经过
A2AServer通过HTTP暴露一个Google A2A代理(tasks/send、tasks/get、tasks/cancel),但仅当配置了secret选项时才强制执行Bearer认证。由于该选项是可选的,且startServer()未执行fail-closed检查,网络面向代理端点的默认配置没有认证。项目自身文档将A2A服务器描述为Bearer保护,因此fail-open默认与文档化的安全态势相矛盾,并且与包中的MCP传输不同,后者在无secret时拒绝启动。
影响分析
这是一种代理到代理(A2A)协议端点中的fail-open缺失认证缺陷。任何能够访问该服务器的攻击者都可以向代理执行器提交任意任务、读取存储的任务结果并取消任务——由于任务文本直接传递给开发者连接的执行器,影响范围升级到该代理能够驱动的任何工具或系统。
攻击途径
操作员启动A2AServer.startServer()时未设置secret(该字段是可选的,无默认值)。Bearer认证块由if (this.options.secret)控制,因此未配置secret时整个授权检查被跳过,路由直接进入任务处理。攻击者到达代理卡片(其通告无认证方案)并无凭证提交JSON-RPC tasks/send、tasks/get和tasks/cancel,将攻击者控制的任务文本直接传递给开发者提供的执行器。
受影响系统
network-ai npm包,A2AServer类(lib/a2a-server.ts)<= 5.15.4;修复在5.15.5(或配置secret)。
缓解措施
在A2AServer上配置Bearer secret(fail closed)或升级至>= 5.15.5;尽可能仅绑定loopback,并将A2A端点视为需认证。公告指出最新检查的版本中尚无修复。