Skip to content

Commit 542bf38

Browse files
Greybirddaniel-beck
authored andcommitted
[SECURITY-2340]
1 parent 097c287 commit 542bf38

File tree

4 files changed

+90
-3
lines changed

4 files changed

+90
-3
lines changed

pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
<jenkins-test-harness.version>2.6</jenkins-test-harness.version>
2121
<jenkins.version>1.625.3</jenkins.version>
2222
<xtrigger-lib.version>0.33</xtrigger-lib.version>
23+
<mockito.version>3.9.0</mockito.version>
2324
</properties>
2425

2526
<licenses>
@@ -69,5 +70,11 @@
6970
<artifactId>xtrigger-lib</artifactId>
7071
<version>${xtrigger-lib.version}</version>
7172
</dependency>
73+
<dependency>
74+
<groupId>org.mockito</groupId>
75+
<artifactId>mockito-core</artifactId>
76+
<version>${mockito.version}</version>
77+
<scope>test</scope>
78+
</dependency>
7279
</dependencies>
7380
</project>

src/main/java/org/jenkinsci/plugins/nuget/utils/NugetPackageCheckerVisitor.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package org.jenkinsci.plugins.nuget.utils;
22

3+
import com.google.common.annotations.VisibleForTesting;
34
import com.google.common.collect.Maps;
45
import hudson.FilePath;
5-
import org.jenkinsci.lib.xtrigger.XTriggerLog;
66
import org.jenkinsci.plugins.nuget.NugetGlobalConfiguration;
77
import org.jenkinsci.plugins.nuget.triggers.logs.TriggerLog;
88
import org.w3c.dom.Document;
@@ -18,7 +18,6 @@
1818
import java.nio.file.Path;
1919
import java.nio.file.SimpleFileVisitor;
2020
import java.nio.file.attribute.BasicFileAttributes;
21-
import java.util.Collections;
2221
import java.util.Map;
2322

2423
/**
@@ -43,7 +42,9 @@ boolean isUpdated() {
4342
this.configuration = configuration;
4443
this.preReleaseChecked = preReleaseChecked;
4544
this.workspaceRoot = workspaceRoot;
46-
builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
45+
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
46+
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
47+
builder = factory.newDocumentBuilder();
4748
}
4849

4950
@Override
@@ -101,4 +102,9 @@ private String getPackageVersion(FilePath workspaceRoot, String packageName) thr
101102
command.execute();
102103
return command.getVersion();
103104
}
105+
106+
@VisibleForTesting
107+
public Map<String, String> getLatestPackageVersions() {
108+
return latestPackageVersions;
109+
}
104110
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package org.jenkinsci.plugins.nuget.utils;
2+
3+
import org.jenkinsci.plugins.nuget.NugetGlobalConfiguration;
4+
import org.jenkinsci.plugins.nuget.triggers.logs.TriggerLog;
5+
import org.junit.Before;
6+
import org.junit.Test;
7+
import org.mockito.ArgumentCaptor;
8+
import org.xml.sax.SAXParseException;
9+
10+
import java.io.File;
11+
import java.io.IOException;
12+
import java.net.URISyntaxException;
13+
import java.net.URL;
14+
import java.nio.file.FileVisitResult;
15+
import java.nio.file.Path;
16+
17+
import static org.junit.Assert.assertEquals;
18+
import static org.mockito.Mockito.mock;
19+
import static org.mockito.Mockito.verify;
20+
21+
public class NugetPackageCheckerVisitorTest {
22+
23+
NugetPackageCheckerVisitor visitor;
24+
TriggerLog log;
25+
26+
@Before
27+
public void setUp() throws Exception {
28+
log = mock(TriggerLog.class);
29+
NugetGlobalConfiguration configuration = mock(NugetGlobalConfiguration.class);
30+
visitor = new NugetPackageCheckerVisitor(
31+
log,
32+
configuration,
33+
true,
34+
null
35+
);
36+
visitor.getLatestPackageVersions().put("Test", "1.0.0");
37+
}
38+
39+
@Test
40+
public void shouldNotBeVulnerableToXxe() throws URISyntaxException, IOException {
41+
Path file = getFile("xxe");
42+
FileVisitResult fileVisitResult = visitor.visitFile(file, null);
43+
44+
ArgumentCaptor<SAXParseException> exceptionArgumentCaptor = ArgumentCaptor.forClass(SAXParseException.class);
45+
verify(log).errorWhileParsingPackageConfigFile(exceptionArgumentCaptor.capture());
46+
SAXParseException exception = exceptionArgumentCaptor.getValue();
47+
assertEquals(DOCTYPE_FORBIDDEN_ERROR, exception.getMessage());
48+
}
49+
50+
private Path getFile(String path) throws URISyntaxException {
51+
URL url = getClass()
52+
.getClassLoader()
53+
.getResource("NugetPackageCheckerVisitorTest/" + path + "/packages.config");
54+
File file = new File(url.toURI());
55+
return file.toPath();
56+
}
57+
58+
final String DOCTYPE_FORBIDDEN_ERROR =
59+
"DOCTYPE is disallowed when the feature \"http://apache.org/xml/features/disallow-doctype-decl\" set to true.";
60+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<!DOCTYPE packages [
3+
<!ELEMENT packages (package)>
4+
<!ELEMENT package (#PCDATA)>
5+
<!ATTLIST package
6+
id CDATA #REQUIRED
7+
version CDATA #REQUIRED
8+
targetFramework CDATA #REQUIRED
9+
>
10+
<!ENTITY xxe SYSTEM "file:///evil">
11+
]>
12+
<packages>
13+
<package id="Test" version="1.0.0" targetFramework="net46" >&xxe;</package>
14+
</packages>

0 commit comments

Comments
 (0)