Skip to content

Commit a58a452

Browse files
committed
Fix security issues
1 parent d42a3a8 commit a58a452

File tree

4 files changed

+16
-10
lines changed

4 files changed

+16
-10
lines changed

framework/src/play/CorePlugin.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ public static String computeApplicationStatus(boolean json) {
6666
/**
6767
* Intercept /@status and check that the Authorization header is valid.
6868
* Then ask each plugin for a status dump and send it over the HTTP response.
69+
*
70+
* You can ask the /@status using the authorization header and putting your status secret key in it.
71+
* Prior to that you would be required to start play with a -DstatusKey=yourkey
6972
*/
7073
@Override
7174
public boolean rawInvocation(Request request, Response response) throws Exception {
@@ -81,7 +84,7 @@ public boolean rawInvocation(Request request, Response response) throws Exceptio
8184
}
8285
response.contentType = request.path.contains(".json") ? "application/json" : "text/plain";
8386
Header authorization = request.headers.get("authorization");
84-
if (request.isLoopback || (authorization != null && Crypto.sign("@status").equals(authorization.value()))) {
87+
if (authorization != null && (Crypto.sign("@status").equals(authorization.value()) || System.getProperty("statusKey", Play.secretKey).equals(authorization.value()))) {
8588
response.print(computeApplicationStatus(request.path.contains(".json")));
8689
response.status = 200;
8790
return true;
@@ -139,12 +142,6 @@ public String getStatus() {
139142
out.println(plugin.index + ":" + plugin.getClass().getName());
140143
}
141144
out.println();
142-
out.println("Configuration:");
143-
out.println("~~~~~~~~~~~~~~");
144-
for (Object key : Play.configuration.keySet()) {
145-
out.println(key + "=" + Play.configuration.getProperty(key.toString()));
146-
}
147-
out.println();
148145
out.println("Threads:");
149146
out.println("~~~~~~~~");
150147
try {

framework/src/play/data/FileUpload.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
import java.io.IOException;
66
import java.io.InputStream;
77
import org.apache.commons.fileupload.FileItem;
8+
import org.apache.commons.io.FileUtils;
9+
import org.apache.commons.io.FilenameUtils;
10+
import play.Logger;
811
import play.data.parsing.TempFilePlugin;
912
import play.exceptions.UnexpectedException;
1013
import play.libs.Files;
@@ -21,9 +24,13 @@ public FileUpload() {
2124

2225
public FileUpload(FileItem fileItem) {
2326
this.fileItem = fileItem;
24-
defaultFile = new File(TempFilePlugin.createTempFolder(), fileItem.getFieldName() + File.separator + fileItem.getName());
25-
defaultFile.getParentFile().mkdirs();
27+
File tmp = TempFilePlugin.createTempFolder();
28+
defaultFile = new File(tmp, FilenameUtils.getName(fileItem.getFieldName()) + File.separator + FilenameUtils.getName(fileItem.getName()));
2629
try {
30+
if(!defaultFile.getCanonicalPath().startsWith(tmp.getCanonicalPath())) {
31+
throw new IOException("Temp file try to override existing file?");
32+
}
33+
defaultFile.getParentFile().mkdirs();
2734
fileItem.write(defaultFile);
2835
} catch (Exception e) {
2936
throw new IllegalStateException("Error when trying to write to file " + defaultFile.getAbsolutePath(), e);

framework/src/play/data/parsing/ApacheMultipartParser.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.apache.commons.fileupload.ParameterParser;
2828
import org.apache.commons.fileupload.disk.DiskFileItem;
2929
import org.apache.commons.io.FileCleaningTracker;
30+
import org.apache.commons.io.FilenameUtils;
3031
import org.apache.commons.io.output.DeferredFileOutputStream;
3132
import play.Logger;
3233
import play.Play;
@@ -145,7 +146,7 @@ public AutoFileItem(FileItemStream stream) {
145146
this.fieldName = stream.getFieldName();
146147
this.contentType = stream.getContentType();
147148
this.isFormField = stream.isFormField();
148-
this.fileName = stream.getName();
149+
this.fileName = FilenameUtils.getName(stream.getName());
149150
this.sizeThreshold = Integer.parseInt(Play.configuration.getProperty("upload.threshold", "10240"));
150151
this.repository = null;
151152
}

framework/src/play/libs/Files.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,5 @@ public static boolean copyDir(File from, File to) {
8181
return false;
8282
}
8383
}
84+
8485
}

0 commit comments

Comments
 (0)