FrontMCP and mcp-from-openapi have bypass of OpenAPI external $ref SSRF fix (CVE-2026-59973)
## Summary The published fix for GHSA-v6ph-xcq9-qxxj / CVE-2026-39885 added a direct hostname denylist for OpenAPI external `$ref` dereferencing, but the latest patched dependency `mcp-from-openapi` 2.3.0 still makes backend-origin requests to loopback when the target is reached through hostname resolution, redirects, or IPv4-mapped IPv6 syntax. FrontMCP latest release v1.2.1 and current main still call `OpenAPIToolGenerator.fromURL()` and `OpenAPIToolGenerator.fromJSON()` from `mcp-from-openapi` 2.3.0 when loading OpenAPI adapters. An attacker who can cause a hosted or multi-user FrontMCP deployment to load an untrusted OpenAPI spec can trigger requests from the server to localhost or private services during tool generation. This is a latest-version bypass of the previous fix. A direct `http://127.0.0.1` `$ref` control is now denied and produces zero canary hits, while semantically equivalent loopback targets still reach the canary. ## Latest versions checked - `frontmcp` npm latest: 1.2.1 - `@frontmcp/adapters` npm latest: 1.2.1 - `mcp-from-openapi` npm latest: 2.3.0 - FrontMCP release tag: v1.2.1, commit db323976c66297d684a3e63bbfe1db6b310f2944 - FrontMCP current main checked: c15b79abe8c6a3cb71d4b7a3bafb8190730dc756 The release tag and current main both keep `mcp-from-openapi` 2.3.0 in `package.json` and `libs/adapters/package.json`, and both keep the OpenAPI adapter forwarding untrusted `url`, `spec`, and `loadOptions.refResolution` into `OpenAPIToolGenerator`. ## Technical details FrontMCP's OpenAPI adapter reaches the affected dependency paths: - `libs/adapters/src/openapi/openapi.adapter.ts` imports `OpenAPIToolGenerator` from `mcp-from-openapi`. - `loadOpenAPISpec()` calls `OpenAPIToolGenerator.fromURL(this.options.url, ...)` and forwards `loadOptions.refResolution`. - The same method calls `OpenAPIToolGenerator.fromJSON(this.options.spec, ...)` and forwards `loadOptions.refResolution`. In `mcp-from-openapi` 2.3.0, the patched guard is applied before the HTTP resolver fetches an external `$ref`. It checks the parsed URL hostname string against deny patterns for direct local and private addresses. The resolver does not resolve hostnames before allow or deny decisions, does not pin the validated IP to the fetch, and does not revalidate redirect targets before following them. It also misses IPv4-mapped IPv6 loopback forms. As a result, these URLs are accepted by the guard but cause a loopback request from the backend: - `http://127.0.0.1.nip.io:<port>/schema.json`, because the hostname string is not a direct IP even though it resolves to 127.0.0.1. - `http://127.0.0.1.nip.io:<port>/redirect`, because the first host passes and the actual request follows a redirect to `http://127.0.0.1:<port>/schema.json`. - `http://[::ffff:127.0.0.1]:<port>/schema.json` and `http://[::ffff:7f00:1]:<port>/schema.json`, because IPv4-mapped IPv6 loopback is not normalized and denied. `OpenAPIToolGenerator.fromURL()` is also still unguarded for the initial OpenAPI spec URL. The PoC includes that as supporting evidence, but the primary report is the external `$ref` fix bypass. ## Reproduction The attached local PoC starts a loopback canary and loads generated OpenAPI specs using `mcp-from-openapi` 2.3.0. The request body schema contains a single external `$ref` for each test case. The canary records every backend-origin request. Run: ```bash cd /home/unkn0wn/security_audit/frontmcp-ssrf-poc node repro-frontmcp-latest-ssrf-bypasses.mjs ``` Important output from a fresh run on 2026-05-25: ```json {"name":"direct-127-denied-control","kind":"external_ref","refUrl":"http://127.0.0.1:45117/schema.json","ok":false,"hitCount":0,"hits":[]} {"name":"dns-name-to-127-bypass","kind":"external_ref","refUrl":"http://127.0.0.1.nip.io:45117/schema.json","ok":true,"hitCount":1,"hits":[{"url":"/schema.json","host":"127.0.0.1.nip.io:45117","authorization":null}]} {"name":"dns-name-to-127-bypass-with-allowedHosts","kind":"external_ref","refUrl":"http://127.0.0.1.nip.io:45117/schema.json","ok":true,"hitCount":1,"hits":[{"url":"/schema.json","host":"127.0.0.1.nip.io:45117","authorization":null}]} {"name":"redirect-to-127-after-allowed-host","kind":"external_ref","refUrl":"http://127.0.0.1.nip.io:45117/redirect","ok":true,"hitCount":2,"hits":[{"url":"/redirect","host":"127.0.0.1.nip.io:45117","authorization":null},{"url":"/schema.json","host":"127.0.0.1:45117","authorization":null}]} {"name":"ipv4-mapped-ipv6-dotted-bypass","kind":"external_ref","refUrl":"http://[::ffff:127.0.0.1]:45117/schema.json","ok":true,"hitCount":1,"hits":[{"url":"/schema.json","host":"[::ffff:7f00:1]:45117","authorization":null}]} {"name":"ipv4-mapped-ipv6-hex-bypass","kind":"external_ref","refUrl":"http://[::ffff:7f00:1]:45117/schema.json","ok":true,"hitCount":1,"hits":[{"url":"/schema.json","host":"[::ffff:7f00:1]:45117","authorization":null}]} {"name":"external-refs-disabled-control","kind":"external_ref","refUrl":"http://127.0.0.1.nip.io:45117/schema
AI Analysis
Technical Summary
The vulnerability in mcp-from-openapi 2.3.0 and FrontMCP 1.2.1 bypasses the hostname denylist intended to prevent SSRF via OpenAPI external $ref dereferencing. The denylist checks only the hostname string without resolving it to IP addresses before allowing or denying requests, and it does not revalidate redirect targets or normalize IPv4-mapped IPv6 loopback addresses. This allows attackers to craft URLs that appear safe but resolve to loopback addresses, triggering backend requests to localhost or private services during OpenAPI tool generation. The flaw affects the methods OpenAPIToolGenerator.fromURL() and fromJSON() used by FrontMCP's OpenAPI adapter. The vulnerability is confirmed by proof-of-concept tests showing successful backend requests to loopback addresses via crafted URLs. The issue is tracked as CVE-2026-59973 with a CVSS 3.1 score of 8.5 (AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:L/A:N). A patch is available for affected versions.
Potential Impact
An attacker able to supply or cause loading of an untrusted OpenAPI specification in affected FrontMCP deployments can trigger server-side requests to internal or localhost services. This SSRF bypass can lead to unauthorized access to internal network resources or services that are not otherwise exposed externally. The impact includes high confidentiality loss and partial integrity loss but no availability impact. The vulnerability affects multi-user or hosted FrontMCP deployments that load untrusted OpenAPI specs.
Mitigation Recommendations
A patch is available for the affected versions of mcp-from-openapi and FrontMCP. Users should upgrade to versions >=2.5.0 for mcp-from-openapi and >=1.5.0 for FrontMCP where this issue is fixed. Until patched, avoid loading untrusted OpenAPI specifications or disable external $ref dereferencing if possible. The vendor advisory confirms a patch is available; therefore, remediation should focus on applying the official fix.
FrontMCP and mcp-from-openapi have bypass of OpenAPI external $ref SSRF fix (CVE-2026-59973)
Description
## Summary The published fix for GHSA-v6ph-xcq9-qxxj / CVE-2026-39885 added a direct hostname denylist for OpenAPI external `$ref` dereferencing, but the latest patched dependency `mcp-from-openapi` 2.3.0 still makes backend-origin requests to loopback when the target is reached through hostname resolution, redirects, or IPv4-mapped IPv6 syntax. FrontMCP latest release v1.2.1 and current main still call `OpenAPIToolGenerator.fromURL()` and `OpenAPIToolGenerator.fromJSON()` from `mcp-from-openapi` 2.3.0 when loading OpenAPI adapters. An attacker who can cause a hosted or multi-user FrontMCP deployment to load an untrusted OpenAPI spec can trigger requests from the server to localhost or private services during tool generation. This is a latest-version bypass of the previous fix. A direct `http://127.0.0.1` `$ref` control is now denied and produces zero canary hits, while semantically equivalent loopback targets still reach the canary. ## Latest versions checked - `frontmcp` npm latest: 1.2.1 - `@frontmcp/adapters` npm latest: 1.2.1 - `mcp-from-openapi` npm latest: 2.3.0 - FrontMCP release tag: v1.2.1, commit db323976c66297d684a3e63bbfe1db6b310f2944 - FrontMCP current main checked: c15b79abe8c6a3cb71d4b7a3bafb8190730dc756 The release tag and current main both keep `mcp-from-openapi` 2.3.0 in `package.json` and `libs/adapters/package.json`, and both keep the OpenAPI adapter forwarding untrusted `url`, `spec`, and `loadOptions.refResolution` into `OpenAPIToolGenerator`. ## Technical details FrontMCP's OpenAPI adapter reaches the affected dependency paths: - `libs/adapters/src/openapi/openapi.adapter.ts` imports `OpenAPIToolGenerator` from `mcp-from-openapi`. - `loadOpenAPISpec()` calls `OpenAPIToolGenerator.fromURL(this.options.url, ...)` and forwards `loadOptions.refResolution`. - The same method calls `OpenAPIToolGenerator.fromJSON(this.options.spec, ...)` and forwards `loadOptions.refResolution`. In `mcp-from-openapi` 2.3.0, the patched guard is applied before the HTTP resolver fetches an external `$ref`. It checks the parsed URL hostname string against deny patterns for direct local and private addresses. The resolver does not resolve hostnames before allow or deny decisions, does not pin the validated IP to the fetch, and does not revalidate redirect targets before following them. It also misses IPv4-mapped IPv6 loopback forms. As a result, these URLs are accepted by the guard but cause a loopback request from the backend: - `http://127.0.0.1.nip.io:<port>/schema.json`, because the hostname string is not a direct IP even though it resolves to 127.0.0.1. - `http://127.0.0.1.nip.io:<port>/redirect`, because the first host passes and the actual request follows a redirect to `http://127.0.0.1:<port>/schema.json`. - `http://[::ffff:127.0.0.1]:<port>/schema.json` and `http://[::ffff:7f00:1]:<port>/schema.json`, because IPv4-mapped IPv6 loopback is not normalized and denied. `OpenAPIToolGenerator.fromURL()` is also still unguarded for the initial OpenAPI spec URL. The PoC includes that as supporting evidence, but the primary report is the external `$ref` fix bypass. ## Reproduction The attached local PoC starts a loopback canary and loads generated OpenAPI specs using `mcp-from-openapi` 2.3.0. The request body schema contains a single external `$ref` for each test case. The canary records every backend-origin request. Run: ```bash cd /home/unkn0wn/security_audit/frontmcp-ssrf-poc node repro-frontmcp-latest-ssrf-bypasses.mjs ``` Important output from a fresh run on 2026-05-25: ```json {"name":"direct-127-denied-control","kind":"external_ref","refUrl":"http://127.0.0.1:45117/schema.json","ok":false,"hitCount":0,"hits":[]} {"name":"dns-name-to-127-bypass","kind":"external_ref","refUrl":"http://127.0.0.1.nip.io:45117/schema.json","ok":true,"hitCount":1,"hits":[{"url":"/schema.json","host":"127.0.0.1.nip.io:45117","authorization":null}]} {"name":"dns-name-to-127-bypass-with-allowedHosts","kind":"external_ref","refUrl":"http://127.0.0.1.nip.io:45117/schema.json","ok":true,"hitCount":1,"hits":[{"url":"/schema.json","host":"127.0.0.1.nip.io:45117","authorization":null}]} {"name":"redirect-to-127-after-allowed-host","kind":"external_ref","refUrl":"http://127.0.0.1.nip.io:45117/redirect","ok":true,"hitCount":2,"hits":[{"url":"/redirect","host":"127.0.0.1.nip.io:45117","authorization":null},{"url":"/schema.json","host":"127.0.0.1:45117","authorization":null}]} {"name":"ipv4-mapped-ipv6-dotted-bypass","kind":"external_ref","refUrl":"http://[::ffff:127.0.0.1]:45117/schema.json","ok":true,"hitCount":1,"hits":[{"url":"/schema.json","host":"[::ffff:7f00:1]:45117","authorization":null}]} {"name":"ipv4-mapped-ipv6-hex-bypass","kind":"external_ref","refUrl":"http://[::ffff:7f00:1]:45117/schema.json","ok":true,"hitCount":1,"hits":[{"url":"/schema.json","host":"[::ffff:7f00:1]:45117","authorization":null}]} {"name":"external-refs-disabled-control","kind":"external_ref","refUrl":"http://127.0.0.1.nip.io:45117/schema
CVSS v3.1
Score 8.5high
Affected software
Run on your own infrastructure? Check whether these packages are installed with threat-finder — our free open-source scanner.
Weaknesses
AI-Powered Analysis
Machine-generated threat intelligence
Technical Analysis
The vulnerability in mcp-from-openapi 2.3.0 and FrontMCP 1.2.1 bypasses the hostname denylist intended to prevent SSRF via OpenAPI external $ref dereferencing. The denylist checks only the hostname string without resolving it to IP addresses before allowing or denying requests, and it does not revalidate redirect targets or normalize IPv4-mapped IPv6 loopback addresses. This allows attackers to craft URLs that appear safe but resolve to loopback addresses, triggering backend requests to localhost or private services during OpenAPI tool generation. The flaw affects the methods OpenAPIToolGenerator.fromURL() and fromJSON() used by FrontMCP's OpenAPI adapter. The vulnerability is confirmed by proof-of-concept tests showing successful backend requests to loopback addresses via crafted URLs. The issue is tracked as CVE-2026-59973 with a CVSS 3.1 score of 8.5 (AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:L/A:N). A patch is available for affected versions.
Potential Impact
An attacker able to supply or cause loading of an untrusted OpenAPI specification in affected FrontMCP deployments can trigger server-side requests to internal or localhost services. This SSRF bypass can lead to unauthorized access to internal network resources or services that are not otherwise exposed externally. The impact includes high confidentiality loss and partial integrity loss but no availability impact. The vulnerability affects multi-user or hosted FrontMCP deployments that load untrusted OpenAPI specs.
Mitigation Recommendations
A patch is available for the affected versions of mcp-from-openapi and FrontMCP. Users should upgrade to versions >=2.5.0 for mcp-from-openapi and >=1.5.0 for FrontMCP where this issue is fixed. Until patched, avoid loading untrusted OpenAPI specifications or disable external $ref dereferencing if possible. The vendor advisory confirms a patch is available; therefore, remediation should focus on applying the official fix.
Technical Details
- Gcve Source
- db.gcve.eu
- Osv Id
- GHSA-65h7-9wrw-629c
- Osv Schema Version
- 1.4.0
- Aliases
- ["CVE-2026-59973"]
- Ecosystems
- ["npm"]
- Database Specific Severity
- HIGH
- Cvss Version
- 3.1
Threat ID: 6aa49ff555bf5e2cf5a86594
Added to database: 09/12/2026, 00:42:29 UTC
Last enriched: 09/12/2026, 00:45:33 UTC
Last updated: 09/12/2026, 02:39:17 UTC
Views: 4
Community Reviews
0 reviewsCrowdsource mitigation strategies, share intel context, and vote on the most helpful responses. Sign in to add your voice and help keep defenders ahead.
Want to contribute mitigation steps or threat intel context? Sign in or create an account to join the community discussion.
Actions
Updates to AI analysis require Pro Console access. Upgrade inside Console → Billing.
Need more coverage?
Upgrade to Pro Console for AI refresh and higher limits.
For incident response and remediation, OffSeq services can help resolve threats faster.
Latest Threats
Check if your credentials are on the dark web
Instant breach scanning across billions of leaked records. Free tier available.