|
6 | 6 | import java.net.Socket;
|
7 | 7 | import java.nio.file.Path;
|
8 | 8 | import java.nio.file.Paths;
|
| 9 | +import java.nio.file.FileSystems; |
9 | 10 |
|
10 | 11 | public class TaintedPath {
|
11 | 12 | public void sendUserFile(Socket sock, String user) throws IOException {
|
@@ -86,4 +87,51 @@ public void sendUserFileGood4(Socket sock, String user) throws IOException {
|
86 | 87 | fileLine = fileReader.readLine();
|
87 | 88 | }
|
88 | 89 | }
|
| 90 | + |
| 91 | + // TODO : New tests |
| 92 | + |
| 93 | + public void sendUserFileGood5(Socket sock, String user) throws IOException { |
| 94 | + BufferedReader filenameReader = new BufferedReader(new InputStreamReader(sock.getInputStream(), "UTF-8")); |
| 95 | + // GOOD: remove all ".." sequences and path separators from the filename |
| 96 | + String filename = filenameReader.readLine().replaceAll("\\.", "").replaceAll("/", ""); |
| 97 | + BufferedReader fileReader = new BufferedReader(new FileReader(filename)); // GOOD |
| 98 | + String fileLine = fileReader.readLine(); |
| 99 | + while(fileLine != null) { |
| 100 | + sock.getOutputStream().write(fileLine.getBytes()); |
| 101 | + fileLine = fileReader.readLine(); |
| 102 | + } |
| 103 | + } |
| 104 | + |
| 105 | + public void sendUserFileGood6(Socket sock, String user) throws IOException { |
| 106 | + BufferedReader filenameReader = new BufferedReader(new InputStreamReader(sock.getInputStream(), "UTF-8")); |
| 107 | + String filename = filenameReader.readLine(); |
| 108 | + // GOOD: remove all ".." sequences and path separators from the filename |
| 109 | + filename = filename.replaceAll("\\.\\.|[/\\\\]", ""); |
| 110 | + BufferedReader fileReader = new BufferedReader(new FileReader(filename)); // GOOD |
| 111 | + String fileLine = fileReader.readLine(); |
| 112 | + while(fileLine != null) { |
| 113 | + sock.getOutputStream().write(fileLine.getBytes()); |
| 114 | + fileLine = fileReader.readLine(); |
| 115 | + } |
| 116 | + } |
| 117 | + |
| 118 | + public void sendUserFileGood7(Socket sock, String user) throws Exception { |
| 119 | + BufferedReader filenameReader = |
| 120 | + new BufferedReader(new InputStreamReader(sock.getInputStream(), "UTF-8")); |
| 121 | + String filename = filenameReader.readLine(); |
| 122 | + |
| 123 | + // GOOD: ensure that that /, \ and .. cannot possibly be in the payload |
| 124 | + if (filename.matches("[0-9a-fA-F]{20,}")) { |
| 125 | + final Path pathObject = FileSystems.getDefault().getPath(filename); // summary now, see https://github.com/github/codeql/commit/19cb7adb6db17a3131b7db93482abc6a0d93ceff#diff-4b91db1bd2a19ab607f83fbe858f0ceffd942d1fb246739c731112367c865f88L8 |
| 126 | + |
| 127 | + BufferedReader fileReader = new BufferedReader(new FileReader(pathObject.toString())); // GOOD |
| 128 | + String fileLine = fileReader.readLine(); |
| 129 | + while (fileLine != null) { |
| 130 | + sock.getOutputStream().write(fileLine.getBytes()); |
| 131 | + fileLine = fileReader.readLine(); |
| 132 | + } |
| 133 | + } |
| 134 | + |
| 135 | + } |
| 136 | + |
89 | 137 | }
|
0 commit comments