Prevent Undertow from exposing classpath files

Update `UndertowEmbeddedServletContainerFactory` so that the
`ClassPathResourceManager` is no longer registered by default.

Prior to this commit the resource manager would be registered whenever
a valid document root could not be found. This had the effect of
exposing all classpath files.

Fixes gh-4015
This commit is contained in:
Phillip Webb 2015-10-15 16:02:41 -07:00
parent 56643222cf
commit c804299c8d
2 changed files with 12 additions and 5 deletions

View File

@ -56,7 +56,6 @@ import org.xnio.SslClientAuthMode;
import io.undertow.Undertow;
import io.undertow.Undertow.Builder;
import io.undertow.UndertowMessages;
import io.undertow.server.handlers.resource.ClassPathResourceManager;
import io.undertow.server.handlers.resource.FileResourceManager;
import io.undertow.server.handlers.resource.Resource;
import io.undertow.server.handlers.resource.ResourceChangeListener;
@ -370,10 +369,7 @@ public class UndertowEmbeddedServletContainerFactory
if (root != null && root.isFile()) {
return new JarResourcemanager(root);
}
if (this.resourceLoader != null) {
return new ClassPathResourceManager(this.resourceLoader.getClassLoader(), "");
}
return new ClassPathResourceManager(getClass().getClassLoader(), "");
return ResourceManager.EMPTY_RESOURCE_MANAGER;
}
private void configureErrorPages(DeploymentInfo servletBuilder) {

View File

@ -482,6 +482,17 @@ public abstract class AbstractEmbeddedServletContainerFactoryTests {
equalTo("test"));
}
@Test
public void cannotReadClassPathFiles() throws Exception {
AbstractEmbeddedServletContainerFactory factory = getFactory();
this.container = factory
.getEmbeddedServletContainer(exampleServletRegistration());
this.container.start();
ClientHttpResponse response = getClientResponse(
getLocalUrl("/org/springframework/boot/SpringApplication.class"));
assertThat(response.getStatusCode(), equalTo(HttpStatus.NOT_FOUND));
}
private Ssl getSsl(ClientAuth clientAuth, String keyPassword, String keyStore) {
return getSsl(clientAuth, keyPassword, keyStore, null);
}