Skip to content

Commit cf0714e

Browse files
committed
Merge branch 'jas-violations-support' of https://github.com/eranturgeman/jfrog-cli-security into skip-not-applicable-cves
2 parents 7753671 + e901cd4 commit cf0714e

File tree

13 files changed

+404
-392
lines changed

13 files changed

+404
-392
lines changed

audit_test.go

Lines changed: 89 additions & 115 deletions
Large diffs are not rendered by default.

commands/audit/audit_test.go

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -439,24 +439,21 @@ func TestAuditWithConfigProfile(t *testing.T) {
439439
summary, err := conversion.NewCommandResultsConvertor(conversion.ResultConvertParams{IncludeVulnerabilities: true}).ConvertToSummary(auditResults)
440440
assert.NoError(t, err)
441441

442-
var ScaResultsCount int
442+
var scaResultsCount int
443443
// When checking Applicability results with ExactResultsMatch = true, the sum of all statuses should equal total Sca results amount. Else, we check the provided Sca issues amount
444444
if testcase.expectedCaApplicable > 0 || testcase.expectedCaNotApplicable > 0 || testcase.expectedCaNotCovered > 0 || testcase.expectedCaUndetermined > 0 {
445-
ScaResultsCount = testcase.expectedCaApplicable + testcase.expectedCaNotApplicable + testcase.expectedCaNotCovered + testcase.expectedCaUndetermined
445+
scaResultsCount = testcase.expectedCaApplicable + testcase.expectedCaNotApplicable + testcase.expectedCaNotCovered + testcase.expectedCaUndetermined
446446
} else {
447-
ScaResultsCount = testcase.expectedScaIssues
447+
scaResultsCount = testcase.expectedScaIssues
448448
}
449449
validations.ValidateCommandSummaryOutput(t, validations.ValidationParams{
450-
Actual: summary,
451-
ExactResultsMatch: true,
452-
Vulnerabilities: testcase.expectedSastIssues + testcase.expectedSecretsIssues + testcase.expectedIacIssues + ScaResultsCount,
453-
SastVulnerabilities: testcase.expectedSastIssues,
454-
SecretsVulnerabilities: testcase.expectedSecretsIssues,
455-
IacVulnerabilities: testcase.expectedIacIssues,
456-
ApplicableVulnerabilities: testcase.expectedCaApplicable,
457-
NotApplicableVulnerabilities: testcase.expectedCaNotApplicable,
458-
NotCoveredVulnerabilities: testcase.expectedCaNotCovered,
459-
UndeterminedVulnerabilities: testcase.expectedCaUndetermined,
450+
Actual: summary,
451+
ExactResultsMatch: true,
452+
Total: &validations.TotalCount{Vulnerabilities: testcase.expectedSastIssues + testcase.expectedSecretsIssues + testcase.expectedIacIssues + scaResultsCount},
453+
Vulnerabilities: &validations.VulnerabilityCount{
454+
ValidateScan: &validations.ScanCount{Sca: scaResultsCount, Sast: testcase.expectedSastIssues, Secrets: testcase.expectedSecretsIssues, Iac: testcase.expectedIacIssues},
455+
ValidateApplicabilityStatus: &validations.ApplicabilityStatusCount{Applicable: testcase.expectedCaApplicable, NotApplicable: testcase.expectedCaNotApplicable, NotCovered: testcase.expectedCaNotCovered, Undetermined: testcase.expectedCaUndetermined},
456+
},
460457
})
461458
})
462459
}

scans_test.go

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,15 @@ func TestXrayBinaryScanJson(t *testing.T) {
4545
integration.InitScanTest(t, scangraph.GraphScanMinXrayVersion)
4646
output := testXrayBinaryScan(t, string(format.Json), false)
4747
validations.VerifyJsonResults(t, output, validations.ValidationParams{
48-
Vulnerabilities: 1,
49-
Licenses: 1,
48+
Total: &validations.TotalCount{Licenses: 1, Vulnerabilities: 1},
5049
})
5150
}
5251

5352
func TestXrayBinaryScanSimpleJson(t *testing.T) {
5453
integration.InitScanTest(t, scangraph.GraphScanMinXrayVersion)
5554
output := testXrayBinaryScan(t, string(format.SimpleJson), true)
5655
validations.VerifySimpleJsonResults(t, output, validations.ValidationParams{
57-
Vulnerabilities: 1,
58-
ScaSecurityViolations: 1,
59-
Licenses: 1,
56+
Total: &validations.TotalCount{Licenses: 1, Vulnerabilities: 1, Violations: 1},
6057
})
6158
}
6259

@@ -66,8 +63,7 @@ func TestXrayBinaryScanJsonWithProgress(t *testing.T) {
6663
defer callback()
6764
output := testXrayBinaryScan(t, string(format.Json), false)
6865
validations.VerifyJsonResults(t, output, validations.ValidationParams{
69-
Vulnerabilities: 1,
70-
Licenses: 1,
66+
Total: &validations.TotalCount{Licenses: 1, Vulnerabilities: 1},
7167
})
7268
}
7369

@@ -77,9 +73,7 @@ func TestXrayBinaryScanSimpleJsonWithProgress(t *testing.T) {
7773
defer callback()
7874
output := testXrayBinaryScan(t, string(format.SimpleJson), true)
7975
validations.VerifySimpleJsonResults(t, output, validations.ValidationParams{
80-
Vulnerabilities: 1,
81-
ScaSecurityViolations: 1,
82-
Licenses: 1,
76+
Total: &validations.TotalCount{Licenses: 1, Vulnerabilities: 1, Violations: 1},
8377
})
8478
}
8579

@@ -110,8 +104,7 @@ func TestXrayBinaryScanWithBypassArchiveLimits(t *testing.T) {
110104
scanArgs = append(scanArgs, "--bypass-archive-limits")
111105
output := securityTests.PlatformCli.RunCliCmdWithOutput(t, scanArgs...)
112106
validations.VerifyJsonResults(t, output, validations.ValidationParams{
113-
Vulnerabilities: 1,
114-
Licenses: 1,
107+
Total: &validations.TotalCount{Licenses: 1, Vulnerabilities: 1},
115108
})
116109
}
117110

@@ -172,9 +165,11 @@ func runDockerScan(t *testing.T, testCli *coreTests.JfrogCli, imageName, watchNa
172165
output := testCli.WithoutCredentials().RunCliCmdWithOutput(t, cmdArgs...)
173166
if assert.NotEmpty(t, output) {
174167
if validateSecrets {
175-
validations.VerifySimpleJsonResults(t, output, validations.ValidationParams{InactiveVulnerabilities: minInactives})
168+
validations.VerifySimpleJsonResults(t, output, validations.ValidationParams{
169+
Vulnerabilities: &validations.VulnerabilityCount{ValidateApplicabilityStatus: &validations.ApplicabilityStatusCount{Inactive: minInactives}},
170+
})
176171
} else {
177-
validations.VerifyJsonResults(t, output, validations.ValidationParams{Vulnerabilities: minVulnerabilities, Licenses: minLicenses})
172+
validations.VerifyJsonResults(t, output, validations.ValidationParams{Total: &validations.TotalCount{Vulnerabilities: minVulnerabilities, Licenses: minLicenses}})
178173
}
179174
}
180175
// Run docker scan on image with watch
@@ -184,7 +179,7 @@ func runDockerScan(t *testing.T, testCli *coreTests.JfrogCli, imageName, watchNa
184179
cmdArgs = append(cmdArgs, "--watches="+watchName)
185180
output = testCli.WithoutCredentials().RunCliCmdWithOutput(t, cmdArgs...)
186181
if assert.NotEmpty(t, output) {
187-
validations.VerifyJsonResults(t, output, validations.ValidationParams{ScaSecurityViolations: minViolations})
182+
validations.VerifyJsonResults(t, output, validations.ValidationParams{Total: &validations.TotalCount{Violations: minViolations}})
188183
}
189184
}
190185
}

utils/formats/sarifutils/sarifutils.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,18 @@ func GetResultIssueId(result *sarif.Result) (issueId string) {
5050
return
5151
}
5252

53-
func GetRuleCWE(rule *sarif.ReportingDescriptor) (cwe string) {
53+
func GetRuleCWE(rule *sarif.ReportingDescriptor) (cwe []string) {
5454
if rule == nil || rule.DefaultConfiguration == nil || rule.DefaultConfiguration.Parameters == nil || rule.DefaultConfiguration.Parameters.Properties == nil {
5555
// No CWE property
5656
return
5757
}
5858
if cweProperty, ok := rule.DefaultConfiguration.Parameters.Properties[CWEPropertyKey]; ok {
5959
if cweValue, ok := cweProperty.(string); ok {
60-
return cweValue
60+
split := strings.Split(cweValue, ",")
61+
for _, policy := range split {
62+
cwe = append(cwe, strings.TrimSpace(policy))
63+
}
64+
return
6165
}
6266
}
6367
return

utils/formats/simplejsonapi.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ type SourceCodeRow struct {
100100
Location
101101
RuleId string `json:"ruleId"`
102102
IssueId string `json:"issueId"`
103-
CWE string `json:"cwe,omitempty"`
103+
CWE []string `json:"cwe,omitempty"`
104104
Finding string `json:"finding,omitempty"`
105105
Fingerprint string `json:"fingerprint,omitempty"`
106106
Applicability *Applicability `json:"applicability,omitempty"`

utils/results/conversion/convertor_test.go

Lines changed: 27 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -32,46 +32,43 @@ func getAuditValidationParams() validations.ValidationParams {
3232
return validations.ValidationParams{
3333
ExactResultsMatch: true,
3434

35-
Vulnerabilities: 19,
36-
ApplicableVulnerabilities: 1,
37-
NotApplicableVulnerabilities: 7,
38-
NotCoveredVulnerabilities: 4,
39-
SastVulnerabilities: 4,
40-
SecretsVulnerabilities: 3,
41-
42-
Violations: 7,
43-
ScaSecurityViolations: 5,
44-
ApplicableViolations: 1,
45-
NotApplicableViolations: 4,
46-
SastViolations: 1,
47-
SecretsViolations: 1,
35+
Total: &validations.TotalCount{Vulnerabilities: 19, Violations: 7},
36+
37+
Vulnerabilities: &validations.VulnerabilityCount{
38+
ValidateScan: &validations.ScanCount{Sca: 12, Sast: 4, Secrets: 3},
39+
ValidateApplicabilityStatus: &validations.ApplicabilityStatusCount{Applicable: 1, NotApplicable: 7, NotCovered: 4},
40+
},
41+
42+
Violations: &validations.ViolationCount{
43+
ValidateScan: &validations.ScanCount{Sca: 5, Sast: 1, Secrets: 1},
44+
ValidateApplicabilityStatus: &validations.ApplicabilityStatusCount{Applicable: 1, NotApplicable: 4},
45+
},
4846
}
4947
}
5048

5149
// For Summary we count unique CVE finding (issueId), for SARIF and SimpleJson we count all findings (pair of issueId+impactedComponent)
5250
// We have in the result 2 CVE with 2 impacted components each
5351
func getDockerScanValidationParams(unique bool) validations.ValidationParams {
5452
params := validations.ValidationParams{
55-
ExactResultsMatch: true,
56-
SecretsVulnerabilities: 3,
57-
58-
Violations: 3,
59-
ScaSecurityViolations: 1,
60-
UndeterminedViolations: 1,
61-
SecretsViolations: 2,
53+
ExactResultsMatch: true,
54+
Total: &validations.TotalCount{Violations: 3},
55+
Violations: &validations.ViolationCount{
56+
ValidateScan: &validations.ScanCount{Sca: 1, Secrets: 2},
57+
ValidateApplicabilityStatus: &validations.ApplicabilityStatusCount{Undetermined: 1},
58+
},
6259
}
6360
if unique {
64-
params.Vulnerabilities = 11
65-
params.ApplicableVulnerabilities = 3
66-
params.NotApplicableVulnerabilities = 3
67-
params.NotCoveredVulnerabilities = 1
68-
params.UndeterminedVulnerabilities = 1
61+
params.Total.Vulnerabilities = 11
62+
params.Vulnerabilities = &validations.VulnerabilityCount{
63+
ValidateScan: &validations.ScanCount{Sca: 8, Secrets: 3},
64+
ValidateApplicabilityStatus: &validations.ApplicabilityStatusCount{Applicable: 3, NotApplicable: 3, NotCovered: 1, Undetermined: 1},
65+
}
6966
} else {
70-
params.Vulnerabilities = 14
71-
params.ApplicableVulnerabilities = 5
72-
params.NotApplicableVulnerabilities = 4
73-
params.NotCoveredVulnerabilities = 1
74-
params.UndeterminedVulnerabilities = 1
67+
params.Total.Vulnerabilities = 14
68+
params.Vulnerabilities = &validations.VulnerabilityCount{
69+
ValidateScan: &validations.ScanCount{Sca: 11, Secrets: 3},
70+
ValidateApplicabilityStatus: &validations.ApplicabilityStatusCount{Applicable: 5, NotApplicable: 4, NotCovered: 1, Undetermined: 1},
71+
}
7572
}
7673
return params
7774
}

utils/validations/test_mocks.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/jfrog/jfrog-cli-core/v2/utils/config"
1313
"github.com/jfrog/jfrog-cli-security/utils/results"
1414
"github.com/jfrog/jfrog-client-go/artifactory"
15+
"github.com/jfrog/jfrog-client-go/xray/services"
1516
xscutils "github.com/jfrog/jfrog-client-go/xsc/services/utils"
1617
"github.com/owenrumney/go-sarif/v2/sarif"
1718
"github.com/stretchr/testify/assert"
@@ -166,3 +167,14 @@ func XrayServer(t *testing.T, params MockServerParams) (*httptest.Server, *confi
166167
func NewMockJasRuns(runs ...*sarif.Run) []results.ScanResult[[]*sarif.Run] {
167168
return []results.ScanResult[[]*sarif.Run]{{Scan: runs}}
168169
}
170+
171+
func NewMockScaResults(responses ...services.ScanResponse) (converted []results.ScanResult[services.ScanResponse]) {
172+
for _, response := range responses {
173+
status := 0
174+
if response.ScannedStatus == "Failed" {
175+
status = 1
176+
}
177+
converted = append(converted, results.ScanResult[services.ScanResponse]{Scan: response, StatusCode: status})
178+
}
179+
return
180+
}

0 commit comments

Comments
 (0)