Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(report): fixed CycloneDX report for compressed files #4761

Merged
merged 2 commits into from
Feb 1, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 12 additions & 4 deletions pkg/model/summary.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,9 +89,10 @@ type Summary struct {
Counters
SeveritySummary
Times
ScannedPaths []string `json:"paths"`
Queries QueryResultSlice `json:"queries"`
Bom QueryResultSlice `json:"bill_of_materials,omitempty"`
ScannedPaths []string `json:"paths"`
Queries QueryResultSlice `json:"queries"`
Bom QueryResultSlice `json:"bill_of_materials,omitempty"`
FilePaths map[string]string `json:"-"`
}

// PathParameters - structure wraps the required fields for temporary path translation
Expand Down Expand Up @@ -180,6 +181,8 @@ func CreateSummary(counters Counters, vulnerabilities []Vulnerability,
severitySummary := SeveritySummary{
ScanID: scanID,
}
filePaths := make(map[string]string)

for i := range vulnerabilities {
item := vulnerabilities[i]
if _, ok := q[item.QueryID]; !ok {
Expand All @@ -196,9 +199,11 @@ func CreateSummary(counters Counters, vulnerabilities []Vulnerability,
}
}

resolvedPath := resolvePath(item.FileName, pathExtractionMap)

qItem := q[item.QueryID]
qItem.Files = append(qItem.Files, VulnerableFile{
FileName: resolvePath(item.FileName, pathExtractionMap),
FileName: resolvedPath,
SimilarityID: item.SimilarityID,
Line: item.Line,
VulnLines: item.VulnLines,
Expand All @@ -210,6 +215,8 @@ func CreateSummary(counters Counters, vulnerabilities []Vulnerability,
Value: item.Value,
})

filePaths[resolvedPath] = item.FileName

q[item.QueryID] = qItem
}

Expand Down Expand Up @@ -251,5 +258,6 @@ func CreateSummary(counters Counters, vulnerabilities []Vulnerability,
SeveritySummary: severitySummary,
ScannedPaths: removeAllURLCredentials(pathExtractionMap),
LatestVersion: version,
FilePaths: filePaths,
}
}
4 changes: 4 additions & 0 deletions pkg/model/summary_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,13 @@ func TestCreateSummary(t *testing.T) {
Bom: []QueryResult{},
Queries: []QueryResult{},
ScannedPaths: []string{},
FilePaths: make(map[string]string),
})
})

t.Run("create_summary", func(t *testing.T) {
filePaths := make(map[string]string)
filePaths["fileName"] = "fileName"
summary := CreateSummary(counter, vulnerabilities, "scanID", pathExtractionMap, Version{})
require.Equal(t, summary, Summary{
Counters: counter,
Expand Down Expand Up @@ -93,6 +96,7 @@ func TestCreateSummary(t *testing.T) {
},
},
ScannedPaths: []string{},
FilePaths: filePaths,
})
})
}
Expand Down
8 changes: 7 additions & 1 deletion pkg/report/cyclonedx.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,28 @@ package report
import (
"strings"

"github.com/Checkmarx/kics/pkg/model"
reportModel "github.com/Checkmarx/kics/pkg/report/model"
)

// PrintCycloneDxReport prints the CycloneDX report in the given path and filename with the given body
func PrintCycloneDxReport(path, filename string, body interface{}) error {
filePaths := make(map[string]string)

if !strings.HasPrefix(filename, "cyclonedx-") {
filename = "cyclonedx-" + filename
}

if body != "" {
if s, ok := body.(*model.Summary); ok {
filePaths = s.FilePaths
}
summary, err := getSummary(body)
if err != nil {
return err
}

body = reportModel.BuildCycloneDxReport(&summary)
body = reportModel.BuildCycloneDxReport(&summary, filePaths)
}

return exportXMLReport(path, filename, body)
Expand Down
11 changes: 6 additions & 5 deletions pkg/report/model/cyclonedx.go
Original file line number Diff line number Diff line change
Expand Up @@ -128,11 +128,12 @@ func getAllFiles(summary *model.Summary) []model.VulnerableFile {
return fileNames
}

func generateSha256(filePath string) string {
content, err := os.ReadFile(filepath.Clean(filePath))
func generateSha256(filePath string, filePaths map[string]string) string {
file := filePaths[filePath]
content, err := os.ReadFile(filepath.Clean(file))

if err != nil {
log.Trace().Msgf("failed to read %s", filePath)
log.Trace().Msgf("failed to read %s", file)
return ""
}

Expand Down Expand Up @@ -224,7 +225,7 @@ func InitCycloneDxReport() *CycloneDxReport {
}

// BuildCycloneDxReport builds the CycloneDX report
func BuildCycloneDxReport(summary *model.Summary) *CycloneDxReport {
func BuildCycloneDxReport(summary *model.Summary, filePaths map[string]string) *CycloneDxReport {
var component Component
var vuln []Vulnerability
var version, sha, purl, filePath string
Expand All @@ -234,7 +235,7 @@ func BuildCycloneDxReport(summary *model.Summary) *CycloneDxReport {

for i := range files {
filePath = strings.Replace(files[i].FileName, "\\", "/", -1)
sha = generateSha256(filePath)
sha = generateSha256(files[i].FileName, filePaths)

index := 12
if len(sha) < index {
Expand Down
15 changes: 12 additions & 3 deletions pkg/report/model/cyclonedx_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -181,8 +181,16 @@ func TestBuildCycloneDxReport(t *testing.T) {
cycloneDx.Components.Components = append(cycloneDx.Components.Components, c2)
cycloneDx.Components.Components = append(cycloneDx.Components.Components, c1)

filePaths := make(map[string]string)

file1 := filepath.Join("..", "..", "..", "assets", "queries", "terraform", "aws", "guardduty_detector_disabled", "test", "positive.tf")
file2 := filepath.Join("..", "..", "..", "assets", "queries", "terraform", "aws", "guardduty_detector_disabled", "test", "negative.tf")
filePaths[file1] = file1
filePaths[file2] = file2

type args struct {
summary *model.Summary
summary *model.Summary
filePaths map[string]string
}
tests := []struct {
name string
Expand All @@ -192,7 +200,8 @@ func TestBuildCycloneDxReport(t *testing.T) {
{
name: "Build CycloneDX report",
args: args{
summary: &test.ExampleSummaryMock,
summary: &test.ExampleSummaryMock,
filePaths: filePaths,
},
want: &cycloneDx,
},
Expand All @@ -205,7 +214,7 @@ func TestBuildCycloneDxReport(t *testing.T) {
queries[idx].Files[i].FileName = filepath.Join("..", "..", "..", queries[idx].Files[i].FileName)
}
}
got := BuildCycloneDxReport(tt.args.summary)
got := BuildCycloneDxReport(tt.args.summary, tt.args.filePaths)
got.SerialNumber = "urn:uuid:" // set to "urn:uuid:" because it will be different for every report
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("BuildCycloneDxReport() = %v, want %v", got, tt.want)
Expand Down
2 changes: 2 additions & 0 deletions pkg/scan/post_scan.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,8 @@ func (c *Client) postScan(scanResults *Results) error {
return err
}

deleteExtractionFolder(scanResults.ExtractedPaths.ExtractionMap)

consolePrinter.PrintScanDuration(time.Since(c.ScanStartTime))

printVersionCheck(c.Printer, &summary)
Expand Down
2 changes: 0 additions & 2 deletions pkg/scan/scan.go
Original file line number Diff line number Diff line change
Expand Up @@ -154,8 +154,6 @@ func (c *Client) executeScan(ctx context.Context) (*Results, error) {
return nil, err
}

deleteExtractionFolder(executeScanParameters.extractedPaths.ExtractionMap)

return &Results{
Results: results,
ExtractedPaths: executeScanParameters.extractedPaths,
Expand Down