Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessSend request through shared gateway executor
-
DeliveryExecutor retains victim's connectionParams in closure
-
ExploitNew connection_init replays victim Authorization/tenant
-
ExecutionDownstream authenticates attacker as victim
-
ImpactReceive data authorized only to victim
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A07:2025 - Authentication Failures
ASVS 5.0
V7 - Session Management Session expiration enforcement
|
| Exploitation Conditions | Exploitation requires all of the following, drawn from the advisory: (1) one executor instance from buildWSLegacyExecutor is reused across requests belonging to different users/authorization contexts (the gateway, schema-stitching, or GraphQL Mesh sharing pattern); (2) the application uses the documented request.extensions.connectionParams field to carry per-request downstream identity such as an Authorization bearer token or tenant value; (3) the prior operation's socket has been closed before the attacker's request opens a new one - the normal path, since the COMPLETE handler calls cleanupWebsocket() after every operation; and (4) the attacker's later request omits at least one sensitive key (Object.assign merges rather than replaces, so a partial request can inherit the victim's retained Authorization while supplying its own tenant). Limiting factors: applications that construct a fresh executor per request - including the in-repository UrlLoader wrapper - are not affected; no supported teardown (including executor[Symbol.dispose]()) clears the retained state; and the attacker does not learn the credential itself, only inherits the downstream authorization it grants. |
| Impact | Severity signals are moderately high but strongly gated by an architectural precondition. The only provided CVSS is a vendor CVSS 4.0 base vector (8.2) with AV:N/AC:H/AT:P/PR:N/UI:N and confidentiality-only impact (VC:H/VI:N/VA:N) - network-reachable and requiring no attacker privileges, but with high attack complexity and an explicit attack requirement (AT:P) reflecting that exploitation depends on a specific, attacker-uncontrolled sequence of events in a shared-executor deployment. No CVSS 3.1 vector, no EPSS score, and no KEV listing are present in the input, so widespread-exploitation probability cannot be quantified from the data. The vuln.today decision label is 'this_week' (not act_now/emergency), a patch is available, and the GitHub Security Advisory documents a validated reproduction. Net assessment: this is a genuine broken-authentication/stale-credential issue (CWE-613) worth prioritized remediation within the vendor-indicated window, but it is not a drive-by remote code execution - real-world risk is concentrated in applications that reuse one buildWSLegacyExecutor instance across different authorization contexts (gateway, schema-stitching, or mesh patterns using extensions.connectionParams). Applications that build a fresh executor per request are explicitly not affected, so the high base score overstates risk for the common per-request-executor usage. |
| Exploit ScenarioDerived | In a shared GraphQL gateway that reuses one legacy WebSocket executor across users and forwards per-request credentials via extensions.connectionParams, an authenticated victim first runs a subscription that sets an Authorization/tenant value into the executor's closure state. After that socket closes, an attacker sends an anonymous request (or one omitting the auth key) through the same gateway; the executor replays the victim's retained connectionParams in the new connection_init, so the downstream server authenticates the attacker as the victim and returns data the attacker should not see. The vendor's published advisory includes a validated reproduction confirming the leak on releases up to 1.1.35. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 28, 2026
Stale authentication state in GraphQL Tools' legacy WebSocket executor lets a later caller inherit a previous caller's downstream identity: the closure-scoped executorConnectionParams object retains per-request extensions.connectionParams after cleanupWebsocket tears down the socket, and the retained keys are replayed in a subsequent connection_init payload. Only applications that reuse a single buildWSLegacyExecutor instance across different authorization contexts are exposed - most notably gateway, schema-stitching, or GraphQL Mesh deployments that pass per-user Authorization or tenant values through extensions.connectionParams; an anonymous or lower-privileged request that omits the sensitive key can then have its downstream subscription executed under the earlier user's token, though the credential itself is never disclosed. Applications that build a fresh executor per request, including the in-repository UrlLoader wrapper, are not affected; exploitation is remote and unauthenticated from the library's perspective but gated by the shared-executor architecture, and no public exploit code was identified at time of analysis.
RemediationAI
Upgrade to @graphql-tools/executor-legacy-ws 1.1.36 or later (the corresponding graphql-tools release line per EUVD is 9.0.36); the vendor advisory is at https://github.com/ardatan/graphql-tools/security/advisories/GHSA-434m-5hcj-pxf3, the fix landed in pull request https://github.com/ardatan/graphql-tools/pull/8480 (commit c2f226e6f68236be9e4a577f29faeaa92547458b), and the release tag is https://github.com/ardatan/graphql-tools/releases/tag/@graphql-tools/executor-legacy-ws@1.1.36. After upgrading, verify that per-execution isolation is in effect: each execution should open its own socket and send only the base connectionParams plus that request's extensions.connectionParams. Where upgrading is not immediately possible, the only structural mitigation supported by the evidence is to stop sharing one executor across authorization contexts - construct a fresh buildWSLegacyExecutor instance per request or per identity, mirroring the UrlLoader pattern; the trade-off is an additional WebSocket handshake and connection_init round trip per operation, so subscription-heavy paths may see higher connection churn and latency. Note that the library's documented teardown, executor[Symbol.dispose]() bound to cleanupWebsocket, does not clear the retained parameters, so disposing executors between identities is not a substitute for either upgrading or per-request executor construction; applications that cannot do either must avoid carrying per-user Authorization or tenant values through extensions.connectionParams on shared executors.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 3 packages in npm, euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
GraphQL Tools is a utility library for building, stitching, and mocking GraphQL schemas, and the @graphql-tools/executor-legacy-ws package implements an executor for the legacy graphql-ws subscription protocol over WebSockets. In the vulnerable implementation of buildWSLegacyExecutor (packages/executors/legacy-ws/src/index.ts), the factory closes over a mutable object, executorConnectionParams, whose lifetime equals the executor's: each execution that carries request.extensions.connectionParams merges those keys into that object with Object.assign, and the accumulated object is merged into the connection_init payload whenever a new WebSocket opens. cleanupWebsocket sends CONNECTION_TERMINATE, terminates the socket, and nulls the handle, but never resets executorConnectionParams, and the update is guarded by a presence check with no else branch - so a later request that simply omits a key leaves the earlier caller's value in place. Object.assign also merges partially, so a caller supplying only a tenant value can retain a victim's Authorization bearer token alongside it. The root cause class is CWE-613, insufficient session expiration: authentication state outlives the session it belongs to and is re-presented to the downstream GraphQL server as if it belonged to the new caller. The fix in 1.1.36 removes the shared socket and shared parameter object entirely: each execution opens its own socket, derives connection_init from the executor's base connectionParams plus that request's extensions.connectionParams only, matches data/error/complete frames by protocol operation id (also correcting id generation away from Date.now()), and closes sockets through a per-execution disposer. The same change set addresses a companion issue, GHSA-mp66-8ww2-pcwm (CWE-200), where overlapping subscriptions could receive another operation's data frames because the single onmessage handler ignored the operation id.
Know when Graphql Tools gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N
Network-reachable and attacker needs no privileges (anonymous request), but success depends on an uncontrolled shared-executor sequence so AC:H; impact is unauthorized data access under a victim's downstream authorization, hence C:H with I:N/A:N.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.org
GraphQL Tools provides utilities for building, stitching, and mocking GraphQL schemas. Prior to version 1.1.36 of the GraphQL Tools legacy WebSocket executor package, buildWSLegacyExecutor in packages/executors/legacy-ws/src/index.ts retains request.extensions.connectionParams in the closure-scoped executorConnectionParams object after cleanupWebsocket closes a connection. When one executor is reused across different authorization contexts, a later request that omits a sensitive key can send an earlier caller's Authorization or tenant value in its connection_init payload, causing the downstream server to authenticate the later caller as the earlier user. Applications that create a new executor for every request are not affected. This issue is fixed in version 1.1.36 of the GraphQL Tools legacy WebSocket executor package.
Technical POC Analysis
CWE-613 (Insufficient Session Expiration), manifesting as stale authentication state in a long-lived executor object.
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
CVE-2026-118665 is a high-severity authentication flaw in GraphQL Tools' legacy WebSocket executor that can allow one user's GraphQL subscription to run under another user's identity when a single executor instance is reused across different authorization contexts. This primarily impacts gateway, schema-stitching, or GraphQL Mesh deployments that pass per-user credentials via WebSocket connection parameters, potentially leading to unauthorized access to data or actions. Leadership should prioritize remediation because the vulnerability enables cross-tenant or cross-user privilege escalation and could result in data exposure or compliance violations.
Apply vendor patch.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
More in Graphql Tools
View allThis affects the package @graphql-tools/git-loader before 6.2.6. Rated high severity (CVSS 8.8), this vulnerability is r
TLS certificate validation is disabled by default in @graphql-tools/executor-legacy-ws prior to 1.1.35, where buildWSLeg
GraphQL Tools' legacy WebSocket executor (@graphql-tools/executor-legacy-ws, versions through 1.1.35) discloses subscrip
EUVD-2026-112472
GHSA-434m-5hcj-pxf3
NVD
CVE.org
Exploit-DB