Intelligence

The Destination Was Authorized. The Redirected Destination Was Not.

GHSA-725p-44hx-v52c, published 6 September 2026 against OpenMAIC through version 1.0.0, describes a caller supplied bring your own key provider base URL that OpenMAIC's own validateUrlForSSRF correctly checks once, before the server's own outbound fetch follows an ordinary HTTP redirect with no second check. A public address that responds with its own redirect to a private or metadata address reaches that private target anyway. Version 1.0.1 fixes the boundary by revalidating every redirect hop and dropping provider credential headers once the hop crosses origin.

Event analysed: . This analysis was published on 7 September 2026.

When OpenMAIC correctly checked that a caller supplied bring your own key provider base URL was not a private or internal destination, what checked the destination the provider's own HTTP redirect pointed the next request to?

Nothing, until version 1.0.1. GitHub Security Advisory GHSA-725p-44hx-v52c, published 6 September 2026 against openmaic through version 1.0.0 and rated Moderate at CVSS 4.0 6.9 with no CVE assigned as of this record, states that OpenMAIC's validateUrlForSSRF performs a single DNS classification of the origin hostname a caller names as a bring your own key provider's base URL, called once during model resolution, before the server later issues an ordinary fetch that follows redirects by default with no further check. The advisory's own proof of concept controls read this way: a baseUrl parameter pointing directly at a private target is rejected with the guard's own local network block message, and a baseUrl pointing at a public address that responds with a 302 Location header naming a private target is followed, with OpenMAIC's own server reaching that private target from its own source address. This record's own direct read of OpenMAIC's source at the v1.0.0 tag confirms the shape the advisory describes: validateUrlForSSRF resolves a hostname's DNS records and rejects a private, loopback or link local result, resolve-model.ts calls it once against a caller supplied baseUrl, and lib/ai/providers.ts later issues a globalThis.fetch call carrying the caller's own request headers with no redirect option set, which defaults the fetch to following redirects automatically. Version 1.0.1 replaces that unguarded fetch with a dedicated fetchWithRedirectValidation function, read directly by this record, that sets redirect to manual, resolves each Location header against the current URL, calls validateUrlForSSRF again on the resulting address before following it, fails closed with the guard's own rejection message on a disallowed destination, bounds the chain to five hops, rejects a missing or malformed Location header, refuses to replay a streaming request body across a hop, and strips the authorization, api-key, x-api-key and x-goog-api-key headers once a hop crosses origin. Connection time DNS pinning, which would close a narrower rebinding variant where the same hostname resolves differently between the validation call and the actual connection, is not part of this specific fix, and this record does not credit it with that separate protection.

OpenMAIC's own affected source does not leave room to argue the destination check was missing. It exists, it is called, and this record's own direct read of it at the v1.0.0 tag confirms it does exactly what its own name promises: it resolves a hostname's DNS records and refuses a private, loopback or link local result. The gap this record documents sits one step later, at the point where a validated destination stops being the destination the server actually contacts.

What GHSA-725p-44hx-v52c states, and what this record independently read

GitHub Security Advisory GHSA-725p-44hx-v52c, published 6 September 2026 by reporter Ahmed Ibrahim against THU-MAIC's openmaic through version 1.0.0 and fixed in 1.0.1, titles itself plainly: SSRF protection bypass via unvalidated HTTP redirect on bring your own key base URL. Rated Moderate at a CVSS 4.0 base score of 6.9 with no CVE assigned to this record as of this writing, the advisory names four exact locations: app/api/verify-model/route.ts at line 22, lib/server/resolve-model.ts at lines 103 to 109, lib/server/ssrf-guard.ts at lines 253 to 301, and lib/ai/providers.ts at line 1887.

This record's own direct read of the v1.0.0 tag confirms the mechanism the advisory describes, though at a different line window for validateUrlForSSRF's own definition, 197 to 238 rather than the advisory's own cited 286 to 299, a discrepancy this record preserves rather than resolves, most plausibly explained by the advisory citing the file at a commit closer to the fix than the v1.0.0 release tag itself. What this record confirmed regardless of the exact line numbers: resolve-model.ts calls validateUrlForSSRF once against a caller supplied baseUrl, inside a conditional this record's own read found gated on process.env.NODE_ENV being production, a separate fact this record connects below to a distinct advisory. validateUrlForSSRF itself parses the URL, permits only http and https, allows an operator set ALLOW_LOCAL_NETWORKS environment variable to bypass every remaining check, otherwise rejects a literal loopback or link local hostname outright, and for anything else resolves the hostname's DNS records and rejects a result containing a private address. Nothing in this function, and nothing this record found calling it a second time, revisits that decision once the request it authorized is actually sent.

An unguarded fetch that follows wherever the provider's own response points it

The consequential connection happens afterward, in lib/ai/providers.ts, where this record's own direct read at v1.0.0 confirms a globalThis.fetch call carrying the caller's own request configuration, including whatever authorization, api-key, x-api-key or x-goog-api-key header the caller's own bring your own key credential supplies, with no redirect option specified. Node's fetch defaults an unspecified redirect option to follow, meaning a 3xx response with a Location header is not returned to the caller as a response at all: the runtime itself issues the next request, to whatever address that header names, carrying the same request configuration forward. Whatever validateUrlForSSRF decided about the origin hostname the caller supplied has no bearing on that second, runtime chosen address, because nothing calls it again before the second request goes out.

The advisory's own proof of concept controls state the resulting behavior precisely. A baseUrl parameter pointing directly at a private target is rejected, with the guard's own local network block message returned to the caller: the initial check genuinely works. A baseUrl parameter pointing at a public address that itself answers with a 302 Location header naming a private target is not rejected. The advisory states that OpenMAIC's own container subsequently reaches the internal target from its own source address, exactly as though the private address had been supplied directly and the guard had never run.

The fix: revalidate the hop, not only the origin

OpenMAIC 1.0.1, released the same day this record's own review of its release notes confirms addressed four separate advisories together, replaces the unguarded fetch in the bring your own key completion path with a dedicated function, fetchWithRedirectValidation, which this record read directly in the fixed source. The function issues each request with redirect set to manual rather than the default follow, so a 3xx response is returned to OpenMAIC's own code as a response object rather than chased automatically. It resolves the Location header's value against the current request URL, handling a relative redirect the same way a browser would, then calls validateUrlForSSRF again against that resolved address before doing anything else with it. A rejected address fails the request outright with the guard's own message rather than the redirect being silently followed or silently dropped. The loop is bounded at five hops, a missing or malformed Location header fails the request rather than being treated as success, and a streaming request body is never replayed across a hop, since a body already consumed once cannot be resent to a second destination without either buffering it in full or refusing the redirect, and this record's own read confirms the fixed function chooses to refuse rather than buffer.

The fixed function also strips the authorization, api-key, x-api-key and x-goog-api-key headers from the outgoing request once a hop's resolved origin differs from the request's own current origin, this record's own direct read of the credential handling confirmed. A caller's bring your own key credential is scoped to the origin OpenMAIC's own validation most recently cleared; once a redirect substitutes a different origin, that credential is no longer carried forward automatically. This record does not read that stripping as a claim that every possible credential leak through this path was previously demonstrated: the primary advisory's own proof of concept shows the destination substitution, a public origin's redirect reaching a private target, and does not itself demonstrate a credential reaching an attacker controlled endpoint. The fix closes both the destination gap the advisory demonstrates and the credential exposure the same unguarded redirect would otherwise have created, and this record keeps the two as related but separately evidenced facts rather than treating the demonstrated destination bypass as proof of a specific credential theft.

A separate advisory, fixed the same release, addressing a different failure

OpenMAIC 1.0.1's own release notes name a second SSRF related advisory in the same release, GHSA-9m7h-vh2h-rc3w, and this record keeps the two distinct rather than merging them. That advisory's own mechanism, read directly by this record, is that OpenMAIC's Next.js middleware left all API routes reachable with no authentication whenever an operator's ACCESS_CODE environment variable was left unset, the state the project's own .env.example file defaults to, and that across six separate route handlers, resolve-model.ts included, the same validateUrlForSSRF call this record documents above ran only when process.env.NODE_ENV equaled production, so a deployment running in development, staging, preview or any unset environment skipped the destination check entirely rather than the check running and failing to survive a later redirect. GHSA-725p-44hx-v52c's own mechanism, by contrast, is that the check does run, and does correctly reject a direct private target, in exactly the conditions where GHSA-9m7h-vh2h-rc3w's own environment gate would have let it run at all. One advisory is about a check that can be skipped outright; the other is about a check that runs and passes, then stops mattering the moment the destination changes underneath it. This record does not attribute either mechanism's evidence to the other, and does not read fixing one as evidence bearing on the other's own separate remediation.

Where this sits in the pattern

Rowboat's own custom MCP server and webhook URLs showed a genuine authorization check immediately followed by a scheme only validator with no destination check at all, and OGX's own validate_url_not_private helper showed a working destination check simply never connected to one caller controlled path; both describe a destination check that was absent on the vulnerable path itself. OpenMAIC's own case is a different shape: the destination check is present, is connected to the right call site, and this record's own read confirms it correctly rejects a direct private target exactly as designed. What it does not do is bind that decision to the request that actually executes once the provider's own response substitutes a different destination through an ordinary protocol mechanism, a redirect, that the validation step never inspected. That is the same authority binding failure this dataset already tracks under approval not bound to the executed action: an authorization decision, real and correctly made, attaches to what was presented for review, here a caller supplied baseUrl, while a different destination, substituted by state the decision never inspected, is what the request that follows actually reaches. This desk's own broader argument, that execution authority has to be evaluated at the moment of the consequential action rather than assumed from an earlier decision, holds here at a network destination rather than at a cached classification or a pending approval: OpenMAIC's own fix answers it the same way this dataset's other known examples of the pattern already do, by re evaluating the authority decision immediately before the effect that decision is meant to gate, here per redirect hop rather than once per request.

What this record does not establish

This record does not claim GHSA-725p-44hx-v52c has been exploited against a real OpenMAIC deployment, and found no report of active exploitation in either advisory or in independent search. It does not claim the pre fix mechanism demonstrably exfiltrated a caller's own provider credential to an attacker controlled endpoint, since the primary advisory's own proof of concept demonstrates the destination substitution rather than a credential reaching a specific attacker address; the 1.0.1 fix's own credential header stripping is read as closing that further exposure, not as proof it was previously realized. It does not claim connection time DNS pinning, a control that would address a hostname resolving differently between the validation call and the actual connection rather than an HTTP level redirect, is implemented anywhere in this specific fix, and this record's own read of fetchWithRedirectValidation found no such mechanism. It does not state a formally assigned CVE identifier for GHSA-725p-44hx-v52c, since none appears in the advisory as read by this record. Where the evidence available to this record does not establish a fact, this record states it as unknown rather than inferring it from how the pattern has resolved elsewhere in this dataset.

Sources

This analysis interprets third-party reporting, research and announcements. Moona is not the original reporter of the underlying events.

[1]
SSRF protection bypass via unvalidated HTTP redirect on BYOK base URL
THU-MAIC/OpenMAIC (GitHub Security Advisories) · Ahmed Ibrahim (skeletonsec) · 6 September 2026 · Primary source
[2]
Release v1.0.1
THU-MAIC/OpenMAIC (GitHub Releases) · 6 September 2026 · Primary source
[3]
fetch-with-redirect-validation.ts at v1.0.1
THU-MAIC/OpenMAIC (GitHub, source) · Primary source
[4]
ssrf-guard.ts at v1.0.0 (validateUrlForSSRF)
THU-MAIC/OpenMAIC (GitHub, source) · Primary source
[5]
resolve-model.ts at v1.0.0 (BYOK base URL validation call)
THU-MAIC/OpenMAIC (GitHub, source) · Primary source
[6]
providers.ts at v1.0.0 (unguarded provider fetch)
THU-MAIC/OpenMAIC (GitHub, source) · Primary source
[7]
Unauthenticated outbound SSRF to cloud metadata service via fail-open middleware and environment-gated validation bypass
THU-MAIC/OpenMAIC (GitHub Security Advisories) · 6 September 2026 · Primary source

Protocol evidence

This record does not assess these architectures. The connection runs through the Risk Registry requirement each one bears on, and these published authority architectures are what the evidence says about that requirement.

Protocol evidence related through AEW-005 Approval not bound to the executed action

  • Supports requirement

    Agent Flight Recorder

    Laurent Bindschaedler, Quentin Botha, Christoph Siebenbrunner (independent research, arXiv preprint)

    Requirement Cryptographic binding of the approval field to the approver's identity and the specific action is described as a production deployment property, not an unconditional schema guarantee

    This weakness's own known examples are, across every one of them, a case where an approval attached to nothing verifiable or a later state change went unchecked against a prior decision. Agent Flight Recorder's own schema keeps a human approval field and an execution field as two independently checkable facts rather than one narrative line, which is a direct answer to the underlying need this weakness names: an approval must bind to a specific action, not merely occur near one. It supports that requirement rather than implementing an enforced version of it, because the reported cryptographic binding of the approver's identity to the specific action applies only in production deployments of the construction, not as an unconditional schema guarantee, and the mechanism records the approval/execution relationship for later forensic inspection rather than checking it before the action dispatches the way EMILIA's action hash rejection or Codex CLI's authorization freshness recheck do.

    View protocol evidence

  • Supports requirement

    Agent Infrastructure Control Protocol (AICP)

    Tihan-Nico Paxton, Apollo Deploy (individual submission to the IETF)

    Requirement An accepted approval binds cryptographically or transactionally to one exact plan revision

    This weakness's own corrective response pattern calls for binding an approval to the exact action object by hash or an equivalent identity, and rejecting execution when the action presented for review differs from the action about to run. AICP's own Section 9.4 requires an accepted approval to be cryptographically or transactionally bound to the Plan identifier, exact revision, approving principal, material changes and expiry, stating directly that approval of prose alone is insufficient and that a changed revision is not authorized by the old approval. The HTTP binding in Section 14.5 enforces the same binding mechanically, through a conditional request against the Plan's strong entity tag. Recorded as design evidence for the requirement this weakness already states, not as a claim that any provider has implemented this draft's text.

    View protocol evidence

  • Supports requirement

    An Architecture for Auditing Agent Delegation and Interactions (audit-architecture)

    Mirja Kuehlewind (Ericsson) and Henk Birkholz (Fraunhofer SIT), individual submission to the IETF

    Requirement Authorization is modeled as an ordered sequence of transitions, not a single current value

    This weakness's own response pattern calls for recomputing an approval's binding to the exact action at the enforcement point rather than trusting an earlier decision, including the temporal window that decision was made under. The draft's Action Record carries an authorization scope and expiry alongside the action it bears on, and its Authorization Transition Record class exists specifically so the state in force at a given point in a run can be reconstructed rather than assumed from whatever is currently known. Recorded as design evidence for the general response pattern; this record's own evidence separately connects to a targeted extension of Moona's canonical Authority Resolution engine closing the equivalent gap in Moona's own runtime reasoning, not a claim that this draft's own text was implemented anywhere.

    View protocol evidence

  • Supports requirement

    ChainIT Authority Protocol and Agent Subject Profile for pre execution authority validation

    ChainIT

    Requirement A canonical transaction digest is described binding payer, payee, destination, amount, currency or asset and payment rail to approval and execution

    A canonical transaction digest binding payer, payee, destination, amount, currency or asset and payment rail to both approval and execution is a direct, more specific response to an approval that attaches to nothing in particular. This is the corrective this weakness describes, named at the level of concrete payment fields rather than a generic hashed parameter set.

    View protocol evidence

  • Supports requirement

    Codex CLI 0.151.0, restored permission profiles and authorization bound Guardian classifications

    OpenAI

    Requirement A cached low risk score is checked against the current authorization state before it is allowed to approve, and a mismatch defers to strict review rather than proceeding

    Codex CLI's own fix rechecks a cached decision against current authorization state before it is allowed to approve anything, refusing to let a decision computed under one state keep approving after that state has moved. Claude Code's own current plugin marketplace documentation, read directly, describes an installed plugin auto-updating on a version, commit or content digest signal with no described mechanism to diff, flag or gate a change to the plugin's own hooks.json specifically, so whatever authority a user's earlier trust decision represented is not shown to be rechecked once a later update changes what that plugin's bundled hooks execute. Codex CLI's own mechanism is the corrective the reviewed documentation does not describe for this specific binding.

    View protocol evidence

  • Supports requirement

    EP Authorization Receipts (EMILIA Protocol)

    Iman Schrock, EMILIA Protocol, Inc., individual submission to the IETF

    Requirement Implementations MUST reject an approval request whose action hash does not match a locally recomputed hash of the presented Action Object

    EMILIA's requirement that an approval be rejected unless the action hash matches a locally recomputed hash of the exact action object is the binding these cases lack, where an approved command's behaviour is decided by state the approval never inspected.

    View protocol evidence

  • Supports requirement

    EP Authorization Receipts (EMILIA Protocol)

    Iman Schrock, EMILIA Protocol, Inc., individual submission to the IETF

    Requirement Offline verification does not establish current revocation status, and the draft requires a relying party to apply current policy and current status inputs before any new reliance decision

    UiPath Maestro's own default on Refresh schema before call setting keeps an MCP tool's technical interface current immediately before each call, but nothing in UiPath's own documented behavior establishes that the parameter authority a workflow's configuration granted against the original schema is re evaluated once a later schema changes underneath it. That gap, a technically current interface with no stated authority re evaluation behind it, is exactly the condition EMILIA's own requirement, that a relying party apply current status rather than historical acceptance before a new reliance decision, exists to close. UiPath's mechanism supports the need for that requirement rather than implementing it, the distinction this dataset already keeps between this property's two linked entries. A preprint posted to arXiv on 3 September 2026, 2609.03340, Fresh Memory, Stale Plans, restates the same distinction for a derived plan specifically: an executor that has read a superseding revision of a shared requirement into its own memory can still execute a plan derived from the earlier revision, since refreshing the executor's memory does nothing to a plan already computed from the state that memory has since moved past, so current state and current authorization for a pending action are two different facts. Read at the manual review evidence level, corroborated through convergent search rather than a direct read of the primary text, since arxiv.org and every mirror this record attempted were blocked at this session's network egress proxy; treated as further support for the requirement, not as an implementation of it.

    View protocol evidence

  • Supports requirement

    N-AALP, Native Agentic Application Layer Protocol (draft-bubblefish-naalp)

    BubbleFish, individual submission to the IETF

    Requirement A signed-action-object model with a content-bound Approval and a single-use consume ledger is reported, not independently verified

    This weakness's own response pattern calls for binding an approval to the exact action object, by hash or an equivalent identity, rather than to a name or a connection. The reported mechanism, an Approval bound under signature to the content id of the exact canonical argument object and, for an MCP call, a tool_id and args_id together, so a changed tool description or changed arguments yields a different approved call identity, would be a clean instance of exactly that pattern if it accurately reflects the draft's own filed text. This session could not independently verify that text through any reachable primary or secondary source, so this link is recorded conditionally: design evidence for the weakness's own already-established requirement, not confirmation that this specific draft implements it.

    View protocol evidence

  • Supports requirement

    N-AALP, Native Agentic Application Layer Protocol (draft-bubblefish-naalp)

    BubbleFish, individual submission to the IETF

    Requirement A durable single-use consume ledger, and a stated limit that offline verification proves validity at issue, not current unspentness, are reported, not independently verified

    This weakness's authorityGap states that authority attaches to what was presented for review, not automatically to whatever executes afterward; an approval a durable ledger has already recorded spent is not, in any meaningful sense, still attached to a further execution. The reported single-use consume ledger, and the reported statement that offline cryptographic verification proves validity at issue rather than current unspentness, would instantiate that gap precisely for a signed approval's own consumption state rather than its identity binding. Unverified by this session for the reason stated above; this record's own independent contribution is the additive extension it separately motivated to Moona's canonical Authority Resolution engine (an evidenced approval's singleUse/consumed state, consulted only when singleUse is evidenced true), which does not depend on this specific draft's own claims being confirmed.

    View protocol evidence

  • Supports requirement

    The Missing Execution-Finality Protocol Layer of the Internet (draft-das-execution-finality-protocol-layer)

    Sangram Das, individual submission to the IETF

    Requirement A validated Candidate Act may produce a narrowly scoped, non-bearer Execution Handle bound to that one act and to the Finality Sink that will consume it

    This weakness's own response pattern calls for binding an approval to the exact action object and recomputing that binding at the enforcement point rather than trusting possession of a credential. The non-bearer Execution Handle, corroborated through convergent search rather than a direct read of the filed text, generalizes exactly that principle to a credential class broader than one interface family: a validated Candidate Act may produce a handle scoped narrowly to that one act, and possessing the handle is not itself proof the currently presented act still matches the one it was issued for. Recorded as documented design evidence restating this weakness's own already-established requirement at a general level, not as independent confirmation that this specific umbrella draft's own mechanism is demonstrated running anywhere.

    View protocol evidence

  • Supports requirement

    The Missing Execution-Finality Protocol Layer of the Internet (draft-das-execution-finality-protocol-layer)

    Sangram Das, individual submission to the IETF

    Requirement Formalizes Candidate Act, Non-Effective State, Protected Enforcement Domain, Execution Handle and Finality Sink as shared vocabulary for a family of domain-specific drafts

    This weakness's own known examples had, before this addition, connected to draft-das-agentic-tool-binding-03 as though it were a freestanding architecture. Convergent search corroborates this draft as the umbrella that sibling instantiates: a Protected Enforcement Domain validates authority scoped to an act's purpose, destination, jurisdiction, freshness, revocation state, policy epoch, runtime integrity and effectuation-boundary identity together, a broader validation surface than the tool-binding draft's own two directly verified consequence classes. Recorded as design evidence for this weakness's own binding requirement at the general architecture level; this session located no reference implementation for this specific umbrella draft and does not treat any part of it as independently verified running code.

    View protocol evidence

  • Supports requirement

    The Missing Execution-Finality Protocol Layer of the Internet (draft-das-execution-finality-protocol-layer)

    Sangram Das, individual submission to the IETF

    Requirement Fails closed on missing, stale, mismatched, replayed or unverifiable context

    This weakness's own response pattern calls for rejecting execution when the action presented for review differs from the action about to run, rather than proceeding on a default allow. The signal that prompted this record carries a five-item fail-closed enumeration, missing, stale, mismatched, replayed or unverifiable context, consistent with the fail-closed behavior this weakness's own draft-das-agentic-tool-binding-03 known example already verified directly in running code for one narrower mechanism. This session's own independent search did not itself return that exact enumeration from a secondary source, so this link is recorded as documented design evidence consistent with corroborated evidence, not as independently re-confirmed word for word against the filed text.

    View protocol evidence

  • Supports requirement

    tool_use Is Not invoke(): Binding Execution Finality to Agentic Tool Call Interfaces and MCP (agentic-tool-binding)

    Sangram Das, individual submission to the IETF

    Requirement Authority is scoped to one Candidate Act through a deterministic digest of its own exact arguments

    This weakness's own response pattern calls for binding an approval to the exact action object by hash or an equivalent identity and recomputing that binding at the enforcement point rather than trusting the request. Act Bound Authority, confirmed directly this session from the draft's own reference implementation, is exactly that binding applied to tool dispatch: a deterministic digest computed over a Candidate Act's own exact arguments, so authority issued for one call cannot be presented for a different call bearing different arguments even under the same session or workload. Recorded as design evidence independently demonstrated in running reference code, not as a claim that this specific implementation is deployed anywhere.

    View protocol evidence

  • Supports requirement

    tool_use Is Not invoke(): Binding Execution Finality to Agentic Tool Call Interfaces and MCP (agentic-tool-binding)

    Sangram Das, individual submission to the IETF

    Requirement A Finality Sink verifies authority atomically immediately before invoke() runs, fail closed on any failure

    This weakness's own response pattern calls for recomputing an approval's binding at the enforcement point rather than trusting an earlier decision. The Finality Sink, confirmed directly this session from the reference implementation's own sink module, is that enforcement point positioned immediately before the underlying invoke() call, verifying authority atomically and blocking execution whenever verification does not succeed rather than proceeding on a default allow. Recorded as design evidence for the same requirement EMILIA's own action-hash rejection requirement already formalizes for payment operations, applied here to tool dispatch generally.

    View protocol evidence

  • Supports requirement

    tool_use Is Not invoke(): Binding Execution Finality to Agentic Tool Call Interfaces and MCP (agentic-tool-binding)

    Sangram Das, individual submission to the IETF

    Requirement Each parallel tool call requires its own independently computed authorization

    None of this weakness's own known examples had, before this addition, named independent authorization for concurrent tool calls specifically. The reference implementation's own test scenarios, read directly this session, decide a parallel search plus unauthorized payout case as two independent authorization decisions rather than one session-level trust judgment covering an entire batch, closing a gap this weakness's own binding requirement implies but had not yet evidenced concretely for parallel dispatch.

    View protocol evidence

  • Supports requirement

    tool_use Is Not invoke(): Binding Execution Finality to Agentic Tool Call Interfaces and MCP (agentic-tool-binding)

    Sangram Das, individual submission to the IETF

    Requirement A retried or replayed call presenting already-consumed authority is denied

    This weakness's own known examples document an approval or a cached decision surviving a state change it never accounted for; none had yet named a retried or replayed call presenting already-spent authority as its own distinct axis. The reference implementation's own replay store, read directly this session, marks authority consumed atomically on first use and denies a subsequent presentation of the same authority, with the implementation's own stated limitation that this protection is local rather than distributed. Recorded as design evidence for a property this weakness's own response patterns imply but had not yet evidenced at this level of precision.

    View protocol evidence

  • Implementation evidence

    EP Authorization Receipts (EMILIA Protocol)

    Iman Schrock, EMILIA Protocol, Inc., individual submission to the IETF

    Requirement Implementations MUST reject an approval request whose action hash does not match a locally recomputed hash of the presented Action Object

    MoonPay's PayBox documents that any change to an operation's amount, merchant, destination, contract, function or secret name after submission forces a fresh approval request rather than letting the original one carry over. That is the same operation-bound approval EMILIA's action-hash rejection requirement formalizes cryptographically, arrived at independently in a live consumer product rather than a draft specification, which corroborates that the requirement is buildable outside a standards process.

    View protocol evidence

  • Implementation evidence

    EP Authorization Receipts (EMILIA Protocol)

    Iman Schrock, EMILIA Protocol, Inc., individual submission to the IETF

    Requirement Offline verification does not establish current revocation status, and the draft requires a relying party to apply current policy and current status inputs before any new reliance decision

    Codex CLI's own merged fix binds a cached Guardian v2 classification to the exact authorization state it was scored against and refuses to let it approve an action once that state has moved, arrived at independently in a shipped product rather than a draft specification. That corroborates EMILIA's own requirement that a relying party apply current status inputs before a new reliance decision rather than treat historical acceptance as still current, the same binding failure this weakness already describes. OpenMAIC's own 1.0.1 fix, read directly by this dataset, applies the identical principle to a network destination rather than a cached score: fetchWithRedirectValidation re-runs validateUrlForSSRF against every redirect hop before following it, rather than treating the single validation performed against the caller's originally supplied bring your own key base URL as still current once an ordinary HTTP redirect substitutes a different destination. A third independent, shipped instance of the same requirement, this one at a network authority boundary rather than at an approval or a classification.

    This record is the cited evidence for this relationship.

    View protocol evidence

  • Missing requirement

    ChainIT Authority Protocol and Agent Subject Profile for pre execution authority validation

    ChainIT

    Requirement No canonicalization algorithm, serialization format or independent test of the transaction digest against a live or reference transaction was found

    Naming the fields a digest binds is not the same fact as a demonstrated binding. No canonicalization algorithm, serialization format or independent test of the digest against a live or reference transaction was found, so whether an executed transaction can be proven identical to the one approved remains a missing requirement rather than a closed one.

    View protocol evidence

  • Missing requirement

    Codex CLI 0.151.0, restored permission profiles and authorization bound Guardian classifications

    OpenAI

    Codex CLI's own shipped Guardian v2 fix binds a cached tool call classification to the exact authorization state it was scored against, refusing to let a stale classification approve a call once that state has moved. GitHub issue 43549, read through this session's own automated web fetch and summarization tool, reports a materially different gap this record's own reviewed material states nothing about: whether a tool call's own reported terminal status, here the literal status aborted following the caller's own interruption, is checked against the account level effect that call already produced before reporting that status. The reviewed protocol record binds a decision to the state it was made under; it does not, on the material available to this session, bind a call's own reported outcome to the state the call actually left behind.

    View protocol evidence

  • Missing requirement

    tool_use Is Not invoke(): Binding Execution Finality to Agentic Tool Call Interfaces and MCP (agentic-tool-binding)

    Sangram Das, individual submission to the IETF

    Requirement The reference implementation ships under a restricted evaluation license, not open source

    Demonstrating a binding mechanism in reference code is not the same fact as that mechanism being available for production adoption. This session's own direct read of the reference implementation's LICENSE.md confirms a source-available evaluation license, not open source, explicitly denying production deployment and commercial use and reserving patent rights outside evaluation. Recorded as a missing requirement for anyone evaluating this reference implementation as a buildable corrective rather than as design evidence, not as a claim against the underlying architecture the draft itself describes.

    View protocol evidence

Related Intelligence

All Intelligence Records →