1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.xml.secure;
19
20 import javax.xml.transform.Source;
21 import javax.xml.validation.Validator;
22
23 import org.junit.jupiter.api.Assumptions;
24 import org.junit.jupiter.api.Tag;
25 import org.junit.jupiter.api.Test;
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 class ExternalGeneralEntityTest {
51
52 private static final String INSERTION = "&xxe;";
53
54 private static String withDoctype(final String rootQName, final String body) {
55 return "<?xml version=\"1.0\"?>\n"
56 + "<!DOCTYPE " + rootQName + " [\n"
57 + " <!ENTITY xxe SYSTEM \"" + AttackTestSupport.resourceUrl("referenced.txt") + "\">\n"
58 + "]>\n"
59 + body + "\n";
60 }
61
62 private static String xmlPayload() {
63 return withDoctype("root", AttackTestSupport.xmlBody(INSERTION));
64 }
65
66 private static String xsdPayload() {
67 return withDoctype("xs:schema", AttackTestSupport.xsdBody(INSERTION));
68 }
69
70 private static String xsltPayload() {
71 return withDoctype("xsl:stylesheet", AttackTestSupport.xsltBody(INSERTION));
72 }
73
74 @Test
75 @Tag("dom")
76 void secureDomDoesNotLeak() {
77 Assumptions.assumeTrue(AttackTestSupport.DOM_RESOLVES_INTERNAL_ENTITIES,
78 "Skipped: platform DOM does not resolve user-defined entities");
79 AttackTestSupport.assertDomDoesNotLeak(xmlPayload());
80 }
81
82 @Test
83 @Tag("sax")
84 void secureSaxDoesNotLeak() {
85 AttackTestSupport.assertSaxDoesNotLeak(xmlPayload());
86 }
87
88 @Test
89 @Tag("schema")
90 void secureSchemaDoesNotLeak() {
91 AttackTestSupport.assertSchemaDoesNotLeak(AttackTestSupport.streamSource(xsdPayload()));
92 }
93
94 @Test
95 @Tag("stax")
96 void secureStaxDoesNotLeak() {
97 AttackTestSupport.assertStaxDoesNotLeak(xmlPayload());
98 }
99
100 @Test
101 @Tag("trax")
102 void secureTemplatesDoesNotLeak() {
103 AttackTestSupport.assertTemplatesDoesNotLeak(AttackTestSupport.streamSource(xsltPayload()));
104 }
105
106 @Test
107 @Tag("trax")
108 void secureTransformerDoesNotLeak() {
109 AttackTestSupport.assertTransformerDoesNotLeak(xmlPayload());
110 }
111
112 @Test
113 @Tag("schema")
114 void secureValidatorDoesNotLeak() {
115 AttackTestSupport.assertValidatorDoesNotLeak(xmlPayload());
116 }
117
118 @Test
119 @Tag("sax")
120 void secureXmlReaderDoesNotLeak() {
121 AttackTestSupport.assertXmlReaderDoesNotLeak(xmlPayload());
122 }
123
124 @Test
125 @Tag("dom")
126 void unconfiguredDomParses() {
127 Assumptions.assumeTrue(AttackTestSupport.DOM_RESOLVES_INTERNAL_ENTITIES,
128 "Skipped: platform DOM does not resolve user-defined entities");
129 AttackTestSupport.assertPermissiveDomParses(xmlPayload());
130 }
131
132 @Test
133 @Tag("sax")
134 void unconfiguredSaxParses() {
135 AttackTestSupport.assertPermissiveSaxParses(xmlPayload());
136 }
137
138 @Test
139 @Tag("schema")
140 void unconfiguredSchemaCompiles() {
141 AttackTestSupport.assertPermissiveSchemaCompiles(AttackTestSupport.streamSource(xsdPayload()));
142 }
143
144 @Test
145 @Tag("stax")
146 void unconfiguredStaxParses() {
147 AttackTestSupport.assertPermissiveStaxParses(xmlPayload());
148 }
149
150 @Test
151 @Tag("trax")
152 void unconfiguredTemplatesCompiles() {
153 AttackTestSupport.assertPermissiveTemplatesCompiles(xsltPayload());
154 }
155
156 @Test
157 @Tag("trax")
158 void unconfiguredTransformerTransforms() {
159 AttackTestSupport.assertPermissiveTransformerTransforms(xmlPayload());
160 }
161
162 @Test
163 @Tag("schema")
164 void unconfiguredValidatorValidates() {
165 AttackTestSupport.assertPermissiveValidatorValidates(xmlPayload());
166 }
167 }