Skip to content

Commit 2abb4b9

Browse files
authored
feat: implement OSPS-VM-01.01 vulnerability disclosure policy assessment (#153)
- Add hasVulnerabilityDisclosurePolicy function to check SecurityPolicy field - Update OSPS-VM-01.01 assessment steps: IsActive -> HasSecurityInsightsFile -> hasVulnerabilityDisclosurePolicy - Add comprehensive tests for policy present/missing/invalid payload scenarios - Validates project documentation includes vulnerability reporting policy Closes #32
1 parent eb2600c commit 2abb4b9

File tree

3 files changed

+74
-1
lines changed

3 files changed

+74
-1
lines changed

evaluation_plans/osps/vuln_management/evaluations.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ func OSPS_VM_01() (evaluation *layer4.ControlEvaluation) {
2121
"Maturity Level 3",
2222
},
2323
[]layer4.AssessmentStep{
24-
reusable_steps.NotImplemented,
24+
reusable_steps.IsActive,
25+
reusable_steps.HasSecurityInsightsFile,
26+
hasVulnerabilityDisclosurePolicy,
2527
},
2628
)
2729

evaluation_plans/osps/vuln_management/steps.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,16 @@ func sastToolDefined(payloadData interface{}, _ map[string]*layer4.Change) (resu
4747

4848
return layer4.Failed, "No Static Application Security Testing documented in Security Insights"
4949
}
50+
51+
func hasVulnerabilityDisclosurePolicy(payloadData any, _ map[string]*layer4.Change) (result layer4.Result, message string) {
52+
data, message := reusable_steps.VerifyPayload(payloadData)
53+
if message != "" {
54+
return layer4.Unknown, message
55+
}
56+
57+
if data.Insights.Project.Vulnerability.SecurityPolicy == "" {
58+
return layer4.Failed, "Vulnerability disclosure policy was NOT specified in Security Insights data"
59+
}
60+
61+
return layer4.Passed, "Vulnerability disclosure policy was specified in Security Insights data"
62+
}

evaluation_plans/osps/vuln_management/steps_test.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,3 +106,61 @@ func TestSastToolDefined(t *testing.T) {
106106
}
107107

108108
}
109+
110+
func TestHasVulnerabilityDisclosurePolicy(t *testing.T) {
111+
tests := []struct {
112+
name string
113+
payloadData any
114+
expectedResult layer4.Result
115+
expectedMessage string
116+
}{
117+
{
118+
name: "Vulnerability disclosure policy present",
119+
expectedResult: layer4.Passed,
120+
expectedMessage: "Vulnerability disclosure policy was specified in Security Insights data",
121+
payloadData: data.Payload{
122+
RestData: &data.RestData{
123+
Insights: si.SecurityInsights{
124+
Project: si.Project{
125+
Vulnerability: si.VulnReport{
126+
SecurityPolicy: "https://example.com/SECURITY.md",
127+
},
128+
},
129+
},
130+
},
131+
GraphqlRepoData: &data.GraphqlRepoData{},
132+
},
133+
},
134+
{
135+
name: "Vulnerability disclosure policy missing",
136+
expectedResult: layer4.Failed,
137+
expectedMessage: "Vulnerability disclosure policy was NOT specified in Security Insights data",
138+
payloadData: data.Payload{
139+
RestData: &data.RestData{
140+
Insights: si.SecurityInsights{
141+
Project: si.Project{
142+
Vulnerability: si.VulnReport{
143+
SecurityPolicy: "",
144+
},
145+
},
146+
},
147+
},
148+
GraphqlRepoData: &data.GraphqlRepoData{},
149+
},
150+
},
151+
{
152+
name: "Invalid payload",
153+
expectedResult: layer4.Unknown,
154+
expectedMessage: "Malformed assessment: expected payload type data.Payload, got string (invalid_payload)",
155+
payloadData: "invalid_payload",
156+
},
157+
}
158+
159+
for _, test := range tests {
160+
t.Run(test.name, func(t *testing.T) {
161+
result, message := hasVulnerabilityDisclosurePolicy(test.payloadData, nil)
162+
assert.Equal(t, test.expectedResult, result)
163+
assert.Equal(t, test.expectedMessage, message)
164+
})
165+
}
166+
}

0 commit comments

Comments
 (0)