2016-01-19 20:16:45 +00:00
|
|
|
// Copyright 2015 clair authors
|
|
|
|
//
|
|
|
|
// 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.
|
|
|
|
|
2015-12-28 20:03:29 +00:00
|
|
|
package types
|
|
|
|
|
|
|
|
//
|
|
|
|
// import "fmt"
|
|
|
|
//
|
|
|
|
// // CVSSv2 represents the Common Vulnerability Scoring System (CVSS), that assesses the severity of
|
|
|
|
// // vulnerabilities.
|
|
|
|
// // It describes the CVSS score, but also a vector describing the components from which the score
|
|
|
|
// // was calculated. This provides users of the score confidence in its correctness and provides
|
|
|
|
// // insight into the nature of the vulnerability.
|
|
|
|
// //
|
|
|
|
// // Reference: https://nvd.nist.gov/CVSS/Vector-v2.aspx
|
|
|
|
// type CVSSv2 struct {
|
|
|
|
// // Base Vectors
|
|
|
|
// AccessVector CVSSValue
|
|
|
|
// AccessComplexity CVSSValue
|
|
|
|
// Authentication CVSSValue
|
|
|
|
// ConfImpact CVSSValue
|
|
|
|
// IntegImpact CVSSValue
|
|
|
|
// AvailImpact CVSSValue
|
|
|
|
// // Temporal Vectors
|
|
|
|
// Exploitability CVSSValue
|
|
|
|
// RemediationLevel CVSSValue
|
|
|
|
// ReportConfidence CVSSValue
|
|
|
|
// // Environmental Vectors
|
|
|
|
// CollateralDamagePotential CVSSValue
|
|
|
|
// TargetDistribution CVSSValue
|
|
|
|
// SystemConfidentialityRequirement CVSSValue
|
|
|
|
// SystemIntegrityRequirement CVSSValue
|
|
|
|
// SystemAvailabilityRequirement CVSSValue
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// func NewCVSSv2(value string) (*CVSSv2, error) {
|
|
|
|
//
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// // CVSSValue is the comprehensible value for a CVSS metric.
|
|
|
|
// type CVSSValue string
|
|
|
|
//
|
|
|
|
// // Metric acronym + Value abbreviation -> Comprehensible metric value.
|
|
|
|
// var toValue map[string]func(string) (CVSSValue, error)
|
|
|
|
//
|
|
|
|
// func init() {
|
|
|
|
// parsers = make(map[string]func(string) (CVSSValue, error), 14)
|
|
|
|
// toValue["AV"] = av
|
|
|
|
// toValue["AC"] = ac
|
|
|
|
// toValue["Au"] = au
|
|
|
|
// toValue["C"] = cAndIAndA
|
|
|
|
// toValue["I"] = cAndIAndA
|
|
|
|
// toValue["A"] = cAndIAndA
|
|
|
|
// toValue["E"] = e
|
|
|
|
// toValue["RL"] = rl
|
|
|
|
// toValue["RC"] = rc
|
|
|
|
// toValue["CDP"] = cdp
|
|
|
|
// toValue["TD"] = td
|
|
|
|
// toValue["CR"] = crAndIrAndAr
|
|
|
|
// toValue["IR"] = crAndIrAndAr
|
|
|
|
// toValue["AR"] = crAndIrAndAr
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// func av(v string) (CVSSValue, error) {
|
|
|
|
// switch v {
|
|
|
|
// case "L":
|
|
|
|
// return CVSSValue("Local access"), nil
|
|
|
|
// case "A":
|
|
|
|
// return CVSSValue("Adjacent Network"), nil
|
|
|
|
// case "N":
|
|
|
|
// return CVSSValue("Network"), nil
|
|
|
|
// default:
|
|
|
|
// return "", fmt.Errorf("%v is not a valid value for AV", v)
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// func ac(v string) (CVSSValue, error) {
|
|
|
|
// switch v {
|
|
|
|
// case "H":
|
|
|
|
// return CVSSValue("High"), nil
|
|
|
|
// case "M":
|
|
|
|
// return CVSSValue("Medium"), nil
|
|
|
|
// case "L":
|
|
|
|
// return CVSSValue("Low"), nil
|
|
|
|
// default:
|
|
|
|
// return "", fmt.Errorf("%v is not a valid value for AC", v)
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// func au(v string) (CVSSValue, error) {
|
|
|
|
// switch v {
|
|
|
|
// case "N":
|
|
|
|
// return CVSSValue("None required"), nil
|
|
|
|
// case "S":
|
|
|
|
// return CVSSValue("Requires single instance"), nil
|
|
|
|
// case "M":
|
|
|
|
// return CVSSValue("Requires multiple instances"), nil
|
|
|
|
// default:
|
|
|
|
// return "", fmt.Errorf("%v is not a valid value for Au", v)
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// func cAndIAndA(v string) (CVSSValue, error) {
|
|
|
|
// switch v {
|
|
|
|
// case "N":
|
|
|
|
// return CVSSValue("None"), nil
|
|
|
|
// case "P":
|
|
|
|
// return CVSSValue("Partial"), nil
|
|
|
|
// case "C":
|
|
|
|
// return CVSSValue("Complete"), nil
|
|
|
|
// default:
|
|
|
|
// return "", fmt.Errorf("%v is not a valid value for C/I/A", v)
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// func e(v string) (CVSSValue, error) {
|
|
|
|
// switch v {
|
|
|
|
// case "U":
|
|
|
|
// return CVSSValue("Unproven"), nil
|
|
|
|
// case "POC":
|
|
|
|
// return CVSSValue("Proof-of-concept"), nil
|
|
|
|
// case "F":
|
|
|
|
// return CVSSValue("Functional"), nil
|
|
|
|
// case "H":
|
|
|
|
// return CVSSValue("High"), nil
|
|
|
|
// case "ND":
|
|
|
|
// return CVSSValue("Not Defined"), nil
|
|
|
|
// default:
|
|
|
|
// return "", fmt.Errorf("%v is not a valid value for E", v)
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// func rl(v string) (CVSSValue, error) {
|
|
|
|
// switch v {
|
|
|
|
// case "OF":
|
|
|
|
// return CVSSValue("Official-fix"), nil
|
|
|
|
// case "T":
|
|
|
|
// return CVSSValue("Temporary-fix"), nil
|
|
|
|
// case "W":
|
|
|
|
// return CVSSValue("Workaround"), nil
|
|
|
|
// case "U":
|
|
|
|
// return CVSSValue("Unavailable"), nil
|
|
|
|
// case "ND":
|
|
|
|
// return CVSSValue("Not Defined"), nil
|
|
|
|
// default:
|
|
|
|
// return "", fmt.Errorf("%v is not a valid value for RL", v)
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// func rc(v string) (CVSSValue, error) {
|
|
|
|
// switch v {
|
|
|
|
// case "UC":
|
|
|
|
// return CVSSValue("Unconfirmed"), nil
|
|
|
|
// case "UR":
|
|
|
|
// return CVSSValue("Uncorroborated"), nil
|
|
|
|
// case "C":
|
|
|
|
// return CVSSValue("Confirmed"), nil
|
|
|
|
// case "ND":
|
|
|
|
// return CVSSValue("Not Defined"), nil
|
|
|
|
// default:
|
|
|
|
// return "", fmt.Errorf("%v is not a valid value for RC", v)
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// func cdp(v string) (CVSSValue, error) {
|
|
|
|
// switch v {
|
|
|
|
// case "N":
|
|
|
|
// return CVSSValue("None"), nil
|
|
|
|
// case "L":
|
|
|
|
// return CVSSValue("Low"), nil
|
|
|
|
// case "LM":
|
|
|
|
// return CVSSValue("Low-Medium"), nil
|
|
|
|
// case "MH":
|
|
|
|
// return CVSSValue("Medium-High"), nil
|
|
|
|
// case "H":
|
|
|
|
// return CVSSValue("High"), nil
|
|
|
|
// case "ND":
|
|
|
|
// return CVSSValue("Not Defined"), nil
|
|
|
|
// default:
|
|
|
|
// return "", fmt.Errorf("%v is not a valid value for CDP", v)
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// func td(v string) (CVSSValue, error) {
|
|
|
|
// switch v {
|
|
|
|
// case "N":
|
|
|
|
// return CVSSValue("None (0%)"), nil
|
|
|
|
// case "L":
|
|
|
|
// return CVSSValue("Low (1-25%)"), nil
|
|
|
|
// case "M":
|
|
|
|
// return CVSSValue("Medium (26-75%)"), nil
|
|
|
|
// case "H":
|
|
|
|
// return CVSSValue("High (76-100%)"), nil
|
|
|
|
// case "ND":
|
|
|
|
// return CVSSValue("Not Defined"), nil
|
|
|
|
// default:
|
|
|
|
// return "", fmt.Errorf("%v is not a valid value for TD", v)
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// func crAndIrAndAr(v string) (CVSSValue, error) {
|
|
|
|
// switch v {
|
|
|
|
// case "L":
|
|
|
|
// return CVSSValue("Low"), nil
|
|
|
|
// case "M":
|
|
|
|
// return CVSSValue("Medium"), nil
|
|
|
|
// case "H":
|
|
|
|
// return CVSSValue("High"), nil
|
|
|
|
// case "ND":
|
|
|
|
// return CVSSValue("Not Defined"), nil
|
|
|
|
// default:
|
|
|
|
// return "", fmt.Errorf("%v is not a valid value for CR/IR/AR", v)
|
|
|
|
// }
|
|
|
|
// }
|