cvss2/environmental_metrics.go (212 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 cvss2 import "fmt" type EnvironmentalMetrics struct { CollateralDamagePotential TargetDistribution ConfidentialityRequirement IntegrityRequirement AvailabilityRequirement ModifiedExploitablity ModifiedRemediationLevel ModifiedReportConfidence } type CollateralDamagePotential int const ( CollateralDamagePotentialNotDefined CollateralDamagePotential = iota CollateralDamagePotentialNone CollateralDamagePotentialLow CollateralDamagePotentialLowMedium CollateralDamagePotentialMediumHigh CollateralDamagePotentialHigh ) var ( weightsCollateralDamagePotential = []float64{0, 0, 0.1, 0.3, 0.4, 0.5} codeCollateralDamagePotential = []string{"ND", "N", "L", "LM", "MH", "H"} ) func (cdp CollateralDamagePotential) defined() bool { return cdp != CollateralDamagePotentialNotDefined } func (cdp CollateralDamagePotential) weight() float64 { return weightsCollateralDamagePotential[cdp] } func (cdp CollateralDamagePotential) String() string { return codeCollateralDamagePotential[cdp] } func (cdp *CollateralDamagePotential) parse(str string) error { idx, found := findIndex(str, codeCollateralDamagePotential) if found { *cdp = CollateralDamagePotential(idx) return nil } return fmt.Errorf("illegal collateral damage potential code %s", str) } type TargetDistribution int const ( TargetDistributionNotDefined TargetDistribution = iota TargetDistributionNone TargetDistributionLow TargetDistributionMedium TargetDistributionHigh ) var ( weightsTargetDistribution = []float64{1, 0, 0.25, 0.75, 1.0} codeTargetDistribution = []string{"ND", "N", "L", "M", "H"} ) func (td TargetDistribution) defined() bool { return td != TargetDistributionNotDefined } func (td TargetDistribution) weight() float64 { return weightsTargetDistribution[td] } func (td TargetDistribution) String() string { return codeTargetDistribution[td] } func (td *TargetDistribution) parse(str string) error { idx, found := findIndex(str, codeTargetDistribution) if found { *td = TargetDistribution(idx) return nil } return fmt.Errorf("illegal target distribution code %s", str) } type ConfidentialityRequirement int const ( ConfidentialityRequirementNotdefined ConfidentialityRequirement = iota ConfidentialityRequirementLow ConfidentialityRequirementMedium ConfidentialityRequirementHigh ) var ( weightsConfidentialityRequirement = []float64{1.0, 0.5, 1.0, 1.51} codeConfidentialityRequirement = []string{"ND", "L", "M", "H"} ) func (cr ConfidentialityRequirement) defined() bool { return cr != ConfidentialityRequirementNotdefined } func (cr ConfidentialityRequirement) weight() float64 { return weightsConfidentialityRequirement[cr] } func (cr ConfidentialityRequirement) String() string { return codeConfidentialityRequirement[cr] } func (cr *ConfidentialityRequirement) parse(str string) error { idx, found := findIndex(str, codeConfidentialityRequirement) if found { *cr = ConfidentialityRequirement(idx) return nil } return fmt.Errorf("illegal confidentiality requirement code %s", str) } type IntegrityRequirement int const ( IntegrityRequirementNotdefined IntegrityRequirement = iota IntegrityRequirementLow IntegrityRequirementMedium IntegrityRequirementHigh ) var ( weightsIntegrityRequirement = []float64{1.0, 0.5, 1.0, 1.51} codeIntegrityRequirement = []string{"ND", "L", "M", "H"} ) func (ir IntegrityRequirement) defined() bool { return ir != IntegrityRequirementNotdefined } func (ir IntegrityRequirement) weight() float64 { return weightsIntegrityRequirement[ir] } func (ir IntegrityRequirement) String() string { return codeIntegrityRequirement[ir] } func (ir *IntegrityRequirement) parse(str string) error { idx, found := findIndex(str, codeIntegrityRequirement) if found { *ir = IntegrityRequirement(idx) return nil } return fmt.Errorf("illegal integrity requirement code %s", str) } type AvailabilityRequirement int const ( AvailabilityRequirementNotdefined AvailabilityRequirement = iota AvailabilityRequirementLow AvailabilityRequirementMedium AvailabilityRequirementHigh ) var ( weightsAvailabilityRequirement = []float64{1.0, 0.5, 1.0, 1.51} codeAvailabilityRequirement = []string{"ND", "L", "M", "H"} ) func (ar AvailabilityRequirement) defined() bool { return ar != AvailabilityRequirementNotdefined } func (ar AvailabilityRequirement) weight() float64 { return weightsAvailabilityRequirement[ar] } func (ar AvailabilityRequirement) String() string { return codeAvailabilityRequirement[ar] } func (ar *AvailabilityRequirement) parse(str string) error { idx, found := findIndex(str, codeAvailabilityRequirement) if found { *ar = AvailabilityRequirement(idx) return nil } return fmt.Errorf("illegal availability requirement code %s", str) } /* EXTENDED FUNCTIONALITY The following metrics extend the CVSS Specification by allowing Temporal metrics to be modified in the Environmental Score. If not used they will not be serialized allowing backwards compatibility. */ /******** MODIFIED EXPLOITABILITY (ME) ********/ type ModifiedExploitablity Exploitablity func (mecm ModifiedExploitablity) defined() bool { return Exploitablity(mecm).defined() } func (mecm ModifiedExploitablity) weight() float64 { if !mecm.defined() { return 1.00 } return Exploitablity(mecm).weight() } func (mecm ModifiedExploitablity) String() string { return Exploitablity(mecm).String() } func (mecm *ModifiedExploitablity) parse(str string) error { a := Exploitablity(*mecm) err := a.parse(str) *mecm = ModifiedExploitablity(a) return err } /******** MODIFIED REMEDIATION LEVEL (MRL) ********/ type ModifiedRemediationLevel RemediationLevel func (mrl ModifiedRemediationLevel) defined() bool { return RemediationLevel(mrl).defined() } func (mrl ModifiedRemediationLevel) weight() float64 { if !mrl.defined() { return 1.00 } return RemediationLevel(mrl).weight() } func (mrl ModifiedRemediationLevel) String() string { return RemediationLevel(mrl).String() } func (mrl *ModifiedRemediationLevel) parse(str string) error { a := RemediationLevel(*mrl) err := a.parse(str) *mrl = ModifiedRemediationLevel(a) return err } /******** MODIFIED REPORT CONFIDENCE LEVEL (MRC) ********/ type ModifiedReportConfidence ReportConfidence func (mrc ModifiedReportConfidence) defined() bool { return ReportConfidence(mrc).defined() } func (mrc ModifiedReportConfidence) weight() float64 { if !mrc.defined() { return 1.00 } return ReportConfidence(mrc).weight() } func (mrc ModifiedReportConfidence) String() string { return ReportConfidence(mrc).String() } func (mrc *ModifiedReportConfidence) parse(str string) error { a := ReportConfidence(*mrc) err := a.parse(str) *mrc = ModifiedReportConfidence(a) return err }