Skip to content

Commit 4116001

Browse files
committed
add test and additional disallow-doctype-decl to disallow it on parsing via disallow declaration of doctypes and also disallowinf xincludes as recommended in https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html#jaxb-unmarshaller
- fixes: SIRI-1037
1 parent 95199e8 commit 4116001

File tree

2 files changed

+24
-0
lines changed

2 files changed

+24
-0
lines changed

src/main/java/sirius/kernel/xml/XMLReader.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,8 @@ public void parse(InputStream stream, Function<String, InputStream> resourceLoca
182182
try (stream) {
183183
SAXParserFactory factory = SAXParserFactory.newInstance();
184184
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
185+
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
186+
factory.setXIncludeAware(false);
185187
SAXParser saxParser = factory.newSAXParser();
186188
org.xml.sax.XMLReader reader = saxParser.getXMLReader();
187189
reader.setEntityResolver(new EntityResolver() {

src/test/kotlin/sirius/kernel/xml/XmlReaderTest.kt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@
99
package sirius.kernel.xml
1010

1111
import org.junit.jupiter.api.Test
12+
import org.junit.jupiter.api.assertThrows
1213
import org.junit.jupiter.api.extension.ExtendWith
1314
import sirius.kernel.SiriusExtension
1415
import sirius.kernel.commons.ValueHolder
1516
import sirius.kernel.health.Counter
1617
import java.io.ByteArrayInputStream
18+
import java.io.IOException
1719
import kotlin.test.assertEquals
1820
import kotlin.test.assertFalse
1921
import kotlin.test.assertTrue
@@ -138,4 +140,24 @@ internal class XmlReaderTest {
138140
assertEquals(0, attributes.size)
139141
assertEquals("", attribute.get())
140142
}
143+
144+
@Test
145+
fun `Reading an external entity is not allowed`() {
146+
val readString = ValueHolder.of<String?>(null)
147+
val reader = XMLReader()
148+
reader.addHandler("root") { node: StructuredNode ->
149+
readString.set(node.queryString("."))
150+
}
151+
assertThrows<IOException> {
152+
reader.parse(
153+
ByteArrayInputStream(//language=xml
154+
"""
155+
<?xml version="1.0" encoding="UTF-8"?>
156+
<!DOCTYPE root [<!ENTITY xxe SYSTEM "file:///etc/hosts">]>
157+
<root>&xxe;</root>
158+
""".trimIndent().toByteArray()
159+
)
160+
)
161+
}
162+
}
141163
}

0 commit comments

Comments
 (0)