cvss3/environmental_metrics.go (405 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 cvss3 import "fmt" type EnvironmentalMetrics struct { ConfidentialityRequirement IntegrityRequirement AvailabilityRequirement ModifiedAttackVector ModifiedAttackComplexity ModifiedPrivilegesRequired ModifiedUserInteraction ModifiedScope ModifiedConfidentiality ModifiedIntegrity ModifiedAvailability ModifiedExploitCodeMaturity ModifiedRemediationLevel ModifiedReportConfidence } /******** CONFIDENTIALITY REQUIREMENT (CR) ********/ type ConfidentialityRequirement int const ( ConfidentialityRequirementNotdefined ConfidentialityRequirement = iota ConfidentialityRequirementHigh ConfidentialityRequirementMedium ConfidentialityRequirementLow ) var ( weightsConfidentialityRequirement = []float64{1.0, 1.5, 1.0, 0.5} codeConfidentialityRequirement = []string{"X", "H", "M", "L"} ) 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) } /******** INTEGRITY REQUIREMENT (IR) ********/ type IntegrityRequirement int const ( IntegrityRequirementNotdefined IntegrityRequirement = iota IntegrityRequirementHigh IntegrityRequirementMedium IntegrityRequirementLow ) var ( weightsIntegrityRequirement = []float64{1.0, 1.5, 1.0, 0.5} codeIntegrityRequirement = []string{"X", "H", "M", "L"} ) 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) } /******** AVAILAVILITY REQUIREMENT (AR) ********/ type AvailabilityRequirement int const ( AvailabilityRequirementNotdefined AvailabilityRequirement = iota AvailabilityRequirementHigh AvailabilityRequirementMedium AvailabilityRequirementLow ) var ( weightsAvailabilityRequirement = []float64{1.0, 1.5, 1.0, 0.5} codeAvailabilityRequirement = []string{"X", "H", "M", "L"} ) 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) } /******** MODIFIED ATTACK VECTOR (MAV) ********/ type ModifiedAttackVector AttackVector const ( AttackVectorNotdefined ModifiedAttackVector = 0 AttackVectorNotdefinedString string = "X" ) func (mav ModifiedAttackVector) defined() bool { return mav != AttackVectorNotdefined } func (mav ModifiedAttackVector) weight() float64 { if !mav.defined() { return 1.00 } return AttackVector(mav).weight() } func (mav ModifiedAttackVector) String() string { if !mav.defined() { return AttackVectorNotdefinedString } return AttackVector(mav).String() } func (mav *ModifiedAttackVector) parse(str string) error { if str == AttackVectorNotdefinedString { *mav = AttackVectorNotdefined return nil } av := AttackVector(*mav) err := av.parse(str) *mav = ModifiedAttackVector(av) return err } /******** MODIFIED ATTACK COMPLEXITY (MAC) ********/ type ModifiedAttackComplexity AttackComplexity const ( AttackComplexityNotdefined ModifiedAttackComplexity = 0 AttackComplexityNotdefinedString string = "X" ) func (mac ModifiedAttackComplexity) defined() bool { return mac != AttackComplexityNotdefined } func (mac ModifiedAttackComplexity) weight() float64 { if !mac.defined() { return 1.00 } return AttackComplexity(mac).weight() } func (mac ModifiedAttackComplexity) String() string { if !mac.defined() { return AttackComplexityNotdefinedString } return AttackComplexity(mac).String() } func (mac *ModifiedAttackComplexity) parse(str string) error { if str == AttackComplexityNotdefinedString { *mac = AttackComplexityNotdefined return nil } ac := AttackComplexity(*mac) err := ac.parse(str) *mac = ModifiedAttackComplexity(ac) return err } /******** MODIFIED PRIVILIGES REQUIRED (MPR) ********/ type ModifiedPrivilegesRequired PrivilegesRequired const ( PrivilegesRequiredNotdefined ModifiedPrivilegesRequired = 0 PrivilegesRequiredNotdefinedString string = "X" ) func (mpr ModifiedPrivilegesRequired) defined() bool { return mpr != PrivilegesRequiredNotdefined } func (mpr ModifiedPrivilegesRequired) weight(scopeChanged bool) float64 { if !mpr.defined() { return 1.00 } return PrivilegesRequired(mpr).weight(scopeChanged) } func (mpr ModifiedPrivilegesRequired) String() string { if !mpr.defined() { return PrivilegesRequiredNotdefinedString } return PrivilegesRequired(mpr).String() } func (mpr *ModifiedPrivilegesRequired) parse(str string) error { if str == PrivilegesRequiredNotdefinedString { *mpr = PrivilegesRequiredNotdefined return nil } pr := PrivilegesRequired(*mpr) err := pr.parse(str) *mpr = ModifiedPrivilegesRequired(pr) return err } /******** MODIFIED USER INTERACTION (MUI) ********/ type ModifiedUserInteraction UserInteraction const ( UserInteractionNotdefined ModifiedUserInteraction = 0 UserInteractionNotdefinedString string = "X" ) func (mui ModifiedUserInteraction) defined() bool { return mui != UserInteractionNotdefined } func (mui ModifiedUserInteraction) weight() float64 { if !mui.defined() { return 1.00 } return UserInteraction(mui).weight() } func (mui ModifiedUserInteraction) String() string { if !mui.defined() { return UserInteractionNotdefinedString } return UserInteraction(mui).String() } func (mui *ModifiedUserInteraction) parse(str string) error { if str == UserInteractionNotdefinedString { *mui = UserInteractionNotdefined return nil } ui := UserInteraction(*mui) err := ui.parse(str) *mui = ModifiedUserInteraction(ui) return err } /******** MODIFIED SCOPE (MS) ********/ type ModifiedScope Scope const ( ScopeNotdefined ModifiedScope = 0 ScopeNotdefinedString string = "X" ) func (ms ModifiedScope) defined() bool { return ms != ScopeNotdefined } func (ms ModifiedScope) String() string { if !ms.defined() { return ScopeNotdefinedString } return Scope(ms).String() } func (ms *ModifiedScope) parse(str string) error { if str == ScopeNotdefinedString { *ms = ScopeNotdefined return nil } s := Scope(*ms) err := s.parse(str) *ms = ModifiedScope(s) return err } /******** MODIFIED CONFIDENTIALITY (MC) ********/ type ModifiedConfidentiality Confidentiality const ( ConfidentialityNotdefined ModifiedConfidentiality = 0 ConfidentialityNotdefinedString string = "X" ) func (mc ModifiedConfidentiality) defined() bool { return mc != ConfidentialityNotdefined } func (mc ModifiedConfidentiality) weight() float64 { if !mc.defined() { return 1.00 } return Confidentiality(mc).weight() } func (mc ModifiedConfidentiality) String() string { if !mc.defined() { return ConfidentialityNotdefinedString } return Confidentiality(mc).String() } func (mc *ModifiedConfidentiality) parse(str string) error { if str == ConfidentialityNotdefinedString { *mc = ConfidentialityNotdefined return nil } c := Confidentiality(*mc) err := c.parse(str) *mc = ModifiedConfidentiality(c) return err } /******** MODIFIED INTEGRITY (MI) ********/ type ModifiedIntegrity Integrity const ( IntegrityNotdefined ModifiedIntegrity = 0 IntegrityNotdefinedString string = "X" ) func (mi ModifiedIntegrity) defined() bool { return mi != IntegrityNotdefined } func (mi ModifiedIntegrity) weight() float64 { if !mi.defined() { return 1.00 } return Integrity(mi).weight() } func (mi ModifiedIntegrity) String() string { if !mi.defined() { return IntegrityNotdefinedString } return Integrity(mi).String() } func (mi *ModifiedIntegrity) parse(str string) error { if str == IntegrityNotdefinedString { *mi = IntegrityNotdefined return nil } i := Integrity(*mi) err := i.parse(str) *mi = ModifiedIntegrity(i) return err } /******** MODIFIED AVAILABILITY (MA) ********/ type ModifiedAvailability Availability const ( AvailabilityNotdefined ModifiedAvailability = 0 AvailabilityNotdefinedString string = "X" ) func (ma ModifiedAvailability) defined() bool { return ma != AvailabilityNotdefined } func (ma ModifiedAvailability) weight() float64 { if !ma.defined() { return 1.00 } return Availability(ma).weight() } func (ma ModifiedAvailability) String() string { if !ma.defined() { return AvailabilityNotdefinedString } return Availability(ma).String() } func (ma *ModifiedAvailability) parse(str string) error { if str == AvailabilityNotdefinedString { *ma = AvailabilityNotdefined return nil } a := Availability(*ma) err := a.parse(str) *ma = ModifiedAvailability(a) return err } /* 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 EXPLOIT CODE MATURITY (MR) ********/ type ModifiedExploitCodeMaturity ExploitCodeMaturity const ( ModifiedExploitCodeMaturityNotdefined ModifiedExploitCodeMaturity = 0 ModifiedExploitCodeMaturityNotdefinedString string = "X" ) func (mecm ModifiedExploitCodeMaturity) defined() bool { return ExploitCodeMaturity(mecm).defined() } func (mecm ModifiedExploitCodeMaturity) weight() float64 { if !mecm.defined() { return 1.00 } return ExploitCodeMaturity(mecm).weight() } func (mecm ModifiedExploitCodeMaturity) String() string { return ExploitCodeMaturity(mecm).String() } func (mecm *ModifiedExploitCodeMaturity) parse(str string) error { a := ExploitCodeMaturity(*mecm) err := a.parse(str) *mecm = ModifiedExploitCodeMaturity(a) return err } /******** MODIFIED REMEDIATION LEVEL (MRL) ********/ type ModifiedRemediationLevel RemediationLevel const ( ModifiedRemediationLevelNotdefined ModifiedRemediationLevel = 0 ModifiedRemediationLevelNotdefinedString string = "X" ) 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 const ( ModifiedReportConfidenceNotdefined ModifiedReportConfidence = 0 ModifiedReportConfidenceNotdefinedString string = "X" ) 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 }