Skip to content

MCP transport, admin and dashboard endpoints are exposed by default merely by adding an MCP starter

Moderate
bnasslahsen published GHSA-4v2q-56v7-2cpw Sep 6, 2026

Package

maven org.springdoc:springdoc-openapi-starter-common-mcp (Maven)

Affected versions

>= 3.0.3, < 3.1.1

Patched versions

3.1.1
maven org.springdoc:springdoc-openapi-starter-webflux-mcp (Maven)
>= 3.0.3, < 3.1.1
3.1.1
maven org.springdoc:springdoc-openapi-starter-webmvc-mcp (Maven)
>= 3.0.3, < 3.1.1
3.1.1

Description

Impact

Every MCP auto-configuration gate was declared with @ConditionalOnProperty(matchIfMissing = true), while the backing fields on SpringDocAiPropertiesenabled and dashboardEnabled — defaulted to false.

The practical consequence is that simply adding an MCP starter to the classpath activated the entire MCP surface, with no configuration and no explicit decision by the integrator:

  • /mcp, the MCP transport, with every operation of the application's OpenAPI document registered as a callable tool
  • /api/mcp-admin/**, including the tool-execution and audit routes
  • /mcp-ui/**, the dashboard

None of these routes carries authentication or authorization of its own; securing them is the integrating application's responsibility, and an integrator who never enabled the feature has no reason to know they exist. The property getters compounded this by returning false, so an operator inspecting configuration would be told the MCP surface was off while it was in fact serving requests.

This insecure default is the precondition that made the other MCP issues fixed in this release remotely reachable.

Patches

Fixed in 3.1.1. All MCP auto-configuration gates — SpringDocAiAutoConfiguration, SpringDocAiProperties, McpDashboardAutoConfiguration, McpWebMvcAiAutoConfiguration and McpWebFluxAiAutoConfiguration — moved to matchIfMissing = false, so the conditionals now agree with the property defaults. SpringDocAiEnvironmentPostProcessor likewise only forces springdoc.pre-loading-enabled when MCP is explicitly enabled.

Upgrade note. MCP is now opt-in. To keep using it, set:

springdoc.ai.mcp.enabled=true
springdoc.ai.mcp.dashboard-enabled=true

The Spring Boot 3 line (2.x) is not affected: the MCP starters do not exist on that branch.

Workarounds

Set springdoc.ai.mcp.enabled=false explicitly, or restrict /mcp, /mcp-ui/** and /api/mcp-admin/** in your SecurityFilterChain.

References

Credits

Reported by Scrutineer (Alpha-Omega).

Severity

Moderate

CVSS overall score

This score calculates overall vulnerability severity from 0 to 10 and is based on the Common Vulnerability Scoring System (CVSS).
/ 10

CVSS v3 base metrics

Attack vector
Network
Attack complexity
Low
Privileges required
None
User interaction
None
Scope
Unchanged
Confidentiality
Low
Integrity
Low
Availability
None

CVSS v3 base metrics

Attack vector: More severe the more the remote (logically and physically) an attacker can be in order to exploit the vulnerability.
Attack complexity: More severe for the least complex attacks.
Privileges required: More severe if no privileges are required.
User interaction: More severe when no user interaction is required.
Scope: More severe when a scope change occurs, e.g. one vulnerable component impacts resources in components beyond its security scope.
Confidentiality: More severe when loss of data confidentiality is highest, measuring the level of data access available to an unauthorized user.
Integrity: More severe when loss of data integrity is the highest, measuring the consequence of data modification possible by an unauthorized user.
Availability: More severe when the loss of impacted component availability is highest.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N

CVE ID

No known CVE

Weaknesses

Initialization of a Resource with an Insecure Default

The product initializes or sets a resource with a default that is intended to be changed by the administrator, but the default is not secure. Learn more on MITRE.

Credits