From 9655e79d26c934292b116e27db126850e82de3b2 Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Wed, 6 Aug 2014 18:13:54 +0000
Subject: [PATCH] UPnP: Disable external entities in XML parser

---
 .../cybergarage/xml/parser/JaxpParser.java    | 32 +++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/router/java/src/org/cybergarage/xml/parser/JaxpParser.java b/router/java/src/org/cybergarage/xml/parser/JaxpParser.java
index 139f59f487..1d6e97f6a8 100644
--- a/router/java/src/org/cybergarage/xml/parser/JaxpParser.java
+++ b/router/java/src/org/cybergarage/xml/parser/JaxpParser.java
@@ -21,18 +21,21 @@
 
 package org.cybergarage.xml.parser;
 
+import java.io.ByteArrayInputStream;
 import java.io.FilterInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
 
 import org.cybergarage.xml.Node;
 import org.cybergarage.xml.Parser;
 import org.cybergarage.xml.ParserException;
 import org.w3c.dom.Document;
 import org.w3c.dom.NamedNodeMap;
+import org.xml.sax.EntityResolver;
 import org.xml.sax.InputSource;
 
 
@@ -116,8 +119,25 @@ public class JaxpParser extends Parser
 		org.cybergarage.xml.Node root = null;
 		
 		try {
+			// https://www.owasp.org/index.php/XML_External_Entity_%28XXE%29_Processing
 			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+			factory.setValidating(false);
+			factory.setNamespaceAware(true);
+			factory.setExpandEntityReferences(false);
+			try {
+			    factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
+			} catch (ParserConfigurationException pce) {}
+			try {
+			    factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
+			} catch (ParserConfigurationException pce) {}
+			try {
+			    factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
+			} catch (ParserConfigurationException pce) {}
+			try {
+			    factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
+			} catch (ParserConfigurationException pce) {}
 			DocumentBuilder builder = factory.newDocumentBuilder();
+			builder.setEntityResolver(new BlankingResolver());
 			InputSource inSrc = new InputSource(new NullFilterInputStream(inStream));
 			Document doc = builder.parse(inSrc);
 
@@ -163,4 +183,16 @@ public class JaxpParser extends Parser
 			return rv;
 		}
 	}
+
+	/**
+	 *  I2P -
+	 *  http://stackoverflow.com/questions/5883542/disable-xml-validation-based-on-external-dtd-xsd
+	 */
+	private static class BlankingResolver implements EntityResolver {
+                private static final byte[] DUMMY = new byte[0];
+
+		public InputSource resolveEntity(String arg0, String arg1) {
+			return new InputSource(new ByteArrayInputStream(DUMMY));
+		}
+	}
 }
-- 
GitLab