← 返回藏书阁

Octagon A2A:公开Card、真实凭据和任务owner的断层

wiki/ai/sources/octagon-a2a-live-card-owner-boundary.md
分类:ai / sources · 更新:2026-10-06 09:04

Octagon A2A:公开Card、真实凭据和任务owner的断层

结论与用户价值

知识轴:A2A / harness-runtime / sandbox-security / benchmark-evaluation(最高优先A2A实践)。 这是可公开 GET 的实际 Card + 固定源码 + 生产蓝图案例,比只有提案或演示 README 更接近可复核实践。最大待验收接缝:将 caller bearer 逐请求交给下游计费,不自动意味着 A2A task store 中的 caller/tenant 已被认证和隔离。固定源码同时使用 UserBuilder.noAuthentication,scopeOf 无身份时落到共同空桶;若真实任务接口可无凭据按已知 ID 读取,就会出现“付费身份属人、任务读取身份匿名”的边界。本轮未发送任务、未复现跨用户读取;它是源码路径支持的风险假设,不是已确认线上漏洞。

对 Hermes 或联邦 gateway 的启发:把发现→验签/可信key→逐请求身份→下游凭据→任务owner→最终结果/effect 各环节分别取证,尤其当 A2A SDK 默认 context 丢弃 Header 时不可仅看“Card 声明 bearer”。参见A2A-Agent2Agent-Protocol与MCP-Gateway-Runtime。^[raw/articles/octagon-a2a-live-card-and-owner-boundary-selected-2026-10-06.md]

可复核证据层与时间

  • 上游 OctagonAI repo 固定 SHA 1c28823aed61cb03b1ef92e7d3517dc14b0cd8af;GitHub API 提交时间为 2026-09-06,不是10月新发布;10-06本轮补充发现。README、自定义context/auth、store、签名实现及相关测试已读;没有运行上游 Bun suite。
  • 10-06 09:02 CST 公开只读 GET:a2a.octagonai.co Card 与 JWKS 均 HTTP 200;Card 两个 skill、同一 /a2a 的 1.0/0.3 两个 binding、streaming=true、push=false、bearer securityRequirements;signature header ES256、kid=octagon-a2a-202609、同源绝对 jku,JWKS 提供相同 kid。Render 域名也公开 GET 200,Card 端点随域名变化。
  • Card 和 JWKS 可读、头字段匹配 不等于客户端已建立可信key、完成验签或获得授权;未获取有权限的凭据,不测试真实 message/stream、取消、恢复、跨租户读取、线上 Redis。README 里的“live verified”和 chat 答案是作者自述。^[raw/articles/octagon-a2a-live-card-and-owner-boundary-selected-2026-10-06.md]

机制:五段身份与状态链

环节固定实现 / 公开事实不能顺推成什么
发现与CardagentCard.ts 声明JSONRPC 1.0+0.3,index.ts 使用 legacyCompat;Card依据请求 origin 生成、可选逐请求签名;live两个来源均可GET有签名且可获取公钥≠客户端认可自述jku;双版本声明≠两套任务全链互通
入站callerjsonRpcHandler 明写 UserBuilder.noAuthentication;Card另声明 bearerCard securityRequirements≠SDK已为任务读取/列举建立用户身份
下游凭据context.ts 将原始 Authorization 逐请求放入 state,auth.ts bearer 优先、可选 OCTAGON_API_KEY 回退把key交Octagon不等于A2A层鉴权;回退是否发生看真实配置,蓝图不等于线上环境
task持久化taskStore.ts 用 `tenantowner` 作用域;缺user与tenant同入空桶;配置Redis共享持久状态,连接失败不静默降级;内存模式限制单实例Redis耐久≠隔离;知道owner字段名≠请求中owner已被可信验证;公开Card无法反证空桶路径
完成语义executor.ts 用 submitted/working/artifact/terminal 状态并发回包;README注明上游部分错误按文本正常返回completed≠研究结果有效或授权effect成功,SSE声明≠本轮实际执行证据

风险定位:task store 的scope是依赖上游可信 ServerCallContext.user/tenant 的机制,不是自主认证组件;当前构造链未给它可核实身份。taskStore.test.ts 的 FakeRedis + 空 context 覆盖分页/清理,却不能证明两个有权限的 caller 从真实 HTTP 层互相隔离。与a2a-redis-owner-dispatch-and-test-boundaries 的“预置store不是通过API授权”同型,但不是同一代码缺陷或同一企业部署。securityRequirements 与 UserBuilder.noAuthentication 应作为待确认的冲突信号而不是直接认定利用成功。^[raw/articles/octagon-a2a-live-card-and-owner-boundary-selected-2026-10-06.md]

可执行验收(隔离测试环境,不直接对生产做攻击请求)

  1. 固定Card URL、可信源/JWKS pin、算法与验证时间,验证签名再检查实际 /a2a 目标;不要信任Card自己给出的任意jku。参照a2a-signed-card-trust-bootstrap。
  2. 用两个独立测试key、一个无key请求在自有隔离副本创建任务,逐一检查 tasks/get / tasks/list / tasks/resubscribe 的 HTTP状态、JSON-RPC业务错误、task owner和零泄漏;将caller凭据与A2A user 构造绑定而非仅给下游转发。
  3. 重启/双副本及Redis断连测试:分别验持久任务可读、cancel/stream状态、旧key撤销后的读取,记录有效环境 REDIS_URL / OCTAGON_API_KEY 是否存在;不同协议版本重复一遍。
  4. 成功判据分账:Card可发现、签名可信、下游API授权、任务读写隔离、真实报告内容正确性五种不同谓词;上游返回错误文本却标 completed 的情况必须单列,不让成功率吞掉语义失败。与Agent-Benchmarks的合法成功/证据路径相连。

失败模式与边界

  • Host / x-forwarded-proto 决定Card origin;反向代理允许的Host列表、固定canonical origin与jku白名单应单验;本轮未作头注入探测。
  • 签名是可选配置;live JWKS可读但本轮没有密码学验签,更没有目录级信任引导或key轮换/撤销证据。外部公开端点会随时改变,不把10-06观察冒称部署承诺。
  • REDIS_URL在蓝图里引用托管服务,不能据此证明实例健康、后台事件恢复或exactly-once;没有push webhook,Card明确拒绝宣传此能力。
  • 仅适合启发 Hermes A2A 接入评测,不据此认定用户本机 Hermes A2A 已启用、公司线上服务暴露或 Octagon 实际发生跨用户读取。

写入记录

  • 2026-10-06 09:04 CST:固定旧仓库源码并现场只读核Card/JWKS;分析凭据转发与匿名任务owner的身份断层,给出隔离环境三主体/多阶段验收,明确未运行认证task E2E。