From d3e85f2139d54820a3cd75a2ece68ee86548c555 Mon Sep 17 00:00:00 2001 From: Jonathan Leitschuh Date: Wed, 21 Sep 2022 15:23:04 +0000 Subject: [PATCH] vuln-fix: Partial Path Traversal Vulnerability This fixes a partial path traversal vulnerability. Replaces `dir.getCanonicalPath().startsWith(parent.getCanonicalPath())`, which is vulnerable to partial path traversal attacks, with the more secure `dir.getCanonicalFile().toPath().startsWith(parent.getCanonicalFile().toPath())`. To demonstrate this vulnerability, consider `"/usr/outnot".startsWith("/usr/out")`. The check is bypassed although `/outnot` is not under the `/out` directory. It's important to understand that the terminating slash may be removed when using various `String` representations of the `File` object. For example, on Linux, `println(new File("/var"))` will print `/var`, but `println(new File("/var", "/")` will print `/var/`; however, `println(new File("/var", "/").getCanonicalPath())` will print `/var`. Weakness: CWE-22: Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal') Severity: Medium CVSSS: 6.1 Detection: CodeQL & OpenRewrite (https://public.moderne.io/recipes/org.openrewrite.java.security.PartialPathTraversalVulnerability) Reported-by: Jonathan Leitschuh Signed-off-by: Jonathan Leitschuh Bug-tracker: https://github.com/JLLeitschuh/security-research/issues/13 Co-authored-by: Moderne --- .../src/java/com/bigdata/resources/ResourceFileFilter.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bigdata-core/bigdata/src/java/com/bigdata/resources/ResourceFileFilter.java b/bigdata-core/bigdata/src/java/com/bigdata/resources/ResourceFileFilter.java index 4489c15141..b65bbc6f7d 100644 --- a/bigdata-core/bigdata/src/java/com/bigdata/resources/ResourceFileFilter.java +++ b/bigdata-core/bigdata/src/java/com/bigdata/resources/ResourceFileFilter.java @@ -3,6 +3,7 @@ import java.io.File; import java.io.FileFilter; import java.io.IOException; +import java.nio.file.Paths; import org.apache.log4j.Logger; @@ -82,7 +83,7 @@ final public boolean accept(File f) { } - if (!fc.startsWith(resourceManager.getDataDir().getPath())) { + if (!Paths.get(fc).normalize().startsWith(resourceManager.getDataDir().getPath())) { throw new RuntimeException("File not in data directory: file=" + f + ", dataDir=" + resourceManager.dataDir);