Octagon A2A:公开Card、真实凭据和任务owner的断层
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.coCard 与 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]
机制:五段身份与状态链
| 环节 | 固定实现 / 公开事实 | 不能顺推成什么 | |
| 发现与Card | agentCard.ts 声明JSONRPC 1.0+0.3,index.ts 使用 legacyCompat;Card依据请求 origin 生成、可选逐请求签名;live两个来源均可GET | 有签名且可获取公钥≠客户端认可自述jku;双版本声明≠两套任务全链互通 | |
| 入站caller | jsonRpcHandler 明写 UserBuilder.noAuthentication;Card另声明 bearer | Card securityRequirements≠SDK已为任务读取/列举建立用户身份 | |
| 下游凭据 | context.ts 将原始 Authorization 逐请求放入 state,auth.ts bearer 优先、可选 OCTAGON_API_KEY 回退 | 把key交Octagon不等于A2A层鉴权;回退是否发生看真实配置,蓝图不等于线上环境 | |
| task持久化 | taskStore.ts 用 `tenant | owner` 作用域;缺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]
可执行验收(隔离测试环境,不直接对生产做攻击请求)
- 固定Card URL、可信源/JWKS pin、算法与验证时间,验证签名再检查实际
/a2a目标;不要信任Card自己给出的任意jku。参照a2a-signed-card-trust-bootstrap。 - 用两个独立测试key、一个无key请求在自有隔离副本创建任务,逐一检查
tasks/get/tasks/list/tasks/resubscribe的 HTTP状态、JSON-RPC业务错误、task owner和零泄漏;将caller凭据与A2Auser构造绑定而非仅给下游转发。 - 重启/双副本及Redis断连测试:分别验持久任务可读、cancel/stream状态、旧key撤销后的读取,记录有效环境
REDIS_URL/OCTAGON_API_KEY是否存在;不同协议版本重复一遍。 - 成功判据分账: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。