Skip to content

Commit d3e85f2

Browse files
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 <Jonathan.Leitschuh@gmail.com> Signed-off-by: Jonathan Leitschuh <Jonathan.Leitschuh@gmail.com> Bug-tracker: JLLeitschuh/security-research#13 Co-authored-by: Moderne <team@moderne.io>
1 parent 2bd33dc commit d3e85f2

File tree

1 file changed

+2
-1
lines changed

1 file changed

+2
-1
lines changed

bigdata-core/bigdata/src/java/com/bigdata/resources/ResourceFileFilter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.io.File;
44
import java.io.FileFilter;
55
import java.io.IOException;
6+
import java.nio.file.Paths;
67

78
import org.apache.log4j.Logger;
89

@@ -82,7 +83,7 @@ final public boolean accept(File f) {
8283

8384
}
8485

85-
if (!fc.startsWith(resourceManager.getDataDir().getPath())) {
86+
if (!Paths.get(fc).normalize().startsWith(resourceManager.getDataDir().getPath())) {
8687

8788
throw new RuntimeException("File not in data directory: file="
8889
+ f + ", dataDir=" + resourceManager.dataDir);

0 commit comments

Comments
 (0)