mirror of
https://github.com/github/codeql.git
synced 2026-05-14 11:19:27 +02:00
Merge pull request #21652 from MarkLee131/fix/path-injection-torealpath
Java: recognize Path.toRealPath() as path normalization sanitizer
This commit is contained in:
@@ -0,0 +1,4 @@
|
||||
---
|
||||
category: minorAnalysis
|
||||
---
|
||||
* The `java/path-injection` and `java/zipslip` queries now recognize `Path.toRealPath()` as a path normalization sanitizer, consistent with the existing treatment of `Path.normalize()` and `File.getCanonicalPath()`. This reduces false positives for code that uses the NIO.2 API for path canonicalization.
|
||||
@@ -243,7 +243,7 @@ private class PathNormalizeSanitizer extends MethodCall {
|
||||
PathNormalizeSanitizer() {
|
||||
exists(RefType t | this.getMethod().getDeclaringType() = t |
|
||||
(t instanceof TypePath or t instanceof FilesKt) and
|
||||
this.getMethod().hasName("normalize")
|
||||
this.getMethod().hasName(["normalize", "toRealPath"])
|
||||
or
|
||||
t instanceof TypeFile and
|
||||
this.getMethod().hasName(["getCanonicalPath", "getCanonicalFile"])
|
||||
|
||||
@@ -72,6 +72,27 @@ public class TaintedPath {
|
||||
}
|
||||
}
|
||||
|
||||
public void sendUserFileGood5(Socket sock, String user) throws Exception {
|
||||
BufferedReader filenameReader =
|
||||
new BufferedReader(new InputStreamReader(sock.getInputStream(), "UTF-8"));
|
||||
String filename = filenameReader.readLine();
|
||||
|
||||
Path publicFolder = Paths.get("/home/" + user + "/public").toRealPath();
|
||||
Path filePath = publicFolder.resolve(filename).toRealPath();
|
||||
|
||||
// GOOD: toRealPath() normalizes the path (resolves ".." and symlinks),
|
||||
// equivalent to File.getCanonicalPath()
|
||||
if (!filePath.startsWith(publicFolder + File.separator)) {
|
||||
throw new IllegalArgumentException("Invalid filename");
|
||||
}
|
||||
BufferedReader fileReader = new BufferedReader(new FileReader(filePath.toString()));
|
||||
String fileLine = fileReader.readLine();
|
||||
while (fileLine != null) {
|
||||
sock.getOutputStream().write(fileLine.getBytes());
|
||||
fileLine = fileReader.readLine();
|
||||
}
|
||||
}
|
||||
|
||||
public void sendUserFileGood4(Socket sock, String user) throws IOException {
|
||||
BufferedReader filenameReader =
|
||||
new BufferedReader(new InputStreamReader(sock.getInputStream(), "UTF-8"));
|
||||
|
||||
Reference in New Issue
Block a user