{"id":"CVE-2026-103921","aliases":["CLSA-2026-1793113102","EUVD-2026-90922","GHSA-6fw5-9hq8-w87g"],"status":"published","title":"GraphQL Tools: TLS Certificate Validation Disabled in Legacy GraphQL WebSocket Executor","description":"GraphQL Tools provides utilities for building, stitching, and mocking GraphQL schemas. Prior to 1.1.35, the executor-legacy-ws buildWSLegacyExecutor() function hardcodes TLS certificate rejection off for Node.js connections to wss:// endpoints. Applications using the executor directly, or url-loader with SubscriptionProtocol.LEGACY_WS, can therefore accept an attacker-controlled certificate when a network-positioned attacker intercepts the connection. Authentication material in connectionParams or headers can be disclosed, and subscription data can be modified. Browser WebSocket clients are unaffected because browsers enforce certificate validation. This issue is fixed in version 1.1.35.","severity":{"version":"3.1","score":7.4,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N","level":"high","assessor":"cna","from":"cve"},"epss":{"day":"2026-11-12","score":0.00274,"percentile":0.19971,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-295"],"published":"2026-10-01T16:32:37Z","modified":"2026-10-28T02:30:55Z","fixes":[{"ecosystem":"npm","package":"@graphql-tools/executor-legacy-ws","fixed_in":["1.1.35"],"sources":["ghsa","osv"]},{"ecosystem":"TuxCare:npm","package":"@graphql-tools/executor-legacy-ws","fixed_in":["0.0.11-tuxcare.1"],"sources":["osv"]}],"affected":[{"source":"ghsa","ecosystem":"npm","package":"@graphql-tools/executor-legacy-ws","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"last_affected":"1.1.34"},{"fixed":"1.1.35"}]}]},{"source":"osv","ecosystem":"TuxCare:npm","package":"@graphql-tools/executor-legacy-ws","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0.0.11-tuxcare.0"},{"fixed":"0.0.11-tuxcare.1"}]}],"versions":["0.0.11"]},{"source":"osv","ecosystem":"npm","package":"@graphql-tools/executor-legacy-ws","ranges":[{"type":"SEMVER","events":[{"introduced":"0"},{"fixed":"1.1.35"}]}]}],"products":[{"vendor":"@graphql-tools","product":"executor-legacy-ws"},{"vendor":"ardatan","product":"graphql-tools"}],"references":[{"url":"https://github.com/ardatan/graphql-tools/security/advisories/GHSA-6fw5-9hq8-w87g","tags":["x_refsource_CONFIRM","advisory","web"]},{"url":"https://github.com/ardatan/graphql-tools/pull/8426","tags":["x_refsource_MISC","fix","web"]},{"url":"https://github.com/ardatan/graphql-tools/commit/3831a0661514c91d99971052f983552556880402","tags":["x_refsource_MISC","fix","web"]},{"url":"https://github.com/ardatan/graphql-tools/releases/tag/@graphql-tools/executor-legacy-ws@1.1.35","tags":["x_refsource_MISC","web"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-103921","tags":["advisory"]},{"url":"https://github.com/advisories/GHSA-6fw5-9hq8-w87g"},{"url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/103xxx/CVE-2026-103921.json","tags":["advisory"]},{"url":"https://github.com/ardatan/graphql-tools","tags":["package"]}],"sources":{"cve":[{"id":"CVE-2026-103921","title":"GraphQL Tools: TLS Certificate Validation Disabled in Legacy GraphQL WebSocket Executor","description":"GraphQL Tools provides utilities for building, stitching, and mocking GraphQL schemas. Prior to 1.1.35, the executor-legacy-ws buildWSLegacyExecutor() function hardcodes TLS certificate rejection off for Node.js connections to wss:// endpoints. Applications using the executor directly, or url-loader with SubscriptionProtocol.LEGACY_WS, can therefore accept an attacker-controlled certificate when a network-positioned attacker intercepts the connection. Authentication material in connectionParams or headers can be disclosed, and subscription data can be modified. Browser WebSocket clients are unaffected because browsers enforce certificate validation. This issue is fixed in version 1.1.35.","status":"published","published":"2026-10-01T16:32:37.865Z","modified":"2026-10-01T18:04:28.083Z","cvss":[{"version":"3.1","score":7.4,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N","level":"high","assessor":"cna"}],"cwes":["CWE-295"],"updated_at":"2026-11-02T13:34:48.658051Z"}],"euvd":[{"id":"EUVD-2026-90922","description":"GraphQL Tools provides utilities for building, stitching, and mocking GraphQL schemas. Prior to 1.1.35, the executor-legacy-ws buildWSLegacyExecutor() function hardcodes TLS certificate rejection off for Node.js connections to wss:// endpoints. Applications using the executor directly, or url-loader with SubscriptionProtocol.LEGACY_WS, can therefore accept an attacker-controlled certificate when a network-positioned attacker intercepts the connection. Authentication material in connectionParams or headers can be disclosed, and subscription data can be modified. Browser WebSocket clients are unaffected because browsers enforce certificate validation. This issue is fixed in version 1.1.35.","status":"published","published":"2026-10-01T16:32:37Z","modified":"2026-10-01T18:04:28Z","cvss":[{"version":"3.1","score":7.4,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N","level":"high"}],"updated_at":"2026-11-02T17:27:44.322377Z"}],"ghsa":[{"id":"GHSA-6fw5-9hq8-w87g","title":"GraphQL Tools: TLS Certificate Validation Disabled in Legacy GraphQL WebSocket Executor","description":"## Impact\n\n`buildWSLegacyExecutor()` in `@graphql-tools/executor-legacy-ws` previously hardcoded `rejectUnauthorized: false` when creating WebSocket connections over WSS. This disabled TLS certificate validation, allowing a network-positioned attacker to perform a Man-in-the-Middle (MITM) attack against applications that use this executor with a `wss://` endpoint. Credentials passed via `connectionParams` or `headers` could be intercepted, and subscription data could be tampered with.\n\n**Who is impacted:** Applications using `@graphql-tools/executor-legacy-ws` (directly or via `@graphql-tools/url-loader` with `SubscriptionProtocol.LEGACY_WS`) to connect to a `wss://` endpoint from Node.js while sending authentication material over the connection.\n\nBrowser WebSocket clients are unaffected by this option (browsers always validate certificates).\n\n## Patches\n\nUpgrade to `@graphql-tools/executor-legacy-ws@1.1.35` or later (and `@graphql-tools/url-loader@9.1.9` or later if you use the loader). TLS certificate validation is enabled by default. Callers that intentionally use self-signed certificates in trusted environments can opt out with `rejectUnauthorized: false`.\n\n## Workarounds\n\n- Prefer the modern `graphql-ws` / `SubscriptionProtocol.WS` path where possible.\n- Until upgraded, avoid sending secrets over legacy WSS connections, or terminate TLS at a trusted proxy and use `ws://` only on trusted networks.\n- Supply a custom `webSocketImpl` that enforces certificate validation.","status":"published","published":"2026-10-05T22:56:56Z","modified":"2026-10-05T22:56:58Z","cvss":[{"version":"3.1","score":7.4,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N","level":"high"}],"cwes":["CWE-295"],"updated_at":"2026-11-02T14:41:27.036917Z"}],"nvd":[{"id":"CVE-2026-103921","description":"GraphQL Tools provides utilities for building, stitching, and mocking GraphQL schemas. Prior to 1.1.35, the executor-legacy-ws buildWSLegacyExecutor() function hardcodes TLS certificate rejection off for Node.js connections to wss:// endpoints. Applications using the executor directly, or url-loader with SubscriptionProtocol.LEGACY_WS, can therefore accept an attacker-controlled certificate when a network-positioned attacker intercepts the connection. Authentication material in connectionParams or headers can be disclosed, and subscription data can be modified. Browser WebSocket clients are unaffected because browsers enforce certificate validation. This issue is fixed in version 1.1.35.","status":"published","published":"2026-10-01T17:17:19.39Z","modified":"2026-10-02T18:44:45.66Z","cvss":[{"version":"3.1","score":7.4,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N","level":"high","assessor":"secondary"}],"cwes":["CWE-295"],"updated_at":"2026-11-02T14:12:53.41762Z"}],"osv":[{"id":"CVE-2026-103921","title":"GraphQL Tools: TLS Certificate Validation Disabled in Legacy GraphQL WebSocket Executor","description":"GraphQL Tools provides utilities for building, stitching, and mocking GraphQL schemas. Prior to 1.1.35, the executor-legacy-ws buildWSLegacyExecutor() function hardcodes TLS certificate rejection off for Node.js connections to wss:// endpoints. Applications using the executor directly, or url-loader with SubscriptionProtocol.LEGACY_WS, can therefore accept an attacker-controlled certificate when a network-positioned attacker intercepts the connection. Authentication material in connectionParams or headers can be disclosed, and subscription data can be modified. Browser WebSocket clients are unaffected because browsers enforce certificate validation. This issue is fixed in version 1.1.35.","status":"published","published":"2026-10-01T16:32:37.865Z","modified":"2026-10-28T02:30:55.265334275Z","cvss":[{"version":"3.1","score":7.4,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N","level":"high"}],"cwes":["CWE-295"],"updated_at":"2026-11-02T15:44:54.236592Z"},{"id":"GHSA-6fw5-9hq8-w87g","title":"GraphQL Tools: TLS Certificate Validation Disabled in Legacy GraphQL WebSocket Executor","description":"## Impact\n\n`buildWSLegacyExecutor()` in `@graphql-tools/executor-legacy-ws` previously hardcoded `rejectUnauthorized: false` when creating WebSocket connections over WSS. This disabled TLS certificate validation, allowing a network-positioned attacker to perform a Man-in-the-Middle (MITM) attack against applications that use this executor with a `wss://` endpoint. Credentials passed via `connectionParams` or `headers` could be intercepted, and subscription data could be tampered with.\n\n**Who is impacted:** Applications using `@graphql-tools/executor-legacy-ws` (directly or via `@graphql-tools/url-loader` with `SubscriptionProtocol.LEGACY_WS`) to connect to a `wss://` endpoint from Node.js while sending authentication material over the connection.\n\nBrowser WebSocket clients are unaffected by this option (browsers always validate certificates).\n\n## Patches\n\nUpgrade to `@graphql-tools/executor-legacy-ws@1.1.35` or later (and `@graphql-tools/url-loader@9.1.9` or later if you use the loader). TLS certificate validation is enabled by default. Callers that intentionally use self-signed certificates in trusted environments can opt out with `rejectUnauthorized: false`.\n\n## Workarounds\n\n- Prefer the modern `graphql-ws` / `SubscriptionProtocol.WS` path where possible.\n- Until upgraded, avoid sending secrets over legacy WSS connections, or terminate TLS at a trusted proxy and use `ws://` only on trusted networks.\n- Supply a custom `webSocketImpl` that enforces certificate validation.","status":"published","published":"2026-10-05T22:56:56Z","modified":"2026-10-05T23:15:03.99630516Z","cvss":[{"version":"3.1","score":7.4,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N","level":"high"}],"cwes":["CWE-295"],"updated_at":"2026-11-02T15:46:39.618611Z"},{"id":"CLSA-2026-1793113102","title":"TuxCare security update for @graphql-tools/executor-legacy-ws (1 CVE)","description":"TuxCare rebuilt @graphql-tools/executor-legacy-ws to address 1 CVE. Fixed in 0.0.11-tuxcare.1.","status":"published","published":"2026-10-27T14:58:22Z","modified":"2026-10-27T19:30:02.3845966Z","updated_at":"2026-11-02T15:43:55.34846Z"}]}}
