This is an automated email from the ASF dual-hosted git repository.

bteke pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/hadoop.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 9dda9119fe3 YARN-11923: YARN web proxy AmIpFilter allows TRACE, 
bypassing sparkUI TRACE block (#8230)
9dda9119fe3 is described below

commit 9dda9119fe3c7a89f39fd0a807a19f5e4f89ea12
Author: Susheel Gupta <[email protected]>
AuthorDate: Wed Feb 11 00:11:31 2026 +0530

    YARN-11923: YARN web proxy AmIpFilter allows TRACE, bypassing sparkUI TRACE 
block (#8230)
    
    * YARN-11923: YARN web proxy AmIpFilter allows TRACE, bypassing sparkUI 
TRACE block
    
    * avoided NPE in AmIpFilter when mocked requests return null
    for getMethod()
    
    * fixed eol
---
 .../yarn/server/webproxy/amfilter/AmIpFilter.java  |  7 ++++
 .../server/webproxy/amfilter/TestAmFilter.java     | 44 +++++++++++++++++++++-
 2 files changed, 49 insertions(+), 2 deletions(-)

diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/main/java/org/apache/hadoop/yarn/server/webproxy/amfilter/AmIpFilter.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/main/java/org/apache/hadoop/yarn/server/webproxy/amfilter/AmIpFilter.java
index 1b10d225552..777c012f359 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/main/java/org/apache/hadoop/yarn/server/webproxy/amfilter/AmIpFilter.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/main/java/org/apache/hadoop/yarn/server/webproxy/amfilter/AmIpFilter.java
@@ -138,6 +138,13 @@ public void doFilter(ServletRequest req, ServletResponse 
resp,
     HttpServletRequest httpReq = (HttpServletRequest)req;
     HttpServletResponse httpResp = (HttpServletResponse)resp;
 
+    String method = httpReq.getMethod();
+    if (method != null && (method.equalsIgnoreCase("TRACE") ||
+        method.equalsIgnoreCase("TRACK"))) {
+      httpResp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+      return;
+    }
+
     LOG.debug("Remote address for request is: {}", httpReq.getRemoteAddr());
 
     if (!getProxyAddresses().contains(httpReq.getRemoteAddr())) {
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/test/java/org/apache/hadoop/yarn/server/webproxy/amfilter/TestAmFilter.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/test/java/org/apache/hadoop/yarn/server/webproxy/amfilter/TestAmFilter.java
index 4291e69c1ce..1b3545c767d 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/test/java/org/apache/hadoop/yarn/server/webproxy/amfilter/TestAmFilter.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/test/java/org/apache/hadoop/yarn/server/webproxy/amfilter/TestAmFilter.java
@@ -309,6 +309,46 @@ public void doFilter(ServletRequest servletRequest,
 
   }
 
+  @Test
+  @Timeout(5000)
+  void testTraceAndTrackBlocked() throws Exception {
+    Map<String, String> params = new HashMap<String, String>();
+    params.put(AmIpFilter.PROXY_HOST, proxyHost);
+    params.put(AmIpFilter.PROXY_URI_BASE, proxyUri);
+    FilterConfig config = new DummyFilterConfig(params);
+
+    AmIpFilter testFilter = new AmIpFilter();
+    testFilter.init(config);
+
+    final AtomicBoolean chainCalled = new AtomicBoolean(false);
+    FilterChain chain = new FilterChain() {
+      @Override
+      public void doFilter(ServletRequest servletRequest,
+          ServletResponse servletResponse) throws IOException, 
ServletException {
+        chainCalled.set(true);
+      }
+    };
+
+    HttpServletResponseForTest response = new HttpServletResponseForTest();
+
+    HttpServletRequest traceRequest = Mockito.mock(HttpServletRequest.class);
+    Mockito.when(traceRequest.getMethod()).thenReturn("TRACE");
+    Mockito.when(traceRequest.getRemoteAddr()).thenReturn("127.0.0.1");
+    testFilter.doFilter(traceRequest, response, chain);
+    assertEquals(HttpServletResponse.SC_METHOD_NOT_ALLOWED, response.status);
+    assertFalse(chainCalled.get());
+
+    response.status = 0;
+    chainCalled.set(false);
+
+    HttpServletRequest trackRequest = Mockito.mock(HttpServletRequest.class);
+    Mockito.when(trackRequest.getMethod()).thenReturn("TRACK");
+    Mockito.when(trackRequest.getRemoteAddr()).thenReturn("127.0.0.1");
+    testFilter.doFilter(trackRequest, response, chain);
+    assertEquals(HttpServletResponse.SC_METHOD_NOT_ALLOWED, response.status);
+    assertFalse(chainCalled.get());
+  }
+
   private class HttpServletResponseForTest implements HttpServletResponse {
     String redirectLocation = "";
     int status;
@@ -368,12 +408,12 @@ public String encodeRedirectUrl(String url) {
 
     @Override
     public void sendError(int sc, String msg) throws IOException {
-
+      this.status = sc;
     }
 
     @Override
     public void sendError(int sc) throws IOException {
-
+      this.status = sc;
     }
 
     @Override


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to