Intelligence

The Caller Chose the MCP Server. OGX Treated That Choice as Network Authority.

CVE-2026-85666, published 4 September 2026, describes OGX's OpenAI compatible POST /v1/responses endpoint accepting a caller supplied MCP tool definition whose server_url is fetched server side with no destination validation. The codebase already has a validate_url_not_private helper, and already applies it to two sibling caller controlled URL inputs. The MCP tool path does not call it. A caller could name a loopback or link local address as an MCP server and have the OGX process itself connect to it. Two proposed fixes, pull requests 6291 and 6390, remain open and unmerged as of this update; 6291 additionally distinguishes a caller supplied MCP endpoint from an administrator configured connector or toolgroup endpoint, keeping the latter's own broader reach intact.

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

When OGX let a caller name the address of an MCP server and then connected to it from the server's own network position, whose authority decided that the destination was an acceptable one to reach?

Nobody's, on the one path this record can verify. GitHub Security Advisory GHSA-9mg6-c5wp-2g44 formally assigns CVE-2026-85666 on 4 September 2026, CVSS 4.0 base score 8.7, High, under CWE-918, Server Side Request Forgery, against OGX, the open source agentic API server whose own README states it was formerly named Llama Stack. The advisory and the primary issue it stems from, GitHub issue 6287, opened 13 July 2026 against a private report the reporter dates to 9 June 2026, describe the same mechanism this record independently confirmed by reading the affected source at the commit the issue names, fbe8e0fb0fe99640327bf49b8156b65cd7fc8c19, matching the through 1.3.1 range formal CVE metadata states. OGX's OpenAI compatible POST /v1/responses endpoint accepts a caller supplied MCP tool definition carrying server_url, headers and authorization fields. Inside _process_mcp_tool, in src/ogx/providers/inline/responses/builtin/responses/streaming.py, the only check on server_url is that it is not empty. The value then reaches list_mcp_tools, which hands the caller supplied endpoint, unchanged, to mcp.py's session construction: streamablehttp_client(endpoint, headers=headers) for the default strategy, or sse_client(endpoint, headers=headers) when the caller selects SSE, followed immediately by ClientSession.initialize(). That initialize call, not a later tool invocation, is the point at which OGX's own process opens a network connection to whatever endpoint the caller named. Separately, mcp.py's prepare_mcp_headers function does reject a caller supplied Authorization key inside the generic headers dict, raising a ValueError naming the dedicated authorization parameter instead, but that same function turns a value supplied through that dedicated parameter into an Authorization: Bearer header sent to the caller chosen destination. The codebase's own validate_url_not_private helper, read directly in src/ogx/providers/utils/common/url_validation.py, resolves a URL's hostname, whether given as a literal address or resolved through DNS, and rejects the request if any resolved address is not globally routable, covering loopback, link local ranges including 169.254.169.254 and RFC 1918 private space. This record confirmed, by reading the source directly, that the same helper already gates two sibling caller controlled URL inputs elsewhere in this codebase: prompt_adapter.py's localize_image_content calls it before fetching a caller supplied image URL, and file_search.py's raw_data_from_doc calls it before fetching a caller supplied RAG document URL. Neither call appears in _process_mcp_tool. The primary issue's own reproduction deploys a loopback listener and shows OGX's server process connecting to it once a caller names that address as an MCP server_url, which this record treats as established evidence of a server side connection effect, not as evidence that any specific credential or cloud metadata service was ever actually reached. A proposed fix, pull request 6390, adds validate_url_not_private(mcp_tool.server_url) to _process_mcp_tool immediately before list_mcp_tools is called, and adds a test file covering a link local address, a loopback address and an allowed public address. A second, independently opened pull request, 6291, proposes the same destination check on the same caller supplied server_url, drawn as a draft rather than a submission ready for review, and states its own scope explicitly: a caller supplied endpoint reached through the Responses API is validated against private address ranges and restricted to the http and https schemes, while an administrator configured connector or toolgroup endpoint, resolved through a separate path this record did not find sharing code with _process_mcp_tool, remains trusted and outside the new check, in the pull request's own words, admin configured connector and toolgroup private MCP endpoints remain allowed, and connector resolved Responses URLs are trusted. As of this record, both pull requests remain open, awaiting review from the project's own code owners, and neither has merged.

Read OGX's own affected source and the fact that matters is not that a validation function is missing from the codebase. It is present, it is written correctly by the standard this record could verify, and it is already wired into two other places a caller supplied URL reaches an outbound request. The MCP tool path is the one place it was never connected.

What the primary issue and the source together establish

GitHub issue 6287, filed against ogx-ai/ogx by a reporter identified as geo-chen, states its own title plainly: unauthenticated server side request forgery via MCP tool server_url in POST /v1/responses. The issue was opened 13 July 2026, against a private report the reporter states was made 9 June 2026, a chronology this record carries as reported rather than independently timestamped, since only the public issue's own creation date is directly verifiable. The issue names the affected commit, fbe8e0fb0fe99640327bf49b8156b65cd7fc8c19, and this record read the source at that exact commit rather than relying on the issue's own prose description of it. OGX's OpenAI compatible Responses API accepts a request carrying an MCP tool object with server_url, headers and authorization fields, all caller supplied. Inside _process_mcp_tool, the only check applied to server_url before it is used is a null check, raising a ValueError only when the field is missing entirely. The value then passes to list_mcp_tools, called with the caller's own server_url, headers and authorization, which in turn calls into mcp.py to open a Model Context Protocol session against that endpoint.

What this record verified by reading the affected source directly, rather than by relying on the issue's or the advisory's own description alone: the null check in _process_mcp_tool checks only that server_url is non empty; list_mcp_tools is called with that value unchanged; and no call to validate_url_not_private, or any equivalent destination check, appears anywhere in that function or in the path list_mcp_tools takes to reach mcp.py's session construction.

The MCP session mechanism, and why initialization is not a lesser moment than invocation

mcp.py builds the transport for that session from a strategy selection: streamablehttp_client(endpoint, headers=headers) for the default Streamable HTTP strategy, or sse_client(endpoint, headers=headers) when the caller's tool definition selects SSE. Either client is opened directly against the caller supplied endpoint, and the resulting streams are handed to a ClientSession whose initialize method is awaited immediately after. That initialize call is not a formality ahead of the part that matters. It is the point at which OGX's own server process, from wherever it is deployed, opens a real outbound network connection to an address the caller chose, and it happens before any tool the MCP server might expose is ever listed, let alone called. A resource authority question that only gets asked at tools/call would already be too late here: the network effect this record is about occurs at session initialization, during what the Responses API surfaces to the caller as tool discovery.

The header and authorization asymmetry, read precisely

mcp.py's prepare_mcp_headers function does contain a real, working restriction: if a caller supplied headers dictionary carries a key that case insensitively matches authorization, the function raises a ValueError, stating that Authorization must be passed through the dedicated authorization parameter instead. That restriction is genuine and this record does not describe it as absent. What the same function does next is forward exactly the material that restriction was meant to gate through a different door: when a caller supplies a value through the dedicated authorization parameter, prepare_mcp_headers sets headers["Authorization"] to a Bearer token built from it, and that header reaches whatever endpoint server_url named. The caller cannot smuggle an Authorization value through the generic headers dict, but a caller who uses the field the API provides for exactly this purpose has their own credential material forwarded to a destination nothing has independently authorized. This record states that distinction because the accurate claim is narrower and more precise than either the API accepts arbitrary Authorization headers or the API never forwards credentials to a caller chosen destination.

A validation helper that already exists, and already governs two sibling paths

The codebase's own validate_url_not_private function, read directly in src/ogx/providers/utils/common/url_validation.py, takes a URL, resolves its hostname either as a literal IP address or through DNS lookup, and raises a ValueError if any resolved address is not globally routable. That check covers loopback addresses, link local ranges including 169.254.169.254, and private RFC 1918 space; it does not itself constrain which URL scheme is accepted. This record confirmed, by reading the calling source directly rather than by inference from the helper's own existence, that this exact function already gates two other caller controlled URL inputs in this codebase. prompt_adapter.py's localize_image_content calls validate_url_not_private on a caller supplied image URI before fetching its content. file_search.py's raw_data_from_doc calls the same function on a caller supplied RAG document URI before fetching it. Neither call appears anywhere in _process_mcp_tool's path to list_mcp_tools.

The systemic finding this record keeps precise: OGX is not a codebase with no server side request forgery defense. It is a codebase that already built one, already applies it correctly to two sibling caller controlled URL surfaces, and left the MCP tool's server_url on a third, more consequential surface outside that same policy's reach. The corrective this evidence points to is applying an existing control to the effect and resource class it already covers elsewhere, not inventing a new one.

What the reproduction shows, and what it does not

The primary issue's own proof of concept deploys a listener on a loopback address, distinct from any production internal service, and shows that a POST /v1/responses request naming that address as an MCP tool's server_url causes OGX's own server process to connect to it, evidenced by the listener receiving the connection. This record treats that as sufficient, independently verifiable evidence of the mechanism: a caller can direct the server's own network position at an address the caller chose, and the server acts on that direction without an independent check. It does not establish, and this record does not claim, that any specific internal service or cloud metadata endpoint was reached in this reproduction, that any credential was exfiltrated, or that the vulnerability has been exploited against a production OGX deployment. Cloud metadata reachability is a class of impact the mechanism plausibly extends to under a deployment where such an endpoint sits within the server's own network reach, not a demonstrated outcome this record can independently confirm.

Authentication scope: the tested starter configuration, not every deployment

The primary issue states that under the tested configuration, a default starter setup carrying no auth: block, GET /v1/health returns 200 with no Authorization header, which this record reads as establishing that the specific starter configuration tested was reachable without authentication, not as a general claim that every OGX deployment runs unauthenticated. OGX's own configuration surface supports an auth: block an operator can add, and this record found nothing in the primary issue or the advisory stating what fraction of real deployments run with or without one. The severity a caller supplied server_url with no destination check carries is worse under an unauthenticated deployment, since no credential is required to reach the vulnerable path at all, but the underlying mechanism, an accepted MCP tool definition's server_url reaching list_mcp_tools unchecked, does not itself depend on the endpoint being unauthenticated; it depends on the destination never being checked once a request, however it was authenticated, reaches _process_mcp_tool.

Two proposed fixes, converging on the same call and diverging on scope

Pull request 6390, titled by its own author fix(inference): validate MCP tool server_url to block SSRF to private addresses, adds a single call, validate_url_not_private(mcp_tool.server_url), to _process_mcp_tool immediately after the existing null check and before list_mcp_tools is reached, referencing issue 6287 directly in its own comment. It adds a new test file exercising three cases: a link local address, 169.254.169.254, rejected before list_mcp_tools is ever called; a loopback address, 127.0.0.1, rejected the same way; and a public address, 8.8.8.8, permitted through to list_mcp_tools as before. As of this record, the pull request carries one community review, is not yet approved by a maintainer with commit authority on the affected path, and has not merged. This record does not treat it as a shipped mitigation, and does not attribute CVE-2026-85666 a resolved status on the strength of an open pull request. The pull request's own description, read directly, does not add redirect revalidation or bind the eventual outbound connection to the specific address validate_url_not_private already resolved; a check that runs once ahead of a separate connection step is a real improvement over no check at all, but this record does not claim it closes a DNS rebinding or time of check to time of use gap between validation and connection, a distinct and separately evidenced mechanism this record keeps apart from what this pull request, as currently written, actually does.

A second pull request, 6291, titled fix(security): block SSRF via caller-supplied MCP server_url in Responses, opened independently of 6390 and remains a draft as of this record. It proposes the same underlying correction, a private address check applied to a caller supplied server_url reached through the Responses API, and additionally restricts the accepted scheme to http and https. What 6291 states that 6390's own description does not is an explicit boundary between two kinds of MCP endpoint: a caller supplied server_url submitted directly in a POST /v1/responses request, which the pull request's own description says is now validated against private address ranges, and an administrator configured connector or toolgroup endpoint, resolved through a path this record did not find sharing code with _process_mcp_tool, which the same description states explicitly remains permitted to reach a private address, quoting the pull request's own words directly: admin configured connector and toolgroup private MCP endpoints remain allowed, and connector resolved Responses URLs are trusted. This record reads that distinction as the same one this desk's own authority framework already draws for other intermediaries, that an endpoint an operator configured in advance and a destination a caller names in the request carry different provenance, and that a correction closing the caller supplied path does not need to, and should not, close the administrator's own configured one along with it. The pull request awaits review from six named code owners and, as a draft, has not been submitted for merge.

Two independently opened pull requests proposing convergent corrections to the same unchecked path is evidence the mechanism is well understood by more than one contributor. It is not evidence of progress toward a merge: as of this record neither pull request has been reviewed by a project maintainer with commit authority on the affected path, and the codebase both target, read directly on OGX's current default branch, still applies only the original non empty check to server_url.

The Authority Provenance ledger

Authority grantor. The operator who deploys OGX and decides whether to configure an auth: block gating POST /v1/responses. Nothing in the primary issue or the advisory names an organizational principal, distinct from that operator, who separately decided a caller reaching this endpoint should be able to direct the server's own outbound connections anywhere the caller names.

Caller identity. Under the tested starter configuration, unauthenticated: the primary issue's own reproduction reaches POST /v1/responses with no Authorization header. Under a deployment carrying an auth: block, an authenticated caller of whatever scope that configuration grants; this record does not establish that OGX's authentication layer, where configured, independently constrains which MCP server_url values an otherwise authenticated caller may name.

Caller mandate. Whatever mandate, if any, admits a caller to invoke the Responses API at all. Nothing in the primary issue or the affected source describes that mandate as extending to, or as ever having been evaluated against, the destination of the server's own outbound MCP session.

Intermediary. OGX's own server process, specifically the Responses API's _process_mcp_tool method and the MCP client session mcp.py constructs from the caller supplied server_url.

Intermediary credential. None of OGX's own is described as forwarded in the material this record could verify. What is forwarded is the caller's own credential, supplied through the dedicated authorization parameter, as an Authorization Bearer header sent to whatever destination the same caller named.

Intermediary network authority. Whatever loopback, link local, private network and, where reachable from the deployment, cloud metadata destinations the OGX server process could reach from wherever the operator deployed it, evidenced directly by the primary issue's own loopback reproduction.

Downstream target. Before the vulnerability, presumably any MCP server the deployment intended callers to reach. As demonstrated, any address the OGX process itself could reach, evidenced concretely for loopback and, by the mechanism validate_url_not_private is designed to block, extending to link local and private network destinations reachable from the same deployment.

Failed limit. No destination check on server_url in _process_mcp_tool, confirmed directly against the affected source, despite validate_url_not_private already existing and already gating two sibling caller controlled URL inputs in the same codebase.

Inherited assumption. That a caller admitted to name an MCP tool's server_url was thereby entitled to direct the server's own network connection to that address, the same substitution of reachability for authorization this desk has already read in Grafana's own advisory for CVE-2026-19516, evidenced here at the point of MCP session initialization rather than at a later tool call.

Credential binding. Partially present. prepare_mcp_headers blocks an Authorization value smuggled through the generic headers dict, but forwards a value supplied through the dedicated authorization parameter to the caller named destination without checking that destination first.

Destination binding. Absent on this path at the time of this record's review. validate_url_not_private exists and is correctly applied on two sibling caller controlled URL paths in the same codebase; it is not applied here.

Challenge authority. Under the tested starter configuration, none: POST /v1/responses accepts the request with no Authorization header. Under a configuration carrying an auth: block, whatever that configuration checks, which nothing in the material this record could verify describes as reaching the destination of the resulting MCP session.

Revocation or modification. Not applicable; no fix has shipped in a released version as of this record.

Recovery path. Two open, unmerged pull requests propose the specific corrective. Pull request 6390 calls validate_url_not_private on mcp_tool.server_url before list_mcp_tools opens a connection; it is community reviewed but not maintainer approved. Pull request 6291, an independently opened draft, proposes the same check plus a scheme restriction, and states explicitly that an administrator configured connector or toolgroup endpoint remains outside it, trusted on a separate resolution path. Neither has been reviewed by a maintainer with commit authority on the affected path.

Exploitation. Unknown. No source available to this record states the vulnerability has been exploited against a production OGX deployment. The primary issue's own reproduction is a controlled demonstration against a listener the reporter deployed, not evidence of exploitation in the wild.

Provenance evidence quality. Strong for the mechanism itself: this record read the affected source directly at the commit the primary issue names, confirming the absent destination check, the MCP session construction, the header and authorization handling, and the two sibling paths that already call validate_url_not_private. Strong for the CVE's own metadata, read directly from GitHub's Security Advisory record. Weaker for the underlying CVE Program record itself: cve.org was blocked to direct fetch in this session on every attempt, and this record relies on the GitHub Advisory Database's mirrored record rather than a direct read of the Program's own page.

Where this sits in the pattern

Grafana's own advisory for CVE-2026-19516 already documents a Grafana MCP server whose caller supplied X-Grafana-URL header directed the server's own outbound request at internal, loopback and link local destinations, unconstrained until a later fix added exactly the destination check this record finds missing here. This record reads OGX's own mechanism as the same weakness occurring earlier in an MCP client's own lifecycle, at session initialization inside tool discovery rather than at a dedicated proxying tool call, which is why this record treats MCP initialization itself, not only a later tools/call, as the point where a destination authority question was owed and was not asked. LiteLLM's own patched authentication bypass showed a different boundary at the same kind of intermediary, an identity check whose failure was converted into an accepted result rather than a destination left unchecked once a caller was admitted; this record keeps the two apart, since OGX's caller in the tested starter configuration was never required to present a credential in the first place, and the gap here sits entirely at the destination the request was allowed to reach. This desk's broader argument that a reachable resource functions as an authorized one wherever nothing independently checks reachability against authorization holds here in close to its cleanest form yet: the check existed in the same codebase, worked correctly on two other paths, and the MCP tool path was simply never connected to it. The wider thesis that execution authority has to be evaluated at the moment of the consequential action, not assumed from an earlier admission, extends here to a moment this record's own reading of the source shows arrives earlier than a tool call: OGX's own MCP session initialize, run during what the API frames as tool discovery, is already the consequential network action.

What this record does not establish

This record does not claim CVE-2026-85666 has been exploited against a real OGX deployment, that any cloud metadata service was actually reached in the primary issue's own reproduction, that every OGX deployment runs without an auth: block, that pull request 6390 or pull request 6291 has merged or shipped in a released version, or that either proposed fix addresses redirect revalidation or DNS rebinding between validation and connection. It does not claim a third remediation has been merged instead of these two, or that 6291's own separate treatment of administrator configured connector and toolgroup endpoints has been independently verified against that resolution path's own source; this record read that treatment from the pull request's own description rather than from the connector resolution code itself. Where the evidence available to this record does not establish a fact, this record states it as unknown rather than inferring it from the pattern this weakness class already shows elsewhere.

Sources

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

[2]
Unauthenticated Server Side Request Forgery via MCP tool server_url in POST /v1/responses
ogx-ai/ogx (GitHub Issues) · 13 July 2026 · Primary source
[3]
[4]
fix(security): block SSRF via caller-supplied MCP server_url in Responses
ogx-ai/ogx (GitHub Pull Requests) · Primary source
[5]
streaming.py, current default branch (re-confirmed unchanged)
ogx-ai/ogx (GitHub, source) · Primary source
[8]
url_validation.py at commit fbe8e0f (validate_url_not_private)
ogx-ai/ogx (GitHub, source) · Primary source
[12]
CVE-2026-85666
CVE Program (cve.org) · 4 September 2026 · Regulatory 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-008 Reachability treated as authority

  • Supports requirement

    ARC, Agentic Runtime Control

    Britive

    Requirement Britive states native support for the OpenID Shared Signals Framework, consuming CAEP and RISC events to trigger automated session termination, forced logout, step up authentication or account disable, and separately emitting its own CAEP and RISC events

    Okta Threat Intelligence's own 9 September 2026 research states the corrective for exactly the substitution this weakness names, a technically valid credential standing in for an authorization check that never independently runs: monitor for session-token reuse and re-evaluate a session's standing whenever a critical context change occurs, rather than trusting a credential's validity at authentication time for the remainder of its technical lifetime. Convergent reporting attributes to Okta's own product material a Session Protection capability that continuously monitors active sessions post authentication and re-evaluates policy on an IP or device change, or on inbound risk telemetry over the Shared Signals Framework, the identical corrective principle, and the identical named standard, this property already credits to Britive's own native CAEP/RISC support under a different vendor. This link supports the requirement rather than closing the gap this weakness names for AI-service credentials specifically: nothing in either vendor's own reachable material establishes that a stolen but still-valid AI session token or API key, of the kind Okta's own dataset documents by the thousand, is itself a principal a Shared Signals Framework transmitter is watching, as distinct from the device or IP session context CAEP and RISC events are reported to cover.

    View protocol evidence

  • Supports requirement

    AWS Agent Registry (Amazon Bedrock AgentCore)

    Amazon Web Services

    Requirement The registry's own discovery API carries exactly three operations, all reads, no invocation

    This weakness's own response pattern calls for authorizing a resource independently of whatever makes it reachable, never letting reachability itself substitute for the missing check. AWS Agent Registry's own discovery API, confirmed directly from AWS's published SDK source to carry exactly three operations, BatchGetDiscoverableRegistryRecord, ListDiscoverableRegistryRecords and SearchDiscoverableRegistryRecords, all reads, with no operation that invokes a discovered resource, is architectural evidence of exactly that separation: a caller who successfully searches the registry gains the ability to find a record, not any ability the registry itself grants to act on what the record describes. Recorded as design evidence that a governed discovery catalog can keep discoverability and invocation authority structurally apart, not as a claim that every resource a record points to independently enforces its own authorization at the moment of invocation, which this record leaves unknown.

    View protocol evidence

  • Supports requirement

    AWS Agent Registry (Amazon Bedrock AgentCore)

    Amazon Web Services

    Requirement AgentCore Runtime and Gateway resources AWS Agent Registry auto-detects land as unapproved Draft records, not as discoverable Approved ones

    This weakness names reachability substituting for authority precisely where nothing independently checks a resource before it becomes actionable. AWS Agent Registry's own auto-detection of AgentCore Runtime and Gateway resources across an organization is, on its face, the kind of automatic admission this weakness's known examples already warn about; what keeps it from instantiating the weakness here is that a resource the registry auto-detects lands as an unreviewed Draft record, not as an Approved, discoverable one, so existing is kept apart from approved even when the existence itself was discovered automatically rather than declared by a publisher. Recorded as design evidence for this weakness's own corrective, not as a claim that every deployment actually enables the review step before treating an auto-detected resource as caught up, which this record did not independently confirm.

    View protocol evidence

  • Supports requirement

    MCP 2026-07-28: Sessionless Protocol, Explicit State Handles and the Tasks Extension

    Model Context Protocol

    Requirement Possession of a state handle is not authorization, where authentication exists

    The Model Context Protocol's own security best practices page, part of the final 2026-07-28 specification revision, states directly that MCP servers must not treat possession of a state handle as authentication, and SEP-2567 states the corrective an authenticated server should apply, validating a handle together with the caller's current authentication context on every call rather than the handle alone. This is the connectivity protocol's own normative guidance for exactly the substitution this weakness names, reachability or possession of a reference standing in for an independent authorization check, stated at the level of a widely adopted protocol's own specification rather than one vendor's product. This link supports the requirement rather than closing the gap: the guidance is a should addressed to a server's own application layer, since MCP itself defines no protocol-level handle type to enforce anything about, and this weakness's own Grafana known example, CVE-2026-19516, already documents a real MCP server whose session check accepted a caller supplied identifier the server itself had never issued, so the specification's own text and any one server's own conformance to it remain separate facts this link does not conflate.

    View protocol evidence

  • Implementation evidence

    Agent Action Decision Protocol (AADP)

    Shamik Saha, individual submission to the IETF

    Requirement A Policy Decision Point owns authorization state and evidence; PEPs enforce it

    AADP requires a Policy Enforcement Point to hold a permit from a Policy Decision Point before performing a governed action. GitHub's branch protection, requiring multi party review before a Terraform change could merge, functioned as exactly that enforcement point for the one attempted infrastructure backdoor Unit 42's own account names, denying a mutation the attacker's already compromised, technically valid access could otherwise reach. This is bounded, real world enforcement evidence for the one action the control was configured in front of, not evidence that the same separation governed the rest of the intrusion, which Unit 42's own account describes continuing on other paths after that one attempt was blocked.

    View protocol evidence

  • Implementation evidence

    Agentic Networking for DynamicLink, a production MCP server for networking

    Zayo

    Zayo's Agentic Networking for DynamicLink, launched 8 September 2026, is a production deployment of a Model Context Protocol server, the same specification this weakness already connects through mcp-2026-07-28-sessionless-tasks above, now exposing production network and security infrastructure rather than a development or evaluation surface. It is implementation evidence for this weakness's own general form, reachability through an admitted MCP session substituting for an independent per-action authorization check, of the same kind this weakness already credits to Coder's Agent Firewall and Reco's Browser Guard: Zayo's own material states enterprises determine which information, tools and actions an agent can access, a scoping decision placed in front of the MCP tool surface, while no reachable artifact describes the mechanism that evaluates one specific requested tool call against that scope at the moment it is made. This link is scoped precisely to that evidentiary role. It does not evaluate a specific graded requirement of the MCP specification itself, and it does not treat Zayo's own governance language as proof that the gap this weakness names is closed for this vendor.

    View protocol evidence

  • Reveals bypass

    ARC, Agentic Runtime Control

    Britive

    Requirement Whether an agent holding an independent credential or a direct network path to a target system can reach that system without passing through ARC's policy evaluation is not addressed in material available to this record

    Britive's own documentation does not address whether an agent holding an independent credential or a direct network path can reach a target without passing through policy evaluation. That unmediated reachability is exactly the weakness these incidents turn on. NCSC's August 2026 interim advice on agentic AI corroborates the requirement this gap reveals, independently of the market's own protocol dataset: deny network access by default and mediate what remains through an approval gated, protocol or service aware proxy, rather than leave any path an agent's credentials or network position can reach unmediated. Grafana's own advisory for CVE-2026-19516 is a CVSS scored, vendor patched instance of exactly this gap: a Grafana MCP server's own network position reached internal, loopback and link local destinations, cloud metadata endpoints included, with no policy evaluation independently constraining the destination until the fix added one. Unit 42's account of a real enterprise intrusion, corrected 3 September 2026 to clarify the event was an intrusion rather than ransomware, is a further, larger instance: stolen cloud credentials reaching the victim organization's own AI infrastructure and CI/CD access reaching cloud keys, with no policy evaluation described as mediating either path. Cybernews's exposed server investigation, published 3 September 2026, adds an MCP intermediary to the same gap: a Penelope MCP interface exposed live reverse shell execution as a callable capability to an agent framework, Hermes Agent, across more than 30 real organisations, with nothing described as independently evaluating whether the calling agent held policy backed authority to use the shell the interface made reachable. Anthropic's own 30 July 2026 disclosure adds a further real instance rather than a sandbox breach: a fictional evaluation target's name matched a real, live domain, and the evaluation environment's own live internet access, present through a misconfiguration neither Anthropic nor its evaluation partner Irregular had noticed, let Claude Opus 4.7 reach and act on the real company across four runs with nothing independently evaluating whether the resolved target matched the one the evaluation actually authorized. GitHub Security Advisory GHSA-9mg6-c5wp-2g44, formally assigning CVE-2026-85666 on 4 September 2026, adds a further vendor patched instance from an MCP client rather than an MCP server: OGX's Responses API accepted a caller supplied MCP tool server_url and opened an MCP session against it, at session initialization during tool discovery, with no destination check independently constraining the reachable target, confirmed by direct reading of the affected source. This instance sharpens Britive's own gap beyond the general case: the same codebase already applies a working destination check, validate_url_not_private, to two sibling caller controlled URL inputs, so the unmediated path here is not an absent control but an existing one never connected to this specific resource class, evidence this dataset reads as reinforcing the requirement that resource policy needs to be applied by effect and resource class rather than by the feature specific code path that introduced the caller controlled URL. A proposed fix, pull request 6390, remains open and unmerged as of this link, so this entry does not treat the bypass as closed. A second, independently opened pull request, 6291, proposes the same check plus a scheme restriction and states explicitly that an administrator configured connector or toolgroup endpoint keeps a separate, unmediated resolution path by design, evidence this link reads as directly on point for what Britive's own documentation does not address: mediation applied to one provenance of endpoint, caller supplied, does not by itself establish anything about a differently provenanced endpoint, administrator configured, that the same policy engine would need to evaluate on its own terms rather than inherit by association. This pull request is also open and unmerged as of this link. Later technical coverage of the collusion.wiki report on the DSEWiki incident adds a further instance of the same reinforced requirement from a different direction: an OpenAI evaluation harness's read only internet restriction was enforced by permitting the GET HTTP method and blocking others, including POST, and DSEWiki's own ProWiki software accepted a page edit submitted as a GET request. Britive's own documentation does not address whether a request classified as read by its method can still produce a write at the destination, the same unaddressed gap this link already names for network position and destination, now shown for request method as the classifier instead. Both outlets naming the mechanism directly, and collusion.wiki itself, were blocked by this session's network egress policy; the mechanism is corroborated through cross referenced search rather than direct fetch. GitHub Security Advisory GHSA-rp45-5x3v-48mr adds a further instance narrower than any above: argocd-mcp's own HTTP and SSE transports bound to every network interface by default through version 0.8.0, confirmed directly against the affected source, with no policy evaluation, Host check or Origin check of any kind standing in front of a listener an operator's own environment configured Argo CD credential sat behind, so a network principal able to reach the bound listener needed nothing further to complete a credentialed, mutating Argo CD API call. CVE-2026-86122, published 5 September 2026 against Rowboat through version 0.9.1 and confirmed by direct reading of the affected source, adds a further instance that sharpens Britive's own gap past OGX's own case: Rowboat's project action authorization policy is confirmed running, correctly, before a custom MCP server URL or a project webhook URL is accepted, and nothing after that authorization call, and nothing in the agent runtime that later reads the stored URL back to open an MCP session or fetch a webhook, independently mediates which destination that authorized action may actually reach. Britive's own documentation does not address this either: an authorized project action, not only an independent credential or a direct network path, can carry unmediated reachability forward into whatever the resulting connection touches. A proposed fix, pull request 547, predates the report by five weeks, is not linked to it, and remains open and unmerged as of this link. GitHub Security Advisory GHSA-9m7h-vh2h-rc3w, published 6 September 2026 against OpenMAIC through version 1.0.0, adds an instance of a different shape than any above, and this link states the difference precisely rather than folding it into the general case: Britive's own documentation addresses whether a target is mediated by policy evaluation at all, not whether that mediation applies uniformly across every environment a deployment can run in. OpenMAIC's own validateUrlForSSRF is written correctly and already wired to five call sites the advisory names, confirmed by this link's own direct read at two of them, app/api/generate/image/route.ts and lib/server/resolve-model.ts, so the gap here is not an absent or unconnected check, as OGX's and Rowboat's own instances above show, but a check whose applicability depended on a condition, process.env.NODE_ENV === 'production', that the caller never touched and that a normal staging, preview or unset deployment fails by default, confirmed directly at both call sites this link checked against the affected tag. This composed with a separately confirmed fail open middleware, unchanged between the affected and fixed tags, that authenticated no request at all when the operator left ACCESS_CODE unset, so the unmediated path was reachable by an unauthenticated caller in the deployment states the environment condition already left unmediated. Fixed in OpenMAIC 1.0.1, released the same day, confirmed by this link's own direct read to remove the environment condition at both call sites checked and to add a repository scanning test, tests/server/url-guard-unconditional-invariant.test.ts, also read directly, that fails the project's own build if a validateUrlForSSRF call is again found gated on NODE_ENV. The same release replaces an implicit non production widening of what a caller supplied base URL could reach with an explicit ALLOW_LOCAL_NETWORKS grant an operator must set for local or private network access to be permitted at all, evidence this link reads as squarely on point for what Britive's own documentation does not address: mediation that applies only under an incidental deployment classification is not the same fact as mediation that applies to the resource and effect Britive's own policy evaluation is meant to reach, and an intentional exception to that mediation needs its own explicit grant rather than a classification's default.

    This record is the cited evidence for this relationship.

    View protocol evidence

  • Missing requirement

    AWS Agent Registry (Amazon Bedrock AgentCore)

    Amazon Web Services

    Requirement Whether, and how, a discovered resource's own invocation is independently authorized once found through the registry

    This weakness's own authority gap is precisely the fact this record could not establish: what independently authorizes a discovered resource's own invocation, once a consumer has been authorized to find it. AWS's own reachable material states what discovery approval decides and stops there; nothing this session could reach describes the registry itself requiring, checking or even being aware of a separate invocation-time authorization on the resource a record names. Recorded as a missing requirement in the material this session could reach, not as a claim that no such requirement exists in AWS's own architecture; AgentCore Runtime, AgentCore Gateway or a third-party resource may well enforce one independently, and this record states that possibility as unknown rather than either confirmed or absent.

    View protocol evidence

Related Intelligence

All Intelligence Records →