Skip to content

Commit 125c68b

Browse files
committed
feat(cvss): add CVSS v4.0 support, fix CVSS v2.0 invalid calculator link
Signed-off-by: Lucas TESSON <[email protected]>
1 parent 9968832 commit 125c68b

File tree

3 files changed

+41
-20
lines changed

3 files changed

+41
-20
lines changed

go.mod

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ require (
88
github.com/blang/semver/v4 v4.0.0
99
github.com/cheggaaa/pb/v3 v3.1.6
1010
github.com/go-git/go-git/v5 v5.13.2
11-
github.com/goark/go-cvss v1.6.7
1211
github.com/golang/protobuf v1.5.4
1312
github.com/google/go-containerregistry v0.20.3
1413
github.com/google/go-github/v60 v60.0.0
@@ -20,6 +19,7 @@ require (
2019
github.com/mitchellh/mapstructure v1.5.0
2120
github.com/nozzle/throttler v0.0.0-20180817012639-2ea982251481
2221
github.com/olekukonko/tablewriter v0.0.5
22+
github.com/pandatix/go-cvss v0.6.2
2323
github.com/psampaz/go-mod-outdated v0.9.0
2424
github.com/saschagrunert/go-modiff v1.3.5
2525
github.com/sendgrid/rest v2.6.9+incompatible
@@ -167,7 +167,6 @@ require (
167167
github.com/go-openapi/swag v0.23.0 // indirect
168168
github.com/go-openapi/validate v0.24.0 // indirect
169169
github.com/go-piv/piv-go v1.11.0 // indirect
170-
github.com/goark/errs v1.3.2 // indirect
171170
github.com/gobwas/glob v0.2.3 // indirect
172171
github.com/gogo/protobuf v1.3.2 // indirect
173172
github.com/golang-jwt/jwt/v4 v4.5.1 // indirect

go.sum

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -415,10 +415,6 @@ github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1v
415415
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
416416
github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U=
417417
github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE=
418-
github.com/goark/errs v1.3.2 h1:ifccNe1aK7Xezt4XVYwHUqalmnfhuphnEvh3FshCReQ=
419-
github.com/goark/errs v1.3.2/go.mod h1:ZsQucxaDFVfSB8I99j4bxkDRfNOrlKINwg72QMuRWKw=
420-
github.com/goark/go-cvss v1.6.7 h1:9R/cx8+lv17uFS1RKYNmEfYqEJwWgF26F4g7hK38jEw=
421-
github.com/goark/go-cvss v1.6.7/go.mod h1:qsmYCGTQnQqW/Lq1Z3lRCEarKD++nx7C+KgsG05MhDA=
422418
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
423419
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
424420
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
@@ -707,6 +703,8 @@ github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+
707703
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
708704
github.com/package-url/packageurl-go v0.1.2 h1:0H2DQt6DHd/NeRlVwW4EZ4oEI6Bn40XlNPRqegcxuo4=
709705
github.com/package-url/packageurl-go v0.1.2/go.mod h1:uQd4a7Rh3ZsVg5j0lNyAfyxIeGde9yrlhjF78GzeW0c=
706+
github.com/pandatix/go-cvss v0.6.2 h1:TFiHlzUkT67s6UkelHmK6s1INKVUG7nlKYiWWDTITGI=
707+
github.com/pandatix/go-cvss v0.6.2/go.mod h1:jDXYlQBZrc8nvrMUVVvTG8PhmuShOnKrxP53nOFkt8Q=
710708
github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw=
711709
github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
712710
github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=

pkg/cve/cve.go

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,12 @@ import (
2020
"errors"
2121
"fmt"
2222
"regexp"
23+
"strings"
2324

24-
cvss "github.com/goark/go-cvss/v3/metric"
25+
gocvss20 "github.com/pandatix/go-cvss/20"
26+
gocvss30 "github.com/pandatix/go-cvss/30"
27+
gocvss31 "github.com/pandatix/go-cvss/31"
28+
gocvss40 "github.com/pandatix/go-cvss/40"
2529
)
2630

2731
// CVE Information of a linked CVE vulnerability.
@@ -100,22 +104,42 @@ func (cve *CVE) Validate() (err error) {
100104
return errors.New("string CVSS vector missing from CVE data")
101105
}
102106

103-
var bm cvss.Metrics
104-
// Parse the vector string to make sure it is well formed
105-
if len(cve.CVSSVector) == 44 {
106-
bm, err = cvss.NewBase().Decode(cve.CVSSVector)
107-
} else {
108-
bm, err = cvss.NewTemporal().Decode(cve.CVSSVector)
109-
}
107+
switch {
108+
default: // CVSS v2.0 has no prefix
109+
_, err := gocvss20.ParseVector(cve.CVSSVector)
110+
if err != nil {
111+
return fmt.Errorf("parsing CVSS vector string: %w", err)
112+
}
113+
// FIRST ORG has no calculator for CVSS v2.0
110114

111-
if err != nil {
112-
return fmt.Errorf("parsing CVSS vector string: %w", err)
115+
case strings.HasPrefix(cve.CVSSVector, "CVSS:3.0"):
116+
_, err := gocvss30.ParseVector(cve.CVSSVector)
117+
if err != nil {
118+
return fmt.Errorf("parsing CVSS vector string: %w", err)
119+
}
120+
cve.CalcLink = fmt.Sprintf(
121+
"https://www.first.org/cvss/calculator/3.0#%s", cve.CVSSVector,
122+
)
123+
124+
case strings.HasPrefix(cve.CVSSVector, "CVSS:3.1"):
125+
_, err := gocvss31.ParseVector(cve.CVSSVector)
126+
if err != nil {
127+
return fmt.Errorf("parsing CVSS vector string: %w", err)
128+
}
129+
cve.CalcLink = fmt.Sprintf(
130+
"https://www.first.org/cvss/calculator/3.1#%s", cve.CVSSVector,
131+
)
132+
133+
case strings.HasPrefix(cve.CVSSVector, "CVSS:4.0"):
134+
_, err := gocvss40.ParseVector(cve.CVSSVector)
135+
if err != nil {
136+
return fmt.Errorf("parsing CVSS vector string: %w", err)
137+
}
138+
cve.CalcLink = fmt.Sprintf(
139+
"https://www.first.org/cvss/calculator/4.0#%s", cve.CVSSVector,
140+
)
113141
}
114142

115-
cve.CalcLink = fmt.Sprintf(
116-
"https://www.first.org/cvss/calculator/%s#%s", bm.BaseMetrics().Ver.String(), cve.CVSSVector,
117-
)
118-
119143
if cve.CVSSScore == 0 {
120144
return errors.New("missing CVSS score from CVE data")
121145
}

0 commit comments

Comments
 (0)