From 8b2fecb033ac61bbf852241fd7c8f73c530599a5 Mon Sep 17 00:00:00 2001 From: Christian Zunker Date: Fri, 1 Dec 2023 15:17:43 +0100 Subject: [PATCH] Fixes to support packages list at the end of a scan Signed-off-by: Christian Zunker --- providers-sdk/v1/upstream/gql/conversion.go | 87 +++++++++++++++++ providers-sdk/v1/upstream/gql/vulnmgmt_gql.go | 97 ++++++++++++++----- providers-sdk/v1/upstream/mvd/mvd.pb.go | 4 +- providers-sdk/v1/upstream/mvd/mvd.proto | 2 +- providers/os/resources/vulnmgmt.go | 3 +- 5 files changed, 164 insertions(+), 29 deletions(-) create mode 100644 providers-sdk/v1/upstream/gql/conversion.go diff --git a/providers-sdk/v1/upstream/gql/conversion.go b/providers-sdk/v1/upstream/gql/conversion.go new file mode 100644 index 0000000000..ef5b6cf086 --- /dev/null +++ b/providers-sdk/v1/upstream/gql/conversion.go @@ -0,0 +1,87 @@ +package gql + +import "go.mondoo.com/cnquery/v9/providers-sdk/v1/upstream/mvd" + +func ConvertToMvdVulnReport(vulnReport *VulnReport) *mvd.VulnReport { + if vulnReport == nil { + return nil + } + mvdVulnReport := &mvd.VulnReport{ + Stats: &mvd.ReportStats{}, + } + mvdVulnReport.Advisories = make([]*mvd.Advisory, len(vulnReport.Advisories)) + for i, advisory := range vulnReport.Advisories { + mvdAdvisory := &mvd.Advisory{ + ID: advisory.Id, + Title: advisory.Title, + Description: advisory.Description, + Fixed: []*mvd.Package{}, + Affected: []*mvd.Package{}, + Score: int32(advisory.CvssScore.Value), + } + for _, fixed := range advisory.FixedByPackages { + mvdAdvisory.Fixed = append(mvdAdvisory.Fixed, &mvd.Package{ + Name: fixed.Name, + Version: fixed.Version, + Available: fixed.Available, + }) + } + for _, affected := range advisory.AffectedPackages { + mvdAdvisory.Affected = append(mvdAdvisory.Affected, &mvd.Package{ + Name: affected.Name, + Version: affected.Version, + Available: affected.Available, + Affected: true, + Score: int32(affected.Score.Value), + }) + } + mvdVulnReport.Advisories[i] = mvdAdvisory + } + mvdVulnReport.Packages = make([]*mvd.Package, len(vulnReport.Packages)) + for i, pkg := range vulnReport.Packages { + mvdVulnReport.Packages[i] = &mvd.Package{ + Name: pkg.Name, + Version: pkg.Version, + Available: pkg.Available, + Affected: true, + Score: int32(pkg.Score.Value), + } + } + + if vulnReport.Stats != nil { + mvdVulnReport.Stats = &mvd.ReportStats{ + Score: int32(vulnReport.Stats.Score.Value), + Advisories: &mvd.ReportStatsAdvisories{ + Total: int32(vulnReport.Stats.Advisories.Total), + Critical: int32(vulnReport.Stats.Advisories.Critical), + High: int32(vulnReport.Stats.Advisories.High), + Medium: int32(vulnReport.Stats.Advisories.Medium), + Low: int32(vulnReport.Stats.Advisories.Low), + None: int32(vulnReport.Stats.Advisories.None), + Unknown: int32(vulnReport.Stats.Advisories.Unknown), + }, + Cves: &mvd.ReportStatsCves{ + Total: int32(vulnReport.Stats.Cves.Total), + Critical: int32(vulnReport.Stats.Cves.Critical), + High: int32(vulnReport.Stats.Cves.High), + Medium: int32(vulnReport.Stats.Cves.Medium), + Low: int32(vulnReport.Stats.Cves.Low), + None: int32(vulnReport.Stats.Cves.None), + Unknown: int32(vulnReport.Stats.Cves.Unknown), + }, + Packages: &mvd.ReportStatsPackages{ + Total: int32(vulnReport.Stats.Packages.Total), + Affected: int32(vulnReport.Stats.Packages.Affected), + Critical: int32(vulnReport.Stats.Packages.Critical), + High: int32(vulnReport.Stats.Packages.High), + Medium: int32(vulnReport.Stats.Packages.Medium), + Low: int32(vulnReport.Stats.Packages.Low), + None: int32(vulnReport.Stats.Packages.None), + Unknown: int32(vulnReport.Stats.Packages.Unknown), + }, + Exploits: &mvd.ReportStatsExploits{}, + } + } + + return mvdVulnReport +} diff --git a/providers-sdk/v1/upstream/gql/vulnmgmt_gql.go b/providers-sdk/v1/upstream/gql/vulnmgmt_gql.go index 635fe14861..a60798a8b6 100644 --- a/providers-sdk/v1/upstream/gql/vulnmgmt_gql.go +++ b/providers-sdk/v1/upstream/gql/vulnmgmt_gql.go @@ -26,6 +26,48 @@ type VulnReport struct { Advisories []*Advisory Cves []*Cve Packages []*Package + Stats *ReportStats +} + +type ReportStats struct { + Score struct { + Id string + Value int + Type int + Vector string + Source string + } + Cves struct { + Total int + Critical int + High int + Medium int + Low int + None int + Unknown int + } + Packages struct { + Total int + Affected int + Critical int + High int + Medium int + Low int + None int + Unknown int + } + Advisories struct { + Total int + Critical int + High int + Medium int + Low int + None int + Unknown int + } + Exploits struct { + Total int + } } type Cve struct { @@ -79,9 +121,15 @@ type Advisory struct { Vector string Source string } - Vendorscore int - PublishedAt string - ModifiedAt string + Vendorscore int + PublishedAt string + ModifiedAt string + AffectedPackages []struct { + Package + } + FixedByPackages []struct { + Package + } } type Package struct { @@ -104,17 +152,10 @@ type Package struct { Vector string Source string } - - Advisories []struct { - Advisory - } - Cves []struct { - Cve - } } -// GetVulnReport fetches the vuln report for a given asset -func (c *MondooClient) GetVulnReport(mrn string) (*VulnReport, error) { +// GetVulnCompactReport fetches the compact vuln report for a given asset +func (c *MondooClient) GetVulnCompactReport(mrn string) (*VulnReport, error) { var m struct { AssetVulnerabilityReportResponse struct { AssetVulnerabilityCompactReport struct { @@ -128,6 +169,7 @@ func (c *MondooClient) GetVulnReport(mrn string) (*VulnReport, error) { Packages []struct { Package } + Stats ReportStats } `graphql:"... on AssetVulnerabilityCompactReport"` } `graphql:"assetVulnerabilityCompactReport(input: $input)"` } @@ -141,18 +183,22 @@ func (c *MondooClient) GetVulnReport(mrn string) (*VulnReport, error) { Advisories: make([]*Advisory, len(m.AssetVulnerabilityReportResponse.AssetVulnerabilityCompactReport.Advisories)), Cves: make([]*Cve, len(m.AssetVulnerabilityReportResponse.AssetVulnerabilityCompactReport.Cves)), Packages: make([]*Package, len(m.AssetVulnerabilityReportResponse.AssetVulnerabilityCompactReport.Packages)), + Stats: &m.AssetVulnerabilityReportResponse.AssetVulnerabilityCompactReport.Stats, } - for i, a := range m.AssetVulnerabilityReportResponse.AssetVulnerabilityCompactReport.Advisories { - gqlVulnReport.Advisories[i] = &a.Advisory + for i := range m.AssetVulnerabilityReportResponse.AssetVulnerabilityCompactReport.Advisories { + advisory := m.AssetVulnerabilityReportResponse.AssetVulnerabilityCompactReport.Advisories[i].Advisory + gqlVulnReport.Advisories[i] = &advisory } - for i, c := range m.AssetVulnerabilityReportResponse.AssetVulnerabilityCompactReport.Cves { - gqlVulnReport.Cves[i] = &c.Cve + for i := range m.AssetVulnerabilityReportResponse.AssetVulnerabilityCompactReport.Cves { + cve := m.AssetVulnerabilityReportResponse.AssetVulnerabilityCompactReport.Cves[i].Cve + gqlVulnReport.Cves[i] = &cve } - for i, p := range m.AssetVulnerabilityReportResponse.AssetVulnerabilityCompactReport.Packages { - gqlVulnReport.Packages[i] = &p.Package + for i := range m.AssetVulnerabilityReportResponse.AssetVulnerabilityCompactReport.Packages { + pkg := m.AssetVulnerabilityReportResponse.AssetVulnerabilityCompactReport.Packages[i].Package + gqlVulnReport.Packages[i] = &pkg } return gqlVulnReport, nil @@ -192,16 +238,19 @@ func (c *MondooClient) GetIncognitoVulnReport(platform mondoogql.PlatformInput, Packages: make([]*Package, len(m.AssetVulnerabilityReportResponse.AssetIncognitoVulnerabilityReport.Packages)), } - for i, a := range m.AssetVulnerabilityReportResponse.AssetIncognitoVulnerabilityReport.Advisories { - gqlVulnReport.Advisories[i] = &a.Advisory + for i := range m.AssetVulnerabilityReportResponse.AssetIncognitoVulnerabilityReport.Advisories { + advisory := m.AssetVulnerabilityReportResponse.AssetIncognitoVulnerabilityReport.Advisories[i].Advisory + gqlVulnReport.Advisories[i] = &advisory } - for i, c := range m.AssetVulnerabilityReportResponse.AssetIncognitoVulnerabilityReport.Cves { - gqlVulnReport.Cves[i] = &c.Cve + for i := range m.AssetVulnerabilityReportResponse.AssetIncognitoVulnerabilityReport.Cves { + cve := m.AssetVulnerabilityReportResponse.AssetIncognitoVulnerabilityReport.Cves[i].Cve + gqlVulnReport.Cves[i] = &cve } - for i, p := range m.AssetVulnerabilityReportResponse.AssetIncognitoVulnerabilityReport.Packages { - gqlVulnReport.Packages[i] = &p.Package + for i := range m.AssetVulnerabilityReportResponse.AssetIncognitoVulnerabilityReport.Packages { + pkg := m.AssetVulnerabilityReportResponse.AssetIncognitoVulnerabilityReport.Packages[i].Package + gqlVulnReport.Packages[i] = &pkg } return gqlVulnReport, nil diff --git a/providers-sdk/v1/upstream/mvd/mvd.pb.go b/providers-sdk/v1/upstream/mvd/mvd.pb.go index 0eff85efd7..f854c57cd4 100644 --- a/providers-sdk/v1/upstream/mvd/mvd.pb.go +++ b/providers-sdk/v1/upstream/mvd/mvd.pb.go @@ -1754,11 +1754,11 @@ var file_mvd_proto_rawDesc = []byte{ 0x6d, 0x6f, 0x6e, 0x64, 0x6f, 0x6f, 0x2e, 0x6d, 0x76, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x1a, 0x1e, 0x2e, 0x6d, 0x6f, 0x6e, 0x64, 0x6f, 0x6f, 0x2e, 0x6d, 0x76, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x45, - 0x6f, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x3d, 0x5a, 0x3b, 0x67, 0x6f, 0x2e, 0x6d, 0x6f, 0x6e, + 0x6f, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x3c, 0x5a, 0x3a, 0x67, 0x6f, 0x2e, 0x6d, 0x6f, 0x6e, 0x64, 0x6f, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2f, 0x76, 0x39, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2f, 0x6d, 0x76, 0x64, - 0x65, 0x2f, 0x6d, 0x76, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2f, 0x6d, 0x76, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/providers-sdk/v1/upstream/mvd/mvd.proto b/providers-sdk/v1/upstream/mvd/mvd.proto index 8283b9b3be..67210a573c 100644 --- a/providers-sdk/v1/upstream/mvd/mvd.proto +++ b/providers-sdk/v1/upstream/mvd/mvd.proto @@ -8,7 +8,7 @@ package mondoo.mvd.v1; import "cvss/cvss.proto"; option go_package = - "go.mondoo.com/cnquery/v9/providers-sdk/v1/upstream/mvde/mvd"; + "go.mondoo.com/cnquery/v9/providers-sdk/v1/upstream/mvd/mvd"; message Platform { string name = 1; diff --git a/providers/os/resources/vulnmgmt.go b/providers/os/resources/vulnmgmt.go index e67cc6675d..1de5a1acf0 100644 --- a/providers/os/resources/vulnmgmt.go +++ b/providers/os/resources/vulnmgmt.go @@ -170,8 +170,7 @@ func (v *mqlVulnmgmt) getReport() (*gql.VulnReport, error) { log.Debug().Msg("no asset mrn available") return v.getIncognitoReport(mondooClient) } - // gqlVulnReport, err := GetVulnReport("//assets.api.mondoo.app/spaces/test-infallible-taussig-796596/assets/2YTpHJnJXnfmuBtQde2HQgWqX1n") - gqlVulnReport, err := mondooClient.GetVulnReport(v.MqlRuntime.Upstream.AssetMrn) + gqlVulnReport, err := mondooClient.GetVulnCompactReport(v.MqlRuntime.Upstream.AssetMrn) if err != nil { return nil, err }