YARN-6352. Header injections are possible in application proxy servlet (Naganarasimha G R via Varun Saxena)

This commit is contained in:
Varun Saxena 2017-03-30 03:49:32 +05:30
parent c2636468d7
commit 3fe7d36e72
2 changed files with 48 additions and 1 deletions

View File

@ -52,6 +52,7 @@
import org.apache.hadoop.yarn.conf.YarnConfiguration;
import org.apache.hadoop.yarn.exceptions.ApplicationNotFoundException;
import org.apache.hadoop.yarn.exceptions.YarnException;
import org.apache.hadoop.yarn.exceptions.YarnRuntimeException;
import org.apache.hadoop.yarn.server.webproxy.AppReportFetcher.AppReportSource;
import org.apache.hadoop.yarn.server.webproxy.AppReportFetcher.FetchedAppReport;
import org.apache.hadoop.yarn.util.Apps;
@ -348,7 +349,12 @@ private void methodAction(final HttpServletRequest req,
//parts[0] is empty because path info always starts with a /
String appId = parts[1];
String rest = parts.length > 2 ? parts[2] : "";
ApplicationId id = Apps.toAppID(appId);
ApplicationId id = null;
try {
id = Apps.toAppID(appId);
} catch (YarnRuntimeException e) {
throw new YarnRuntimeException("Error parsing Application Id");
}
if (id == null) {
LOG.warn("{} attempting to access {} that is invalid",

View File

@ -380,6 +380,47 @@ public void testWebAppProxyServerMainMethod() throws Exception {
}
}
/**
* Test header injections are not done.
*/
@Test(timeout=5000)
public void testWebAppProxyServerHeaderInjection() throws Exception {
WebAppProxyServer mainServer = null;
Configuration conf = new YarnConfiguration();
conf.set(YarnConfiguration.PROXY_ADDRESS, "localhost:9099");
try {
mainServer = WebAppProxyServer.startServer(conf);
int counter = 20;
URL wrongUrl = new URL(
"http://localhost:9099/proxy/%C4%8D%C4%8ASomeCustomInjectedHeader:%20"
+ "injected_headerVal_1484290871375_0113/");
HttpURLConnection proxyConn = null;
while (counter > 0) {
counter--;
try {
proxyConn = (HttpURLConnection) wrongUrl.openConnection();
proxyConn.connect();
proxyConn.getResponseCode();
// server started ok
counter = 0;
} catch (Exception e) {
Thread.sleep(100);
}
}
assertNotNull(proxyConn);
// wrong application Id
assertEquals(HttpURLConnection.HTTP_INTERNAL_ERROR,
proxyConn.getResponseCode());
assertTrue("Header injection happened",
proxyConn.getHeaderField("SomeCustomInjectedHeader") == null);
} finally {
if (mainServer != null) {
mainServer.stop();
}
}
}
private String readInputStream(InputStream input) throws Exception {
ByteArrayOutputStream data = new ByteArrayOutputStream();
byte[] buffer = new byte[512];