|
8 | 8 | import java.security.KeyStore; |
9 | 9 |
|
10 | 10 | import javax.annotation.PreDestroy; |
| 11 | +import javax.servlet.ServletException; |
| 12 | +import javax.servlet.http.HttpServletRequest; |
| 13 | +import javax.servlet.http.HttpServletResponse; |
11 | 14 | import javax.validation.constraints.NotNull; |
12 | 15 |
|
13 | 16 | import org.eclipse.jetty.http.HttpVersion; |
14 | | -import org.eclipse.jetty.server.Handler; |
15 | | -import org.eclipse.jetty.server.HttpConfiguration; |
16 | | -import org.eclipse.jetty.server.HttpConnectionFactory; |
17 | | -import org.eclipse.jetty.server.SecureRequestCustomizer; |
18 | | -import org.eclipse.jetty.server.Server; |
19 | | -import org.eclipse.jetty.server.ServerConnector; |
20 | | -import org.eclipse.jetty.server.SslConnectionFactory; |
| 17 | +import org.eclipse.jetty.server.*; |
21 | 18 | import org.eclipse.jetty.server.handler.HandlerCollection; |
| 19 | +import org.eclipse.jetty.server.handler.HandlerWrapper; |
22 | 20 | import org.eclipse.jetty.servlet.ServletContextHandler; |
23 | 21 | import org.eclipse.jetty.util.ssl.SslContextFactory; |
24 | 22 | import org.slf4j.Logger; |
@@ -94,15 +92,39 @@ public void setup() throws IOException { |
94 | 92 | new SslConnectionFactory(sslContextFactory, |
95 | 93 | HttpVersion.HTTP_1_1.asString()), new HttpConnectionFactory(https_config)); |
96 | 94 | connector.setPort(port); |
97 | | - //connector.setReuseAddress(true); |
| 95 | + |
| 96 | + // Disable TRACE method |
| 97 | + for (ConnectionFactory connectionFactory : connector.getConnectionFactories()) { |
| 98 | + if (connectionFactory instanceof HttpConnectionFactory) { |
| 99 | + ((HttpConnectionFactory) connectionFactory).getHttpConfiguration().setFormEncodedMethods( |
| 100 | + "GET", "POST", "HEAD", "OPTIONS", "PUT", "DELETE"); |
| 101 | + } |
| 102 | + } |
| 103 | + |
98 | 104 | server.addConnector(connector); |
99 | 105 |
|
100 | 106 | HandlerCollection handlerCollection = new HandlerCollection(); |
101 | 107 |
|
| 108 | + // Create a handler wrapper to filter out TRACE requests |
| 109 | + HandlerWrapper traceFilter = new HandlerWrapper() { |
| 110 | + @Override |
| 111 | + public void handle(String target, Request baseRequest, HttpServletRequest request, |
| 112 | + HttpServletResponse response) throws IOException, ServletException { |
| 113 | + if ("TRACE".equals(request.getMethod())) { |
| 114 | + response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED); |
| 115 | + baseRequest.setHandled(true); |
| 116 | + return; |
| 117 | + } |
| 118 | + super.handle(target, baseRequest, request, response); |
| 119 | + } |
| 120 | + }; |
| 121 | + |
102 | 122 | ServletContextHandler handler = new ServletContextHandler(ServletContextHandler.SESSIONS); |
103 | 123 | handler.setContextPath("/"); |
104 | 124 | handler.addServlet(getMessagingServlet(), WS_URL); |
105 | | - handlerCollection.setHandlers(new Handler[]{handler}); |
| 125 | + // Add the trace filter |
| 126 | + traceFilter.setHandler(handler); |
| 127 | + handlerCollection.setHandlers(new Handler[]{traceFilter}); |
106 | 128 |
|
107 | 129 | server.setHandler(handlerCollection); |
108 | 130 | }catch (Exception e) { |
@@ -144,6 +166,14 @@ private HttpConfiguration getHttpConfiguration(int port) { |
144 | 166 | http_config.setSecureScheme("https"); |
145 | 167 | http_config.setSecurePort(port); |
146 | 168 | http_config.addCustomizer(new SecureRequestCustomizer()); |
| 169 | + |
| 170 | + // Disable TRACE method to fix CVE-2010-0386 |
| 171 | + http_config.setFormEncodedMethods("GET", "POST", "HEAD", "OPTIONS", "PUT", "DELETE"); |
| 172 | + http_config.setSecurePort(port); |
| 173 | + http_config.setRequestHeaderSize(8192); |
| 174 | + http_config.setSendServerVersion(false); |
| 175 | + http_config.setSendDateHeader(false); |
| 176 | + |
147 | 177 | return http_config; |
148 | 178 | } |
149 | 179 |
|
|
0 commit comments