CVE-2026-47894

Information Exposure
Affects
Spring Cloud Config
in
Spring
No items found.
Versions
>=5.0.0 <=5.0.4, >=4.3.0 <=4.3.4, >=4.0.0 <=4.2.8, <=3.1.14
Exclamation circle icon
Patch Available

This Vulnerability has been fixed in the Never-Ending Support (NES) version offered by HeroDevs.

Overview

Spring Cloud Config is the Spring Cloud project that provides externalized configuration for distributed systems. Its server component, Spring Cloud Config Server, exposes application configuration over HTTP under paths shaped as {application}/{profile}/{label}, backing those requests with a pluggable environment repository. The native environment repository is the file system backed variant, which resolves each request against a configurable set of search locations rather than against a source control repository.

An Information Exposure vulnerability (CVE-2026-47894) has been identified in the native environment repository of Spring Cloud Config Server, which allows authenticated callers to read configuration files that live outside the configured repository path by placing wildcard characters in the application name or label segment of a request.

Per OWASP: Access control enforces policy such that users cannot act outside of their intended permissions. Failures typically lead to unauthorized information disclosure, modification, or destruction of all data or performing a business function outside the user's limits.

This issue affects the native environment repository request handling of Spring Cloud Config.

Details

Module Info

Vulnerability Info

This Medium-severity vulnerability is found in the org.springframework.cloud:spring-cloud-config-server package in the native environment repository of Spring Cloud Config.

When the native profile is active, the server builds its search locations by substituting the application name, profile and label taken straight from the request path into the configured location templates. The substituted values are never checked for pattern characters, so a caller controls part of the location string that the configuration loader later resolves:

// NativeEnvironmentRepository.getLocations(String application, String profile, String label)
String value = location;
if (application != null) {
    value = value.replace("{application}", app);
}
if (prof != null) {
    value = value.replace("{profile}", prof);
}
if (label != null) {
    value = value.replace("{label}", label);
}
if (!value.endsWith("/")) {
    value = value + "/";
}
if (isDirectory(value)) {
    output.add(value);
}

The only gate in front of that substitution is the shared path check the controllers call on each incoming segment. That check rejects parent directory sequences and fragment characters, but it says nothing about the wildcard characters the configuration loader treats as a directory search:

// PathUtils.isInvalidLocation(String location)
private static boolean isInvalidLocation(String location) {
    boolean isInvalid = location.contains("..");

    if (isInvalid && logger.isWarnEnabled()) {
        logger.warn("Location contains \"..\"");
    }
    if (!isInvalid) {
        isInvalid = location.contains("#");
        if (isInvalid && logger.isWarnEnabled()) {
            logger.warn("Location contains \"#\"");
        }
    }

    return isInvalid;
}
// EnvironmentController.normalize(String part)
private String normalize(String part) {
    if (PathUtils.isInvalidEncodedLocation(part)) {
        throw new InvalidEnvironmentRequestException("Invalid request");
    }
    return Environment.normalize(part);
}

Because an asterisk or a question mark passes that check, a request such as one whose application name is an asterisk turns a configured location like file:./config/{application}/ into a wildcard directory search. The loader then expands the pattern across sibling directories, and the resulting property sources are returned to the caller, exposing configuration belonging to other applications and labels outside the repository path the operator configured. The same segments reach the resource and encryption endpoints, so the widened search path is not limited to the environment endpoint. The directory heuristic that filters resolved locations is a string test only, so a location containing a wildcard is retained rather than discarded.

This vulnerability was introduced in 2015 with Spring Cloud Config 1.0.1.RELEASE.

Mitigation

Only recent versions of Spring Cloud Config receive community support. Older lines are End-of-Life and will not receive public updates to address this issue.

Users of the affected components should apply one of the following mitigations:

  • Upgrade to a currently supported version of Spring Cloud Config.
  • Leverage a commercial support partner like HeroDevs for post-EOL security support.

Credits

Vulnerability Details
Severity
Level
CVSS Assessment
Low
>=0 <4
Medium
>=4 <6
High
>=6 <8
Critical
>=8 <10
Medium
ID
CVE-2026-47894
PROJECT Affected
Spring Cloud Config
Versions Affected
>=5.0.0 <=5.0.4, >=4.3.0 <=4.3.4, >=4.0.0 <=4.2.8, <=3.1.14
NES Versions Affected
Published date
September 1, 2026
≈ Fix date
September 1, 2026
Category
Information Exposure
Vex Document
Download VEXHow do I use it?
Sign up for the latest vulnerability alerts fixed in
NES for Spring
Rss feed icon
Subscribe via RSS
or

By submitting the form I acknowledge receipt of our Privacy Policy.

Thanks for signing up for our Newsletter! We look forward to connecting with you.
Oops! Something went wrong while submitting the form.