Skip to content

Commit 3e63475

Browse files
committed
kics reports
1 parent ae5909e commit 3e63475

File tree

7 files changed

+152
-2
lines changed

7 files changed

+152
-2
lines changed

src/main/java/io/mixeway/api/cicd/controller/CICDController.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.mixeway.api.cicd.controller;
22

33
import io.mixeway.api.cicd.model.GitleaksReport;
4+
import io.mixeway.api.cicd.model.KicsReport;
45
import io.mixeway.api.cicd.model.LoadSCA;
56
import io.mixeway.api.cicd.model.ProjectMetadata;
67
import io.mixeway.api.cicd.service.CICDService;
@@ -140,4 +141,16 @@ public ResponseEntity<?> loadScaVulns(@RequestBody ProjectMetadata projectMetada
140141
Principal principal) throws IOException, UnrecoverableKeyException, CertificateException, NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
141142
return cicdService.loadScaVulns(projectMetadata, codeProjectid, principal);
142143
}
144+
145+
/**
146+
* Validate State of security for given CodeProject and Branch
147+
*/
148+
@CrossOrigin(origins="*")
149+
@PreAuthorize("hasAuthority('ROLE_API')")
150+
@PostMapping(value = "/asset/{id}/kics",produces = "application/json")
151+
public ResponseEntity<?> loadKicsReport(@RequestBody KicsReport kicsReport,
152+
@PathVariable("id") long codeProjectid,
153+
Principal principal) throws UnknownHostException {
154+
return cicdService.loadKicsReport(kicsReport, codeProjectid, principal);
155+
}
143156
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package io.mixeway.api.cicd.model;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import lombok.Getter;
5+
import lombok.NoArgsConstructor;
6+
import lombok.Setter;
7+
8+
@Getter
9+
@Setter
10+
@NoArgsConstructor
11+
public class KicsFile {
12+
@JsonProperty("file_name")
13+
String name;
14+
@JsonProperty("line")
15+
int line;
16+
@JsonProperty("expected_value")
17+
String expectedValue;
18+
@JsonProperty("actual_value")
19+
String actualValue;
20+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package io.mixeway.api.cicd.model;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import lombok.Getter;
5+
import lombok.NoArgsConstructor;
6+
import lombok.Setter;
7+
8+
import java.util.List;
9+
10+
@Getter
11+
@Setter
12+
@NoArgsConstructor
13+
public class KicsQuery {
14+
@JsonProperty("query_name")
15+
String name;
16+
@JsonProperty("severity")
17+
String severity;
18+
@JsonProperty("category")
19+
String category;
20+
@JsonProperty("description")
21+
String description;
22+
@JsonProperty("files")
23+
List<KicsFile> files;
24+
25+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package io.mixeway.api.cicd.model;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import lombok.Getter;
5+
import lombok.NoArgsConstructor;
6+
import lombok.Setter;
7+
8+
import java.util.List;
9+
10+
@Getter
11+
@Setter
12+
@NoArgsConstructor
13+
public class KicsReport {
14+
ProjectMetadata projectMetadata;
15+
KicsReportEntry findings;
16+
17+
18+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package io.mixeway.api.cicd.model;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import lombok.Getter;
5+
import lombok.NoArgsConstructor;
6+
import lombok.Setter;
7+
8+
import java.util.List;
9+
10+
@Getter
11+
@Setter
12+
@NoArgsConstructor
13+
public class KicsReportEntry {
14+
@JsonProperty("total_counter")
15+
int total;
16+
@JsonProperty("queries")
17+
List<KicsQuery> queries;
18+
19+
20+
}

src/main/java/io/mixeway/api/cicd/service/CICDService.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.mixeway.api.cicd.service;
22

33
import io.mixeway.api.cicd.model.GitleaksReport;
4+
import io.mixeway.api.cicd.model.KicsReport;
45
import io.mixeway.api.cicd.model.LoadSCA;
56
import io.mixeway.api.cicd.model.ProjectMetadata;
67
import io.mixeway.api.cioperations.model.ZapReportModel;
@@ -240,4 +241,19 @@ public ResponseEntity<?> loadScaVulns(ProjectMetadata projectMetadata, long code
240241
}
241242
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
242243
}
244+
245+
public ResponseEntity<?> loadKicsReport(KicsReport kicsReport, long codeProjectid, Principal principal) {
246+
Optional<CodeProject> codeProject = findCodeProjectService.findById(codeProjectid);
247+
if (codeProject.isPresent() && permissionFactory.canUserAccessProject(principal, codeProject.get().getProject())){
248+
log.info("[CICD] Received KICS raport that contains {} findings for {} [{}]", kicsReport.getFindings().getTotal(), codeProject.get().getName(), codeProject.get().getRepoUrl());
249+
if (kicsReport.getFindings().getTotal() > 0 ){
250+
codeScanService.loadKicsReport(kicsReport, codeProject.get(), principal);
251+
} else {
252+
codeScanService.loadVulnsFromCICDToCodeProject(codeProject.get(), new ArrayList<>(), ScannerType.IAC);
253+
}
254+
} else {
255+
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
256+
}
257+
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
258+
}
243259
}

src/main/java/io/mixeway/scanmanager/service/code/CodeScanService.java

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package io.mixeway.scanmanager.service.code;
22

3-
import io.mixeway.api.cicd.model.GitleaksReport;
4-
import io.mixeway.api.cicd.model.GitleaksReportEntry;
3+
import io.mixeway.api.cicd.model.*;
54
import io.mixeway.config.Constants;
65
import io.mixeway.db.entity.*;
76
import io.mixeway.db.entity.Scanner;
@@ -506,4 +505,43 @@ public void loadGitleaksReport(GitleaksReport gitleaksReport, CodeProject codePr
506505
updateCiOperations.putScanOnAPipeline(operations, scan, securityQualityGateway.buildGatewayResponse(vulnToPersist));
507506

508507
}
508+
509+
public void loadKicsReport(KicsReport kicsReport, CodeProject codeProject, Principal principal) {
510+
CodeProjectBranch codeProjectBranch = getOrCreateCodeProjectBranchService
511+
.getOrCreateCodeProjectBranch(
512+
codeProject,
513+
kicsReport.getProjectMetadata().getBranch()
514+
);
515+
List<ProjectVulnerability> oldVulnsForCodeProject = getProjectVulnerabilitiesService
516+
.getOldVulnsForCodeProjectAndSourceForBranch(
517+
codeProject,
518+
vulnTemplate.SOURCE_IAC,
519+
codeProjectBranch
520+
);
521+
List<ProjectVulnerability> vulnToPersist = new ArrayList<>();
522+
for (KicsQuery query : kicsReport.getFindings().getQueries()){
523+
Vulnerability vulnerability = vulnTemplate.createOrGetVulnerabilityService.createOrGetVulnerability(query.getName());
524+
525+
for (KicsFile file : query.getFiles()){
526+
String description = query.getDescription() +
527+
"\n\n" +
528+
"Category: " +
529+
query.getCategory() +
530+
"\n" +
531+
"Evidence: " +
532+
file.getActualValue();
533+
ProjectVulnerability projectVulnerability = new ProjectVulnerability(codeProject,codeProject,vulnerability, description,file.getExpectedValue(),
534+
Constants.VULN_CRITICALITY_CRITICAL,null,file.getName()+":"+file.getLine(),
535+
"", vulnTemplate.SOURCE_IAC, null,codeProjectBranch );
536+
537+
vulnToPersist.add(projectVulnerability);
538+
}
539+
}
540+
541+
vulnTemplate.vulnerabilityPersistList(oldVulnsForCodeProject, vulnToPersist);
542+
Scan scan = createScanService.createCodeScan(codeProject, codeProjectBranch.getName(), kicsReport.getProjectMetadata().getCommitId(),
543+
Constants.IAC_LABEL, principal);
544+
CiOperations operations = createCiOperationsService.create(kicsReport.getProjectMetadata(), codeProject);
545+
updateCiOperations.putScanOnAPipeline(operations, scan, securityQualityGateway.buildGatewayResponse(vulnToPersist));
546+
}
509547
}

0 commit comments

Comments
 (0)