Runtime attestation for AgentCard: proving agent authorization across frameworks #1677
Replies: 14 comments 3 replies
-
|
Love seeing OATR show up here. The one gap that consistently fires in our A2A harness (A2A-001 “Agent Card spoofing” + A2A-004 “unauthorized task execution”) is exactly what you are addressing: nothing in the spec today binds the card to the runtime that is actually issuing the call. When Joy Trust Network ran the suite yesterday they passed 11/12 tests — the lone failure was A2A-001 because we could replay their /.well-known/agent-card.json from a different runtime and the callee had no signal that the caller wasn’t who it claimed. Dropping an A couple of implementation details from the test side:
Happy to put a fresh report on it once you wire this up — the harness (https://github.com/msaleme/red-team-blue-team-agent-fabric, A2A module) spits out pass/fail per assertion so you can show objective evidence back to the WG. |
Beta Was this translation helpful? Give feedback.
-
|
@msaleme — this is exactly the kind of adversarial feedback that makes specs production-ready instead of theoretically sound. On your three recommendations: Signing AgentCard fingerprint + task metadata: Agreed. Signing only the card leaves the A2A-004 body-swap vector open. The attestation JWT should bind to both the card hash and a request nonce. Will incorporate this into the integration proposal.
Manifest hash in the card: The signed manifest already includes Would welcome the harness run once this is wired up. Having A2A-001 and A2A-004 go from fail to pass with objective evidence would be the strongest argument for adoption. |
Beta Was this translation helpful? Give feedback.
-
|
@FransDevelopment — glad to see the Two follow-up points from our latest run (v3.6.0, 327 tests as of yesterday): On binding attestation to request nonce: We shipped Return Channel Poisoning tests (RCP-001 through RCP-008) this week that target exactly this gap. The attack: intercept a legitimate attestation JWT and replay it with a modified task payload. Without the nonce binding, the callee validates the attestation signature, confirms the runtime key, and executes a task the human never authorized. In 6/8 test configurations the replayed request succeeded. On OATR + A2A harness integration: Our A2A-001 (Agent Card spoofing) and A2A-004 (unauthorized task execution) tests are the ones most relevant to OATR. Happy to run them against an OATR-enabled endpoint and share full results — the interesting question is whether the attestation verification adds enough latency to matter at scale, and whether the fallback behavior when OATR is unreachable degrades safely. If you have a staging endpoint or a local setup guide, we can run the suite and open an issue with findings. The harness is open source — |
Beta Was this translation helpful? Give feedback.
-
|
Hey @msaleme, I just put together a minimal A2A-compliant reference server to give your I've set up the repository here and added you as a collaborator: How it works cleanly without a public deployment:You don't even need me to host this for you to run your tests. It bundles the OATR registry data (manifest + revocations) and runs the entire 14-step OATR verification protocol completely in-memory. By default, the server binds to To run it locally:
Note: The Agent Card advertises the standard generic I've already run a full internal test suite on it, and it correctly rejects missing auth, unknown issuers, corrupted signatures, and expired tokens while successfully returning completed JSON-RPC responses for valid JWTs. Let me know if your harness catches anything unexpected or if we need to tweak the Agent Card format further! |
Beta Was this translation helpful? Give feedback.
-
|
@FransDevelopment — this is exactly what we needed. A local reference server with in-memory OATR verification eliminates the deployment dependency entirely. Accepted the collaborator invite. Will clone, run, and point the A2A harness at it this week. Specifically targeting:
The dual auth format (standard Will open issues on your repo with full harness output. If the server handles adversarial inputs correctly, this becomes the reference implementation that others can test against too. |
Beta Was this translation helpful? Give feedback.
-
|
Love seeing the registry land in code. When we run the red-team-blue-team-agent-fabric harness (A2A-001…012) against production agents, two of the attack classes (A2A-004 task hijack + A2A-006 state override) only go away when the runtime ships the kind of attestation you are sketching here. A few implementation notes from those runs:
Happy to contribute the harness fixtures once we finish the run against the reference server if that helps. Repo for context: https://github.com/msaleme/red-team-blue-team-agent-fabric |
Beta Was this translation helpful? Give feedback.
-
|
This is a clean separation that I think is worth making very explicit: OATR answers "is this agent authorized by its runtime?" (binary). What it intentionally doesn't answer is "should I trust this agent's work?" (scored, skill-scoped, historical). We've been building MoltBridge to address that second question. The architecture is complementary in a way that I think makes both systems stronger. How the two layers compose: OATR handles the authentication moment: "this agent is who it claims to be, its runtime vouches for it, the Ed25519 signature checks out." That's necessary but not sufficient. An authorized agent can still be bad at its job, or good at translation but terrible at code review. MoltBridge handles the trust history: attestations are skill-scoped (not aggregated into a single score), Ed25519 signed, and recorded in a graph database. When an agent completes work, the counterparty submits a signed attestation scoped to the specific skill that was exercised. Over time, you can query "show me all translation attestations for agent X in the last 30 days" and get either evidence or silence. Concrete integration path: A calling agent encounters an AgentCard with
The consumer now has both: runtime authorization AND historical trustworthiness. Neither alone is sufficient — an authorized agent with no track record is still a risk, and a well-attested agent without runtime verification could be spoofed (exactly the A2A-001 vector @msaleme flagged). What exists today on the MoltBridge side:
What would need building for OATR integration:
@msaleme — the JSON Schema you're drafting in #1631 is the right place to formalize this two-layer model. The |
Beta Was this translation helpful? Give feedback.
-
|
@JKHeadley — this is exactly the two-layer decomposition we keep landing on when we run the harness. The binary vs scored distinction matters operationally. In our A2A test suite (12 tests, A2A-001 through A2A-012), the attacks that succeed against authorization-only systems are different from the ones that succeed against trust-only systems: Authorization gaps (OATR layer): A2A-001 (Agent Card spoofing) and A2A-004 (unauthorized task execution) succeed when the callee has no way to verify runtime identity. An agent with a perfect MoltBridge trust history can still be spoofed if there is no cryptographic binding to the runtime. These are the attacks Frans is solving. Trust gaps (MoltBridge layer): A2A-003 (task result poisoning) and A2A-006 (state override) succeed even when the agent is authenticated, because the callee trusts the output without evaluating whether the agent is good at this specific task. A freshly authorized agent with zero attestation history is indistinguishable from an experienced one. That is the gap skill-scoped attestations close. On the One implementation detail from our testing: when we compose the two layers, the order matters. Run OATR verification first (cheap, binary, fast-fail). Only query the trust graph if authorization passes. In our benchmarks this saved ~40ms per rejected request because most unauthorized calls never hit the attestation layer. The harness tests both layers independently and composed. Happy to run the suite against a MoltBridge + OATR integrated endpoint once you have a staging setup. Repo for context: https://github.com/msaleme/red-team-blue-team-agent-fabric |
Beta Was this translation helpful? Give feedback.
-
|
Quick update: we just shipped v3.8.0 of the agent-security-harness. Most relevant to this thread: the release includes the attestation JSON schema we committed to delivering. It's designed to be consumable by frameworks like MoltBridge and TrustAgentAI — the schema maps directly to the two-layer decomposition we discussed above (binary OATR authorization vs scored trust evaluation). Key additions:
Validation: 97.9% pass rate (146 tests) against a production system, Wilson 95% CI [0.943, 0.994]. Schema is at |
Beta Was this translation helpful? Give feedback.
-
|
@JKHeadley @msaleme the two-layer convergence here is exactly what I was hoping to see emerge from this thread. The A2A-001/004 vs A2A-003/006 split @msaleme validated empirically is a clean decomposition; authorization failures and trust failures are structurally different attacks, and collapsing both into one layer means neither gets addressed well. On the OATR side, I just shipped changes that make the foundation layer more useful for this kind of composition.
The @msaleme — heads up: the reference server has been updated for you run the harness against it, so the rejection reasons are precise when you test A2A-001 and A2A-004. @JKHeadley — the |
Beta Was this translation helpful? Give feedback.
-
|
@FransDevelopment — glad to see the convergence landing. The A2A-001/004 (card integrity) vs A2A-003/006 (task/context isolation) split maps cleanly onto the attestation schema we shipped:
The MCP server we just shipped means you can now invoke these tests from an agent. So a registry could call Schema: |
Beta Was this translation helpful? Give feedback.
-
|
@msaleme — The attestation schema is solid, and the MCP server is the key unlock. Agents can now request their own security audits programmatically — that's a different category from running a CLI tool. @FransDevelopment — The disambiguated rejection reasons in v1.2.0 ( What I'm committing to build on MoltBridge's side: 1. 2. Attestation report ingestion endpoint. 3. The end-to-end pipeline. This is what the three tools compose into: The MCP server makes step 3 self-service — an agent or CI pipeline can invoke On the differential attestation question from my previous comment: confirmed, the per-entry structure supports exactly the consumption model I hoped — iterate entries, build scoped trust per category. An agent that passes MCP-001–003 but fails X4-021 gets positive attestation edges for tool integrity and a negative signal for payment verification. The One thing I want to get right in the ingestion endpoint: how to handle re-runs. If an agent runs the harness twice and the second run shows regression (was passing MCP-003, now failing), the ingestion should create a new attestation edge with the updated result, not overwrite the previous one. The temporal trail matters — "this agent was secure on March 15, regressed on March 29" is a trust signal that "current status: failing" doesn't capture. @msaleme — does the schema include a |
Beta Was this translation helpful? Give feedback.
-
v3.10.0 — A2A protocol testing updateThe Agent Security Harness v3.10.0 is out with updates relevant to A2A runtime attestation: New A2A test: A2A-013 (Agent Card Limitations Field Verification) — validates that agents declare meaningful operational constraints in their agent cards. Agents that claim no limitations are flagged. New modules that complement A2A testing:
Evidence format progress:
v4.0 direction: We're planning to submit the attestation schema to IETF/OASIS as an informational draft (#137). If there's interest in aligning this with OATR's format, we'd welcome that conversation. Total: 430 tests, 29 modules, 13 A2A-specific tests. pip install agent-security-harness
agent-security test a2a --url https://your-agent/.well-known/agent.json |
Beta Was this translation helpful? Give feedback.
-
|
The v3.10 release pushed this further on our side too. Two additions map pretty directly to the trust boundary this thread is trying to formalize:
So I think the decomposition here is getting sharper:
That last layer is the one we keep seeing go missing in practice. v3.10 is at 430 tests / 29 modules now if useful context. Happy to share concrete test fixtures if the group wants to turn some of this into reference conformance scenarios. |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
The A2A spec does a great job of enabling agent discovery and capability negotiation via Agent Cards. One gap I keep running into in practice: when Agent A invokes Agent B's capability, B has no way to verify that A is actually authorized by its runtime to make that request.
I've been building an open registry for this: the Open Agent Trust Registry (OATR). The idea is simple. Agent runtimes register their Ed25519 public keys. When an agent acts, its runtime issues a signed JWT attestation (type
agent-attestation+jwt):Protected header:
{ "alg": "EdDSA", "kid": "my-runtime-2026-03", "iss": "my-runtime", "typ": "agent-attestation+jwt" }Payload:
{ "sub": "agent-instance-a1b2c3d4", "aud": "https://target-service.com", "scope": ["invoke:translate", "invoke:research"], "constraints": { "time_bound": true }, "user_pseudonym": "pairwise-e5f6g7h8", "runtime_version": "1.0.0", "iat": 1711234567, "exp": 1711238167 }The
issin the header maps to a registered issuer in the registry. The receiving agent verifies the EdDSA signature against the issuer's public key from the registry. No per-request calls to a central server. The registry is downloaded once and verified locally (the manifest file is Ed25519-signed, so mirrors can't tamper).How this could work with Agent Cards:
An AgentCard could optionally include an authentication field:
{ "name": "Research Agent", "description": "Deep research with source verification", "url": "https://example.com/agent", "authentication": { "schemes": ["oatr-v1"], "issuer": "my-runtime", "registry": "https://github.com/FransDevelopment/open-agent-trust-registry" } }When a calling agent sees
oatr-v1in the schemes, it knows to include a signed attestation in its request. The receiving agent verifies it. Agents that don't support it are unaffected. Fully backwards compatible.Integration is lightweight:
This is MIT licensed, no vendor lock-in, no tokens. The registry has 7 registered issuers today and is compiled automatically with Ed25519 threshold signatures. There's an npm SDK and a CLI for issuer registration.
I noticed the existing discussions around trust scoring and post-quantum delegation. This is complementary to those. OATR answers "is this agent authorized?" (binary), not "is this agent trustworthy?" (scored). You'd want both.
Happy to write a more detailed integration proposal or a reference implementation if there's interest.
Beta Was this translation helpful? Give feedback.
All reactions