From 876dfdad807cd4759f00885ba977b3729bff64f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Csahvx655-wq=E2=80=9D?= <“sahvx655@gmail.com”> Date: Fri, 29 May 2026 11:57:51 +0530 Subject: [PATCH] Enhance XXE protection in DefaultServlet and WebdavServlet (Robust version) --- java/org/apache/catalina/servlets/DefaultServlet.java | 7 +++++++ java/org/apache/catalina/servlets/WebdavServlet.java | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/java/org/apache/catalina/servlets/DefaultServlet.java b/java/org/apache/catalina/servlets/DefaultServlet.java index 5d8066cafc47..72d43a6d8d63 100644 --- a/java/org/apache/catalina/servlets/DefaultServlet.java +++ b/java/org/apache/catalina/servlets/DefaultServlet.java @@ -44,8 +44,10 @@ import java.util.Locale; import java.util.function.Function; +import javax.xml.XMLConstants; import javax.xml.transform.Source; import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; @@ -1759,6 +1761,11 @@ protected InputStream renderXml(HttpServletRequest request, String contextPath, currentThread.setContextClassLoader(DefaultServlet.class.getClassLoader()); TransformerFactory tFactory = TransformerFactory.newInstance(); + try { + tFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); + } catch (TransformerConfigurationException e) { + log(sm.getString("defaultServlet.xslError"), e); + } Source xmlSource = new StreamSource(new StringReader(sb.toString())); Transformer transformer = tFactory.newTransformer(xsltSource); diff --git a/java/org/apache/catalina/servlets/WebdavServlet.java b/java/org/apache/catalina/servlets/WebdavServlet.java index 7eb089f935c4..0c10a95b7d01 100644 --- a/java/org/apache/catalina/servlets/WebdavServlet.java +++ b/java/org/apache/catalina/servlets/WebdavServlet.java @@ -43,6 +43,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; +import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -576,6 +577,12 @@ protected DocumentBuilder getDocumentBuilder() throws ServletException { try { DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); documentBuilderFactory.setNamespaceAware(true); + try { + documentBuilderFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); + documentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + } catch (ParserConfigurationException | SAXNotRecognizedException | SAXNotSupportedException e) { + log(sm.getString("webdavservlet.jaxpfailed"), e); + } documentBuilderFactory.setExpandEntityReferences(false); documentBuilder = documentBuilderFactory.newDocumentBuilder(); documentBuilder.setEntityResolver(new WebdavResolver(this.getServletContext()));