Support Debian
This commit is contained in:
@@ -25,6 +25,7 @@ import (
|
||||
"github.com/future-architect/vuls/config"
|
||||
"github.com/future-architect/vuls/cveapi"
|
||||
cve "github.com/kotakanbe/go-cve-dictionary/models"
|
||||
goval "github.com/kotakanbe/goval-dictionary/models"
|
||||
)
|
||||
|
||||
// ScanHistory is the history of Scanning.
|
||||
@@ -67,9 +68,9 @@ type ScanResult struct {
|
||||
// Scanned Vulns via SSH + CPE Vulns
|
||||
ScannedCves []VulnInfo
|
||||
|
||||
KnownCves []CveInfo
|
||||
UnknownCves []CveInfo
|
||||
IgnoredCves []CveInfo
|
||||
KnownCves CveInfos
|
||||
UnknownCves CveInfos
|
||||
IgnoredCves CveInfos
|
||||
|
||||
Packages PackageInfoList
|
||||
|
||||
@@ -92,7 +93,7 @@ func (r ScanResult) FillCveDetail() (*ScanResult, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
known, unknown, ignored := CveInfos{}, CveInfos{}, CveInfos{}
|
||||
r.IgnoredCves = CveInfos{}
|
||||
for _, d := range ds {
|
||||
cinfo := CveInfo{
|
||||
CveDetail: d,
|
||||
@@ -104,7 +105,7 @@ func (r ScanResult) FillCveDetail() (*ScanResult, error) {
|
||||
found := false
|
||||
for _, icve := range config.Conf.Servers[r.ServerName].IgnoreCves {
|
||||
if icve == d.CveID {
|
||||
ignored = append(ignored, cinfo)
|
||||
r.IgnoredCves.Insert(cinfo)
|
||||
found = true
|
||||
break
|
||||
}
|
||||
@@ -113,29 +114,45 @@ func (r ScanResult) FillCveDetail() (*ScanResult, error) {
|
||||
continue
|
||||
}
|
||||
|
||||
// Update known if KnownCves already have cinfo
|
||||
if c, ok := r.KnownCves.Get(cinfo.CveID); ok {
|
||||
c.CveDetail = d
|
||||
r.KnownCves.Update(c)
|
||||
continue
|
||||
}
|
||||
|
||||
// Update unknown if UnknownCves already have cinfo
|
||||
if c, ok := r.UnknownCves.Get(cinfo.CveID); ok {
|
||||
c.CveDetail = d
|
||||
r.UnknownCves.Update(c)
|
||||
continue
|
||||
}
|
||||
|
||||
// unknown
|
||||
if d.CvssScore(config.Conf.Lang) <= 0 {
|
||||
unknown = append(unknown, cinfo)
|
||||
r.UnknownCves.Insert(cinfo)
|
||||
continue
|
||||
}
|
||||
|
||||
// known
|
||||
known = append(known, cinfo)
|
||||
r.KnownCves.Insert(cinfo)
|
||||
}
|
||||
sort.Sort(known)
|
||||
sort.Sort(unknown)
|
||||
sort.Sort(ignored)
|
||||
r.KnownCves = known
|
||||
r.UnknownCves = unknown
|
||||
r.IgnoredCves = ignored
|
||||
sort.Sort(r.KnownCves)
|
||||
sort.Sort(r.UnknownCves)
|
||||
sort.Sort(r.IgnoredCves)
|
||||
return &r, nil
|
||||
}
|
||||
|
||||
// FilterByCvssOver is filter function.
|
||||
func (r ScanResult) FilterByCvssOver() ScanResult {
|
||||
cveInfos := []CveInfo{}
|
||||
// TODO: Set correct default value
|
||||
if config.Conf.CvssScoreOver == 0 {
|
||||
config.Conf.CvssScoreOver = -1.1
|
||||
}
|
||||
|
||||
for _, cveInfo := range r.KnownCves {
|
||||
if config.Conf.CvssScoreOver < cveInfo.CveDetail.CvssScore(config.Conf.Lang) {
|
||||
if config.Conf.CvssScoreOver <= cveInfo.CveDetail.CvssScore(config.Conf.Lang) {
|
||||
cveInfos = append(cveInfos, cveInfo)
|
||||
}
|
||||
}
|
||||
@@ -260,6 +277,9 @@ const (
|
||||
// PkgAuditMatchStr is a String representation of PkgAuditMatch
|
||||
PkgAuditMatchStr = "PkgAuditMatch"
|
||||
|
||||
// OvalMatchStr is a String representation of OvalMatch
|
||||
OvalMatchStr = "OvalMatch"
|
||||
|
||||
// ChangelogExactMatchStr is a String representation of ChangelogExactMatch
|
||||
ChangelogExactMatchStr = "ChangelogExactMatch"
|
||||
|
||||
@@ -282,6 +302,9 @@ var YumUpdateSecurityMatch = Confidence{100, YumUpdateSecurityMatchStr}
|
||||
// PkgAuditMatch is a ranking how confident the CVE-ID was deteted correctly
|
||||
var PkgAuditMatch = Confidence{100, PkgAuditMatchStr}
|
||||
|
||||
// OvalMatch is a ranking how confident the CVE-ID was deteted correctly
|
||||
var OvalMatch = Confidence{100, OvalMatchStr}
|
||||
|
||||
// ChangelogExactMatch is a ranking how confident the CVE-ID was deteted correctly
|
||||
var ChangelogExactMatch = Confidence{95, ChangelogExactMatchStr}
|
||||
|
||||
@@ -368,9 +391,50 @@ func (c CveInfos) Less(i, j int) bool {
|
||||
return c[j].CveDetail.CvssScore(lang) < c[i].CveDetail.CvssScore(lang)
|
||||
}
|
||||
|
||||
func (c CveInfos) Get(cveID string) (CveInfo, bool) {
|
||||
for _, cve := range c {
|
||||
if cve.VulnInfo.CveID == cveID {
|
||||
return cve, true
|
||||
}
|
||||
}
|
||||
return CveInfo{}, false
|
||||
}
|
||||
|
||||
func (c *CveInfos) Delete(cveID string) {
|
||||
cveInfos := *c
|
||||
for i, cve := range cveInfos {
|
||||
if cve.VulnInfo.CveID == cveID {
|
||||
*c = append(cveInfos[:i], cveInfos[i+1:]...)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (c *CveInfos) Insert(cveInfo CveInfo) {
|
||||
*c = append(*c, cveInfo)
|
||||
}
|
||||
|
||||
func (c CveInfos) Update(cveInfo CveInfo) (ok bool) {
|
||||
for i, cve := range c {
|
||||
if cve.VulnInfo.CveID == cveInfo.VulnInfo.CveID {
|
||||
c[i] = cveInfo
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (c *CveInfos) Upsert(cveInfo CveInfo) {
|
||||
ok := c.Update(cveInfo)
|
||||
if !ok {
|
||||
c.Insert(cveInfo)
|
||||
}
|
||||
}
|
||||
|
||||
// CveInfo has Cve Information.
|
||||
type CveInfo struct {
|
||||
CveDetail cve.CveDetail
|
||||
CveDetail cve.CveDetail
|
||||
OvalDetail goval.Definition
|
||||
VulnInfo
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user