提交 ed0bfe30 编写于 作者: O Oleg Nenashev

Restrict everything excepting the predefined list of entries.

上级 ecab74af
...@@ -51,8 +51,10 @@ import java.net.MalformedURLException; ...@@ -51,8 +51,10 @@ import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
import java.net.URLConnection; import java.net.URLConnection;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.TreeSet;
import javax.servlet.ServletException; import javax.servlet.ServletException;
...@@ -322,13 +324,14 @@ public abstract class Slave extends Node implements Serializable { ...@@ -322,13 +324,14 @@ public abstract class Slave extends Node implements Serializable {
public URL getURL() throws MalformedURLException { public URL getURL() throws MalformedURLException {
String name = fileName; String name = fileName;
if (name.equals("hudson-cli.jar")) name="jenkins-cli.jar";
// Prevent the sandbox escaping (SECURITY-195) // Prevent the access to war contents & prevent the folder escaping (SECURITY-195)
if (name.equals("..") || name.startsWith("../") || name.startsWith("..\\") || if (!ALLOWED_JNLPJARS_FILES.contains(name)) {
name.replace('\\','/').contains("/../")) { throw new MalformedURLException("The specified file path " + fileName + " is not allowed due to security reasons");
throw new MalformedURLException("The specified file path " + fileName + " contains '..'. " }
+ "The path is not allowed due to security reasons");
if (name.equals("hudson-cli.jar")) {
name="jenkins-cli.jar";
} }
URL res = Jenkins.getInstance().servletContext.getResource("/WEB-INF/" + name); URL res = Jenkins.getInstance().servletContext.getResource("/WEB-INF/" + name);
...@@ -505,4 +508,10 @@ public abstract class Slave extends Node implements Serializable { ...@@ -505,4 +508,10 @@ public abstract class Slave extends Node implements Serializable {
* Determines the workspace root file name for those who really really need the shortest possible path name. * Determines the workspace root file name for those who really really need the shortest possible path name.
*/ */
private static final String WORKSPACE_ROOT = System.getProperty(Slave.class.getName()+".workspaceRoot","workspace"); private static final String WORKSPACE_ROOT = System.getProperty(Slave.class.getName()+".workspaceRoot","workspace");
/**
* Provides a collection of file names, which are accessible via /jnlpJars link.
*/
private static final Set<String> ALLOWED_JNLPJARS_FILES = new TreeSet<String>
(Arrays.asList("slave.jar", "remoting.jar", "jenkins-cli.jar", "hudson-cli.jar"));
} }
...@@ -52,9 +52,19 @@ public class SlaveTest2 { ...@@ -52,9 +52,19 @@ public class SlaveTest2 {
// Spot-check correct requests // Spot-check correct requests
assertJnlpJarUrlIsAllowed(slave, "slave.jar"); assertJnlpJarUrlIsAllowed(slave, "slave.jar");
assertJnlpJarUrlIsAllowed(slave, "remoting.jar");
assertJnlpJarUrlIsAllowed(slave, "jenkins-cli.jar"); assertJnlpJarUrlIsAllowed(slave, "jenkins-cli.jar");
assertJnlpJarUrlIsAllowed(slave, "hudson-cli.jar");
// Go to the upper level // Check that requests to other WEB-INF contents fail
assertJnlpJarUrlFails(slave, "web.xml");
assertJnlpJarUrlFails(slave, "web.xml");
assertJnlpJarUrlFails(slave, "classes/bundled-plugins.txt");
assertJnlpJarUrlFails(slave, "classes/dependencies.txt");
assertJnlpJarUrlFails(slave, "plugins/ant.hpi");
assertJnlpJarUrlFails(slave, "nonexistentfolder/something.txt");
// Try various kinds of folder escaping (SECURITY-195)
assertJnlpJarUrlFails(slave, "../"); assertJnlpJarUrlFails(slave, "../");
assertJnlpJarUrlFails(slave, ".."); assertJnlpJarUrlFails(slave, "..");
assertJnlpJarUrlFails(slave, "..\\"); assertJnlpJarUrlFails(slave, "..\\");
...@@ -89,7 +99,6 @@ public class SlaveTest2 { ...@@ -89,7 +99,6 @@ public class SlaveTest2 {
// Access from a Web client // Access from a Web client
JenkinsRule.WebClient client = rule.createWebClient(); JenkinsRule.WebClient client = rule.createWebClient();
client.getPage(client.getContextPath() + "jnlpJars/" + URLEncoder.encode(url, "UTF-8")).getWebResponse().getContentAsString(); client.getPage(client.getContextPath() + "jnlpJars/" + URLEncoder.encode(url, "UTF-8")).getWebResponse().getContentAsString();
client.getPage(jnlpJar.getURL()).getWebResponse().getContentAsString(); client.getPage(jnlpJar.getURL()).getWebResponse().getContentAsString();
} }
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册