providers/flexera/schema/convert.go (114 lines of code) (raw):

// 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 schema import ( "fmt" nvd "github.com/facebookincubator/nvdtools/cvefeed/nvd/schema" ) const ( cveDataVersion = "4.0" ) // Convert converts advisories to NVD format func (item *Advisory) Convert() (*nvd.NVDCVEFeedJSON10DefCVEItem, error) { if item.Products == nil { return nil, fmt.Errorf("no products associated with advisory") } var cpes []string for _, product := range item.Products { if productCPEs, err := findCPEs(product); err == nil { cpes = append(cpes, productCPEs...) } } if len(cpes) == 0 { return nil, fmt.Errorf("no cpes associated with advisory") } lastModifiedDate, err := convertTime(item.ModifiedDate) if err != nil { return nil, err } publishedDate, err := convertTime(item.Released) if err != nil { return nil, err } return &nvd.NVDCVEFeedJSON10DefCVEItem{ CVE: &nvd.CVEJSON40{ CVEDataMeta: &nvd.CVEJSON40CVEDataMeta{ ID: item.ID(), ASSIGNER: "flexera", }, DataFormat: "MITRE", DataType: "CVE", DataVersion: cveDataVersion, Description: &nvd.CVEJSON40Description{ DescriptionData: []*nvd.CVEJSON40LangString{ {Lang: "en", Value: item.Description}, }, }, References: item.makeReferences(), }, Configurations: makeConfigurations(cpes), Impact: item.makeImpact(), LastModifiedDate: lastModifiedDate, PublishedDate: publishedDate, }, nil } func (item *Advisory) ID() string { return "flexera-" + item.AdvisoryIdentifier } func (item *Advisory) makeReferences() *nvd.CVEJSON40References { var refsData []*nvd.CVEJSON40Reference addRef := func(name, url string) { refsData = append(refsData, &nvd.CVEJSON40Reference{ Name: name, URL: url, }) } if item.References != nil { for _, ref := range item.References { addRef(ref.Description, ref.URL) } } if item.Vulnerabilities != nil { for _, vuln := range item.Vulnerabilities { addRef(vuln.Cve, "") } } return &nvd.CVEJSON40References{ ReferenceData: refsData, } } func makeConfigurations(cpes []string) *nvd.NVDCVEFeedJSON10DefConfigurations { matches := make([]*nvd.NVDCVEFeedJSON10DefCPEMatch, len(cpes)) for i, cpe := range cpes { matches[i] = &nvd.NVDCVEFeedJSON10DefCPEMatch{ Cpe22Uri: cpe, Vulnerable: true, } } return &nvd.NVDCVEFeedJSON10DefConfigurations{ CVEDataVersion: cveDataVersion, Nodes: []*nvd.NVDCVEFeedJSON10DefNode{ &nvd.NVDCVEFeedJSON10DefNode{ CPEMatch: matches, Operator: "OR", }, }, } } func (item *Advisory) makeImpact() *nvd.NVDCVEFeedJSON10DefImpact { var cvssv2 nvd.CVSSV20 if item.CvssInfo != nil { cvssv2.BaseScore = item.CvssInfo.BaseScore cvssv2.VectorString = item.CvssInfo.Vector } var cvssv3 nvd.CVSSV30 if item.Cvss3Info != nil { cvssv3.BaseScore = item.Cvss3Info.BaseScore cvssv3.VectorString = item.Cvss3Info.Vector } return &nvd.NVDCVEFeedJSON10DefImpact{ BaseMetricV2: &nvd.NVDCVEFeedJSON10DefImpactBaseMetricV2{ CVSSV2: &cvssv2, }, BaseMetricV3: &nvd.NVDCVEFeedJSON10DefImpactBaseMetricV3{ CVSSV3: &cvssv3, }, } }