Skip to content
This repository was archived by the owner on Feb 26, 2021. It is now read-only.

Commit 47ecf4f

Browse files
committed
Merge branch 'master' into snyk-upgrade-8228f5d01fd268cabdccb8a06e6272ae
2 parents 6b89d10 + d87b08d commit 47ecf4f

File tree

9 files changed

+206
-71
lines changed

9 files changed

+206
-71
lines changed

.github/release-drafter.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ categories:
1313
label: 'docs'
1414
- title: '📌 Dependencies'
1515
label: 'dependencies'
16+
- title: '⛩ DefectDojo'
17+
label: 'defectdojo'
1618
change-template: '- $TITLE @$AUTHOR (#$NUMBER)'
1719
exclude-labels:
1820
- 'skip-changelog'

dependency-check-suppression.xml

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -45,20 +45,12 @@
4545
<cve>CVE-2019-0232</cve>
4646
</suppress>
4747

48-
<suppress until="2020-01-01Z">
48+
<suppress>
4949
<!--
50-
Introduced through: spring-security-core-5.2.0.RELEASE.jar
50+
False Positive.
51+
Does not apply to our Spring Version: https://pivotal.io/security/cve-2018-1258
5152
-->
5253
<cve>CVE-2018-1258</cve>
53-
54-
<!--
55-
Not fixable until camunda-spin updates its jackson dependency
56-
Introduced through: camunda-spin-dataformat-all-1.6.3.jar/META-INF/maven/com.fasterxml.jackson.core/jackson-databind/pom.xml
57-
-->
58-
<cve>CVE-2019-14379</cve>
59-
<cve>CVE-2018-19362</cve>
60-
<cve>CVE-2018-19361</cve>
61-
<cve>CVE-2018-19360</cve>
6254
</suppress>
6355

6456
</suppressions>

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757
please see org.camunda.bpm.springboot.project:camunda-bpm-spring-boot-starter-root
5858
-->
5959
<camunda.version>7.10.0</camunda.version>
60-
<camunda.spring.boot.starter.version>3.2.7</camunda.spring.boot.starter.version>
60+
<camunda.spring.boot.starter.version>3.2.8</camunda.spring.boot.starter.version>
6161
<!-- END IMPORTANT -->
6262

6363
<spring-boot.version>2.2.2.RELEASE</spring-boot.version>
@@ -256,7 +256,7 @@
256256
<plugin>
257257
<groupId>org.owasp</groupId>
258258
<artifactId>dependency-check-maven</artifactId>
259-
<version>5.2.2</version>
259+
<version>5.2.4</version>
260260
<configuration>
261261
<failBuildOnCVSS>8</failBuildOnCVSS>
262262
<format>ALL</format>

scb-engine/pom.xml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@
3535
<version>2.2.2.RELEASE</version>
3636
</dependency>
3737

38+
<dependency>
39+
<groupId>org.springframework.security</groupId>
40+
<artifactId>spring-security-core</artifactId>
41+
<version>5.2.1.RELEASE</version>
42+
</dependency>
43+
3844
<dependency>
3945
<groupId>io.springfox</groupId>
4046
<artifactId>springfox-swagger2</artifactId>
@@ -65,6 +71,7 @@
6571
<dependency>
6672
<groupId>org.camunda.spin</groupId>
6773
<artifactId>camunda-spin-dataformat-all</artifactId>
74+
<version>1.7.5</version>
6875
</dependency>
6976

7077
<dependency>
@@ -83,6 +90,22 @@
8390
<artifactId>tomcat-jdbc</artifactId>
8491
</dependency>
8592

93+
<dependency>
94+
<groupId>org.apache.tomcat.embed</groupId>
95+
<artifactId>tomcat-embed-core</artifactId>
96+
<version>9.0.30</version>
97+
</dependency>
98+
<dependency>
99+
<groupId>org.apache.tomcat.embed</groupId>
100+
<artifactId>tomcat-embed-el</artifactId>
101+
<version>9.0.30</version>
102+
</dependency>
103+
<dependency>
104+
<groupId>org.apache.tomcat.embed</groupId>
105+
<artifactId>tomcat-embed-websocket</artifactId>
106+
<version>9.0.30</version>
107+
</dependency>
108+
86109
<dependency>
87110
<groupId>io.securecodebox.persistenceproviders</groupId>
88111
<artifactId>empty-persistenceprovider</artifactId>

scb-persistenceproviders/defectdojo-persistenceprovider/src/main/java/io/securecodebox/persistence/DefectDojoPersistenceProvider.java

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -150,27 +150,39 @@ private List<String> getRawResults(SecurityTest securityTest) throws DefectDojoP
150150
}
151151

152152
private List<String> getGenericResults(SecurityTest securityTest) {
153-
final String CSV_HEADER = "date,title,cweid,url,severity,description,mitigation,impact,references,active,verified,falsepositive,duplicate";
153+
final String CSV_HEADER = "date,title,cweid,url,severity,description,mitigation,impact,references,active," +
154+
"verified,falsepositive,duplicate";
154155

155156
List<Finding> findings = securityTest.getReport().getFindings();
156157

157158
String genericFindingsCsv = Stream.concat(
158159
Stream.of(CSV_HEADER),
159-
findings.stream().map(finding -> MessageFormat.format(
160-
"{0},{1},,{2},{3},{4},,,,,,{5},{6}",
161-
currentDate(),
162-
finding.getName().replace(",", " "),
163-
finding.getLocation().replace(",", " "),
164-
finding.getSeverity(),
165-
finding.getDescription().replace(",", " "),
166-
finding.isFalsePositive(),
167-
"false"
168-
))
160+
findings.stream()
161+
.map(finding -> checkIfNameOrDescriptionIsNotNull(finding))
162+
.map(finding -> MessageFormat.format(
163+
"{0},{1},,{2},{3},{4},,,,,,{5},{6}",
164+
currentDate(),
165+
finding.getName().replace(",", " "),
166+
finding.getLocation().replace(",", " "),
167+
finding.getSeverity(),
168+
finding.getDescription().replace(",", " "),
169+
finding.isFalsePositive(),
170+
"false"
171+
))
169172
).collect(Collectors.joining("\n"));
170173

171174
return Collections.singletonList(genericFindingsCsv);
172175
}
173176

177+
private Finding checkIfNameOrDescriptionIsNotNull(Finding finding) {
178+
if (null == finding.getName()) {
179+
finding.setName("");
180+
} else if (null == finding.getDescription()) {
181+
finding.setDescription("");
182+
}
183+
return finding;
184+
}
185+
174186
private EngagementResponse createEngagement(SecurityTest securityTest) {
175187
EngagementPayload engagementPayload = new EngagementPayload();
176188
engagementPayload.setProduct(defectDojoService.retrieveProductId(securityTest.getContext()));

scb-persistenceproviders/defectdojo-persistenceprovider/src/main/java/io/securecodebox/persistence/DefectDojoService.java

Lines changed: 64 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -256,35 +256,88 @@ public String getFilename() {
256256
}
257257
/**
258258
* When DefectDojo >= 1.5.4 is used, testType can be given. Add testName in case DefectDojo >= 1.5.4 is used
259+
* Using testName for each branch leads to multiple issues in DefectDojo, so it is not recommended
259260
*/
260261
private Optional<Long> getTestIdByEngagementName(long engagementId, String testName, long offset) {
261262
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(defectDojoUrl + "/api/v2/tests")
262263
.queryParam("engagement", Long.toString(engagementId))
263264
.queryParam("limit", Long.toString(50L))
264265
.queryParam("offset", Long.toString(offset));
265-
if(testName!= null) builder.queryParam("testType", testName);
266+
if(testName != null && !testName.isEmpty()) {
267+
builder.queryParam("testType", testName);
268+
}
266269

267270
RestTemplate restTemplate = new RestTemplate();
268271
HttpEntity engagementRequest = new HttpEntity(getHeaders());
269272

270273
ResponseEntity<DefectDojoResponse<TestResponse>> response = restTemplate.exchange(builder.toUriString(), HttpMethod.GET, engagementRequest, new ParameterizedTypeReference<DefectDojoResponse<TestResponse>>(){});
271274

272275
Optional<Long> testResponseId = null;
273-
for(TestResponse test : response.getBody().getResults()){
274-
if(testName == null || test.getTitle().equals(testName)){
276+
Optional<Long> latestTestResponseId = Optional.empty();
277+
for(TestResponse test : response.getBody().getResults()) {
278+
if(testName == null || (test.getTitle() != null && test.getTitle().equals(testName))) {
275279
testResponseId = Optional.of(test.getId());
276280
}
281+
if(!latestTestResponseId.isPresent() || latestTestResponseId.get() < test.getId()) {
282+
latestTestResponseId = Optional.of(test.getId());
283+
}
284+
277285
}
278286
if(testResponseId != null) {
279287
return testResponseId;
280288
}
281289

282-
if(response.getBody().getNext() != null){
290+
if(response.getBody().getNext() != null) {
283291
return getTestIdByEngagementName(engagementId, testName, offset + 1);
284292
}
293+
LOG.info("Test with name '{}' not found, using latest.", testName);
294+
return latestTestResponseId;
295+
}
296+
/*
297+
* Be aware that using latest might results in "conflicting" "latest" in case a new test is added while requesting latest
298+
*/
299+
public Optional<Long> getLatestTestIdByEngagementName(String engagementName, String productName, String testName, long offset) {
300+
Optional<Long> optionalEngagementId = getEngagementIdByEngagementName(engagementName, productName);
301+
if(!optionalEngagementId.isPresent()) {
302+
LOG.warn("engagementName with name '{}' not found.", engagementName);
303+
return Optional.empty();
304+
}
305+
Long engagementId = optionalEngagementId.get();
306+
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(defectDojoUrl + "/api/v2/tests")
307+
.queryParam("engagement", Long.toString(engagementId))
308+
.queryParam("limit", Long.toString(50L))
309+
.queryParam("offset", Long.toString(offset));
310+
if(testName != null) builder.queryParam("testType", testName);
311+
312+
RestTemplate restTemplate = new RestTemplate();
313+
HttpEntity engagementRequest = new HttpEntity(getHeaders());
314+
315+
ResponseEntity<DefectDojoResponse<TestResponse>> response = restTemplate.exchange(builder.toUriString(), HttpMethod.GET, engagementRequest, new ParameterizedTypeReference<DefectDojoResponse<TestResponse>>(){});
316+
317+
Optional<Long> testResponseId = null;
318+
for(TestResponse test : response.getBody().getResults()){
319+
if(testResponseId == null || test.getId() > testResponseId.get()) {
320+
testResponseId = Optional.of(test.getId());
321+
}
322+
}
323+
324+
if(response.getBody().getNext() != null){
325+
Optional<Long> subOptionalTestResponseId = getTestIdByEngagementName(engagementId, testName, offset + 1);
326+
if(testResponseId == null ||
327+
(subOptionalTestResponseId.isPresent()) &&
328+
subOptionalTestResponseId.get() > testResponseId.get()
329+
) {
330+
testResponseId = subOptionalTestResponseId;
331+
}
332+
}
333+
if(testResponseId != null) {
334+
return testResponseId;
335+
}
336+
285337
LOG.warn("Test with name '{}' not found.", testName);
286338
return Optional.empty();
287339
}
340+
288341
private EngagementResponse createTest(TestPayload testPayload) {
289342
RestTemplate restTemplate = new RestTemplate();
290343

@@ -542,8 +595,13 @@ private UriComponentsBuilder prepareParameters(LinkedMultiValueMap<String, Strin
542595
}
543596

544597
public List<Finding> receiveNonHandledFindings(String productName, String engagementName, String minimumSeverity, LinkedMultiValueMap<String, String> options){
598+
List<Finding> findings = new LinkedList<>();
545599
Long engagementId = getEngagementIdByEngagementName(engagementName, productName).orElse(0L);
546-
options.add("severity", minimumSeverity);
547-
return getCurrentFindings(engagementId, options);
600+
for(String severity : Finding.getServeritiesAndHigherServerities(minimumSeverity)) {
601+
options.remove("severity");
602+
options.add("severity", severity);
603+
findings.addAll(getCurrentFindings(engagementId, options));
604+
}
605+
return findings;
548606
}
549607
}

scb-persistenceproviders/defectdojo-persistenceprovider/src/main/java/io/securecodebox/persistence/models/Finding.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ enum FindingSeverities {
6565

6666
}
6767
public static final LinkedList<String> findingServerities = new LinkedList<String>(){{
68+
add("Informational");
6869
add("Low");
6970
add("Medium");
7071
add("High");

scb-scanprocesses/combined-nmap-ssh-process/src/main/java/io/securecodebox/scanprocess/NmapToSshTransformListener.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
@Component
1414
public class NmapToSshTransformListener extends TransformFindingsToTargetsListener {
1515

16-
public void notify(DelegateExecution delegateExecution) throws Exception{
16+
public void notify(DelegateExecution delegateExecution) throws Exception {
1717

1818
List<Finding> findings = ProcessVariableHelper.readListFromValue(
1919
(String) delegateExecution.getVariable(DefaultFields.PROCESS_FINDINGS.name()),
@@ -31,16 +31,26 @@ public void notify(DelegateExecution delegateExecution) throws Exception{
3131
String port = finding.getAttribute(OpenPortAttributes.port).toString();
3232

3333
Target target = new Target();
34+
target.setName("SSH Scan for " + hostname);
3435
target.setLocation(hostname + ":" + port);
3536

3637
return target;
3738
}).collect(Collectors.toList());
3839

3940
LOG.info("Created Targets out of Findings: " + newTargets);
4041

41-
delegateExecution.setVariable(DefaultFields.PROCESS_TARGETS.name(),
42-
ProcessVariableHelper.generateObjectValue(newTargets)
43-
);
42+
if (!newTargets.isEmpty() && newTargets.size() > 0) {
43+
// define the new SSH targets, based on the nmap port scan results
44+
delegateExecution.setVariable(DefaultFields.PROCESS_TARGETS.name(),
45+
ProcessVariableHelper.generateObjectValue(newTargets)
46+
);
47+
}
48+
else {
49+
// if no new target had been found clear the target parameter (and skip the ssh scan)
50+
delegateExecution.setVariable(DefaultFields.PROCESS_TARGETS.name(),
51+
""
52+
);
53+
}
4454
}
4555

4656
}

0 commit comments

Comments
 (0)