Cybersecurity-Projects/PROJECTS/intermediate/sbom-generator-vulnerabilit.../internal/vuln/cvss_test.go

116 lines
3.0 KiB
Go

// ©AngelaMos | 2026
// cvss_test.go
package vuln
import (
"testing"
"github.com/CarterPerez-dev/bomber/pkg/types"
"github.com/stretchr/testify/assert"
)
func TestCVSSKnownVectors(t *testing.T) {
tests := []struct {
name string
vector string
score float64
}{
{
name: "CVE-2023-44487 HTTP/2 rapid reset",
vector: "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
score: 7.5,
},
{
name: "max severity all high",
vector: "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H",
score: 10.0,
},
{
name: "log4shell CVE-2021-44228",
vector: "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H",
score: 10.0,
},
{
name: "local low impact",
vector: "CVSS:3.1/AV:L/AC:H/PR:H/UI:R/S:U/C:L/I:N/A:N",
score: 1.8,
},
{
name: "network medium complexity",
vector: "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H",
score: 8.1,
},
{
name: "scope changed low priv",
vector: "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:N",
score: 6.4,
},
{
name: "physical access required",
vector: "CVSS:3.1/AV:P/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
score: 6.8,
},
{
name: "adjacent network",
vector: "CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
score: 8.8,
},
{
name: "scope changed high priv",
vector: "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H",
score: 8.8,
},
{
name: "all none impact",
vector: "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:N",
score: 0.0,
},
{
name: "CVE-2022-41723 net/http2 resource",
vector: "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
score: 7.5,
},
{
name: "CVSS 3.0 prefix also supported",
vector: "CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
score: 9.8,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := parseCVSSScore(tt.vector)
assert.InDelta(t, tt.score, got, 0.1,
"vector=%s expected=%.1f got=%.1f", tt.vector, tt.score, got)
})
}
}
func TestCVSSInvalidVectors(t *testing.T) {
assert.Equal(t, 0.0, parseCVSSScore(""))
assert.Equal(t, 0.0, parseCVSSScore("not-a-vector"))
assert.Equal(t, 0.0, parseCVSSScore("CVSS:2.0/AV:N"))
assert.Equal(t, 0.0, parseCVSSScore("CVSS:3.1/AV:N"))
assert.Equal(t, 0.0, parseCVSSScore("CVSS:3.1/AV:X/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"))
}
func TestCVSSRoundUp(t *testing.T) {
assert.Equal(t, 4.1, cvssRoundUp(4.02))
assert.Equal(t, 4.0, cvssRoundUp(4.0))
assert.Equal(t, 0.0, cvssRoundUp(0.0))
assert.Equal(t, 10.0, cvssRoundUp(10.0))
}
func TestScoreToSeverity(t *testing.T) {
assert.Equal(t, types.SeverityCritical, scoreToSeverity(9.8))
assert.Equal(t, types.SeverityCritical, scoreToSeverity(9.0))
assert.Equal(t, types.SeverityHigh, scoreToSeverity(8.9))
assert.Equal(t, types.SeverityHigh, scoreToSeverity(7.0))
assert.Equal(t, types.SeverityMedium, scoreToSeverity(6.9))
assert.Equal(t, types.SeverityMedium, scoreToSeverity(4.0))
assert.Equal(t, types.SeverityLow, scoreToSeverity(3.9))
assert.Equal(t, types.SeverityLow, scoreToSeverity(0.1))
assert.Equal(t, types.SeverityNone, scoreToSeverity(0.0))
}