GitHub Advisoryadvisory · Maven

GHSA-cjx7-399x-p2rj Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal') in micronaut-core

HIGH Published 2021-07-26 Modified 2021-07-28 Official page ↗
Aliases
CVE-2021-32769
Ecosystem
Maven
Packages
io.micronaut:micronaut-http-server-netty
Severity
High
CVSS vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
Weaknesses
CWE-22
Reviewed
2021-07-22

Affected packages

• Maven io.micronaut:micronaut-http-server-netty: < 2.5.9 → fixed in 2.5.9

Description

With a basic configuration like ```yaml router: static-resources: assets: enabled: true mapping: /.assets/public/ paths: file:/home/lstrmiska/test/ ``` it is possible to access any file from a filesystem, using "/../../" in URL, as Micronaut does not restrict file access to configured paths. Repro Steps • create a file test.txt in /home/lstrmiska • start micronaut • execute command `curl -v --path-as-is "http://localhost:8080/.assets/public/../test.txt"` Impact Micronaut can potentially leak sensitive information. See https://cwe.mitre.org/data/definitions/22.html Patches ``` diff --git a/core/src/main/java/io/micronaut/core/io/file/DefaultFileSystemResourceLoader.java b/core/src/main/java/io/micronaut/core/io/file/DefaultFileSystemResourceLoader.java index 2f5a91403..19d3b7f05 100644 --- a/core/src/main/java/io/micronaut/core/io/file/DefaultFileSystemResourceLoader.java +++ b/core/src/main/java/io/micronaut/core/io/file/DefaultFileSystemResourceLoader.java @@ -69,6 +69,9 @@ public class DefaultFileSystemResourceLoader implements FileSystemResourceLoader @Override public Optional getResourceAsStream(String path) { Path filePath = getFilePath(normalize(path)); + if (pathOutsideBase(filePath)) { + return Optional.empty(); + } try { return Optional.of(Files.newInputStream(filePath)); } catch (IOException e) { @@ -79,7 +82,7 @@ public class DefaultFileSystemResourceLoader implements FileSystemResourceLoader @Override public Optional getResource(String path) { Path filePath = getFilePath(normalize(path)); • if (Files.exists(filePath) && Files.isReadable(filePath) && !Files.isDirectory(filePath)) { + if (!pathOutsideBase(filePath) && Files.exists(filePath) && Files.isReadable(filePath) && !Files.isDirectory(filePath)) { try { URL url = filePath.toUri().toURL(); return Optional.of(url); @@ -117,4 +120,15 @@ public class DefaultFileSystemResourceLoader implements FileSystemResourceLoader private Path getFilePath(String path) { return baseDirPath.map(dir -> dir.resolve(path)).orElseGet(() -> Paths.get(path)); } + + private boolean pathOutsideBase(Path path) { + if (baseDirPath.isPresent()) { + Path baseDir = baseDirPath.get(); + if (path.isAbsolute() == baseDir.isAbsolute()) { + Path relativePath = baseDir.relativize(path); + return relativePath.startsWith(".."); + } + } + return false; + } } -- ``` Workarounds • do not use in mapping, use only * which exposes only flat structure of a directory not allowing traversal • run micronaut in chroot (linux only) References See https://cwe.mitre.org/data/definitions/22.html For more information If you have any questions or comments about this advisory: • Open an issue in Github • Email us at [email protected]

Related

Alias · CVE (1)

  • CVE-2021-32769 Micronaut is a JVM-based, full stack Java framework designed for building JVM applications. vulnerability

Weakness · CWE (1)

  • CWE-22 Improper Limitation of a Pathname to a Restricted Directory weakness

References