-
Notifications
You must be signed in to change notification settings - Fork 90
/
vuln.go
80 lines (70 loc) · 2.42 KB
/
vuln.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// Copyright (c) Facebook, Inc. and its affiliates.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package cvefeed
import (
"github.com/facebookincubator/nvdtools/wfn"
)
// Vuln is a vulnerability interface
type Vuln interface {
// vulnerability should also be able to match attributes
wfn.Matcher
// ID returns the vulnerability ID
ID() string
// CVEs returns all CVEs it includes/references
CVEs() []string
// CWEs returns all CWEs for this vulnerability
CWEs() []string
// CVSSv2BaseScore returns CVSS v2 base score
CVSSv2BaseScore() float64
// CVSSv2BaseScore returns CVSS v2 vector
CVSSv2Vector() string
// CVSSv2BaseScore returns CVSS v3 base score
CVSSv3BaseScore() float64
// CVSSv2BaseScore returns CVSS v3 vector
CVSSv3Vector() string
}
// MergeVuln combines two Vulns:
// resulted Vuln inherits all mutually exclusive methods (e.g. ID()) from Vuln x;
// functions returning CVEs and CWEs return distinct(union(x,y))
// the returned vuln matches attributes if x matches AND y doesn't
func OverrideVuln(v, override Vuln) Vuln {
return &overriden{
Vuln: v,
matcher: &andMatcher{v, wfn.DontMatch(override)},
}
}
type overriden struct {
Vuln
matcher wfn.Matcher
}
// Match is a part of the wfn.Matcher interface
func (v *overriden) Match(attrs []*wfn.Attributes, requireVersion bool) []*wfn.Attributes {
return v.matcher.Match(attrs, requireVersion)
}
// Attrs is a part of the wfn.Matcher interface
func (v *overriden) Config() []*wfn.Attributes {
return v.matcher.Config()
}
// matches are the ones matched by both
type andMatcher struct {
m1, m2 wfn.Matcher
}
// Match is a part of the wfn.Matcher interface
func (m *andMatcher) Match(attrs []*wfn.Attributes, requireVersion bool) []*wfn.Attributes {
return m.m2.Match(m.m1.Match(attrs, requireVersion), requireVersion)
}
// Attrs is a part of the wfn.Matcher interface
func (m *andMatcher) Config() []*wfn.Attributes {
return append(m.m1.Config(), m.m2.Config()...)
}