diff --git a/.github/workflows/actions.yml b/.github/workflows/actions.yml index 5f70be9..c9b0781 100644 --- a/.github/workflows/actions.yml +++ b/.github/workflows/actions.yml @@ -29,7 +29,7 @@ jobs: - name: Cache Composer packages id: composer-cache - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: vendor key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }} diff --git a/psalm-baseline.xml b/psalm-baseline.xml index 59e769e..882a334 100644 --- a/psalm-baseline.xml +++ b/psalm-baseline.xml @@ -1,5 +1,71 @@ - + + + + impactSubScore - 0.02) ** 15]]> + availability]]> + confidentiality]]> + integrity]]> + confidentiality) * (1 - $cvssObject->integrity) * (1 - $cvssObject->availability))]]> + + + + + availability]]> + availability * $cvssObject->availabilityRequirement]]> + confidentiality]]> + confidentiality * $cvssObject->confidentialityRequirement]]> + integrity]]> + integrity * $cvssObject->integrityRequirement]]> + confidentiality * $cvssObject->confidentialityRequirement) * (1 - $cvssObject->integrity * $cvssObject->integrityRequirement) * (1 - $cvssObject->availability * $cvssObject->availabilityRequirement)]]> + confidentiality) * (1 - $cvssObject->integrity) * (1 - $cvssObject->availability)]]> + + accessVector]]> + + + + + + modifiedImpactSubScore - 0.02) ** 15]]> + availabilityRequirement * $cvssObject->modifiedAvailability]]> + confidentialityRequirement * $cvssObject->modifiedConfidentiality]]> + integrityRequirement * $cvssObject->modifiedIntegrity]]> + confidentialityRequirement * $cvssObject->modifiedConfidentiality) * + (1 - $cvssObject->integrityRequirement * $cvssObject->modifiedIntegrity) * + (1 - $cvssObject->availabilityRequirement * $cvssObject->modifiedAvailability))]]> + + + + + + + + + modifiedImpactSubScore * 0.9731 - 0.02) ** 13]]> + availabilityRequirement * $cvssObject->modifiedAvailability]]> + confidentialityRequirement * $cvssObject->modifiedConfidentiality]]> + integrityRequirement * $cvssObject->modifiedIntegrity]]> + confidentialityRequirement * $cvssObject->modifiedConfidentiality) * + (1 - $cvssObject->integrityRequirement * $cvssObject->modifiedIntegrity) * + (1 - $cvssObject->availabilityRequirement * $cvssObject->modifiedAvailability))]]> + + + + + + maxSeverity[1][$cvssObject->eq1] * 0.1]]> + maxSeverity[2][$cvssObject->eq2] * 0.1]]> + maxSeverity[3][$cvssObject->eq3][$cvssObject->eq6] * 0.1]]> + maxSeverity[4][$cvssObject->eq4] * 0.1]]> + eqOne + + $normalisedSeverity->eqTwo + + $normalisedSeverity->eqThree + + $normalisedSeverity->eqFour + + $normalisedSeverity->eqFive + ) / $existingLower]]> + + diff --git a/src/Calculators/AbstractCvss3Calculator.php b/src/Calculators/AbstractCvss3Calculator.php index 2374f81..7520c8e 100644 --- a/src/Calculators/AbstractCvss3Calculator.php +++ b/src/Calculators/AbstractCvss3Calculator.php @@ -14,6 +14,7 @@ abstract public function calculateModifiedImpactSubScore(CvssObject $cvssObject) abstract public function calculateModifiedImpact(CvssObject $cvssObject): float; abstract public function roundUp(float $number): float; + #[\Override] public function calculateBaseScore(CvssObject $cvssObject): float { if (!$cvssObject instanceof Cvss23Object) { @@ -54,6 +55,7 @@ private function calculateExploitability(Cvss23Object $cvssObject): float return 8.22 * $cvssObject->attackVector * $cvssObject->attackComplexity * $cvssObject->privilegesRequired * $cvssObject->userInteraction; } + #[\Override] public function calculateTemporalScore(CvssObject $cvssObject): float { if (!$cvssObject instanceof Cvss23Object) { @@ -68,6 +70,7 @@ private function calculateModifiedExploitability(Cvss23Object $cvssObject): floa return 8.22 * $cvssObject->modifiedAttackVector * $cvssObject->modifiedAttackComplexity * $cvssObject->modifiedPrivilegesRequired * $cvssObject->modifiedUserInteraction; } + #[\Override] public function calculateEnvironmentalScore(CvssObject $cvssObject): float { if (!$cvssObject instanceof Cvss23Object) { diff --git a/src/Calculators/Cvss2Calculator.php b/src/Calculators/Cvss2Calculator.php index c5b0b9e..f4ecd23 100644 --- a/src/Calculators/Cvss2Calculator.php +++ b/src/Calculators/Cvss2Calculator.php @@ -5,8 +5,9 @@ use Rootshell\Cvss\ValueObjects\Cvss23Object; use Rootshell\Cvss\ValueObjects\CvssObject; -class Cvss2Calculator implements CvssCalculator +final class Cvss2Calculator implements CvssCalculator { + #[\Override] public function calculateBaseScore(CvssObject $cvssObject): float { if (!$cvssObject instanceof Cvss23Object) { @@ -33,6 +34,7 @@ private function calculateFImpact(Cvss23Object $cvssObject): float return $cvssObject->impact === 0.0 ? 0.0 : 1.176; } + #[\Override] public function calculateTemporalScore(CvssObject $cvssObject): float { if (!$cvssObject instanceof Cvss23Object) { @@ -42,6 +44,7 @@ public function calculateTemporalScore(CvssObject $cvssObject): float return round($cvssObject->baseScore * $cvssObject->exploitability * $cvssObject->remediationLevel * $cvssObject->reportConfidence, 1); } + #[\Override] public function calculateEnvironmentalScore(CvssObject $cvssObject): float { if (!$cvssObject instanceof Cvss23Object) { diff --git a/src/Calculators/Cvss30Calculator.php b/src/Calculators/Cvss30Calculator.php index 39fc7d4..cd38968 100644 --- a/src/Calculators/Cvss30Calculator.php +++ b/src/Calculators/Cvss30Calculator.php @@ -8,8 +8,9 @@ use Rootshell\Cvss\ValueObjects\Cvss23Object; use Rootshell\Cvss\ValueObjects\CvssObject; -class Cvss30Calculator extends AbstractCvss3Calculator +final class Cvss30Calculator extends AbstractCvss3Calculator { + #[\Override] public function calculateModifiedImpactSubScore(CvssObject $cvssObject): float { if (!$cvssObject instanceof Cvss23Object) { @@ -24,6 +25,7 @@ public function calculateModifiedImpactSubScore(CvssObject $cvssObject): float ); } + #[\Override] public function calculateModifiedImpact(CvssObject $cvssObject): float { if (!$cvssObject instanceof Cvss23Object) { @@ -37,6 +39,7 @@ public function calculateModifiedImpact(CvssObject $cvssObject): float return 7.52 * ($cvssObject->modifiedImpactSubScore - 0.029) - 3.25 * (($cvssObject->modifiedImpactSubScore - 0.02) ** 15); } + #[\Override] public function roundUp(float $number): float { return round(ceil($number * 10) / 10, 1); diff --git a/src/Calculators/Cvss31Calculator.php b/src/Calculators/Cvss31Calculator.php index fa6f67f..f7619c2 100644 --- a/src/Calculators/Cvss31Calculator.php +++ b/src/Calculators/Cvss31Calculator.php @@ -8,8 +8,9 @@ use Rootshell\Cvss\ValueObjects\Cvss23Object; use Rootshell\Cvss\ValueObjects\CvssObject; -class Cvss31Calculator extends AbstractCvss3Calculator +final class Cvss31Calculator extends AbstractCvss3Calculator { + #[\Override] public function calculateModifiedImpactSubScore(CvssObject $cvssObject): float { if (!$cvssObject instanceof Cvss23Object) { @@ -24,6 +25,7 @@ public function calculateModifiedImpactSubScore(CvssObject $cvssObject): float ); } + #[\Override] public function calculateModifiedImpact(CvssObject $cvssObject): float { if (!$cvssObject instanceof Cvss23Object) { @@ -37,6 +39,7 @@ public function calculateModifiedImpact(CvssObject $cvssObject): float return 7.52 * ($cvssObject->modifiedImpactSubScore - 0.029) - 3.25 * (($cvssObject->modifiedImpactSubScore * 0.9731 - 0.02) ** 13); } + #[\Override] public function roundUp(float $number): float { $intInput = round($number * 100000); diff --git a/src/Calculators/Cvss40Calculator.php b/src/Calculators/Cvss40Calculator.php index df29f52..64b09b4 100644 --- a/src/Calculators/Cvss40Calculator.php +++ b/src/Calculators/Cvss40Calculator.php @@ -9,7 +9,7 @@ use Rootshell\Cvss\ValueObjects\Cvss4Object; use Rootshell\Cvss\ValueObjects\CvssObject; -class Cvss40Calculator implements CvssCalculator +final class Cvss40Calculator implements CvssCalculator { private array $vectorLookup = [ '000000' => 10.0, @@ -338,6 +338,7 @@ class Cvss40Calculator implements CvssCalculator ], ]; + #[\Override] public function calculateBaseScore(CvssObject $cvssObject): float { if (!$cvssObject instanceof Cvss4Object) { @@ -395,11 +396,13 @@ public function calculateBaseScore(CvssObject $cvssObject): float return round($finalValue, 1); } + #[\Override] public function calculateTemporalScore(CvssObject $cvssObject): float { return $this->calculateBaseScore($cvssObject); } + #[\Override] public function calculateEnvironmentalScore(CvssObject $cvssObject): float { return $this->calculateBaseScore($cvssObject); diff --git a/src/Cvss.php b/src/Cvss.php index c408952..6240198 100644 --- a/src/Cvss.php +++ b/src/Cvss.php @@ -15,13 +15,13 @@ use Rootshell\Cvss\ValueObjects\CvssObject; use Rootshell\Cvss\ValueObjects\CvssResults; -class Cvss +final class Cvss { private const V4_VALIDATION_REGEX = '/^CVSS:4.0\/AV:[NALP]\/AC:[LH]\/AT:[NP]\/PR:[NLH]\/UI:[NPA]\/VC:[NLH]\/VI:[NLH]\/VA:[NLH]\/SC:[NLH]\/SI:[NLH]\/SA:[NLH]/'; - private const V4_VALIDATION_REGEX_OPTIONALS = '/\/S:[^NP{1}|\s]|\/AU:[^YN{1}\s]|\/R:[^AIU{1}|\s]|\/V:[^CD|\s]|\/RE:[^LMH{1}|\s]|\/U:[^CGAR{1}|\s]|' - . '\/MAV:[^NALP{1}|\s]|\/MAC:[^LH{1}|\s]|\/MAT:[^NP{1}|\s]|\/MPR:[^NLH{1}|\s]|\/MUI:[^NPA{1}|\s]|' - . '\/MVC:[^HLN{1}|\s]|\/MVI:[^HLN{1}|\s]|\/MVA:[^HLN{1}|\s]|\/MSC:[^HLN{1}|\s]|\/MSI:[^SHLN{1}|\s]|\/MSA:[^SHLN{1}|\s]|' - . '\/CR:[^HML{1}|\s]|\/IR:[^HML{1}|\s]|\/AR:[^HML{1}|\s]|\/E:[^APU{1}|\s]/'; + private const V4_VALIDATION_REGEX_OPTIONALS = '/\/S:[^NPX{1}|\s]|\/AU:[^YNX{1}\s]|\/R:[^AIUX{1}|\s]|\/V:[^CDX|\s]|\/RE:[^LMHX{1}|\s]|\/U:[^CGARX{1}|\s]|' + . '\/MAV:[^NALPX{1}|\s]|\/MAC:[^LHX{1}|\s]|\/MAT:[^NPX{1}|\s]|\/MPR:[^NLHX{1}|\s]|\/MUI:[^NPAX{1}|\s]|' + . '\/MVC:[^HLNX{1}|\s]|\/MVI:[^HLNX{1}|\s]|\/MVA:[^HLNX{1}|\s]|\/MSC:[^HLNX{1}|\s]|\/MSI:[^SHLNX{1}|\s]|\/MSA:[^SHLNX{1}|\s]|' + . '\/CR:[^HMLX{1}|\s]|\/IR:[^HMLX{1}|\s]|\/AR:[^HMLX{1}|\s]|\/E:[^APUX{1}|\s]/'; private const V3_VALIDATION_REGEX = '/^CVSS:(3.1|3.0)\/AV:[NALP]\/AC:[LH]\/PR:[NLH]\/UI:[NR]\/S:[UC]\/C:[NLH]\/I:[NLH]\/A:[NLH]/'; private const V2_VALIDATION_REGEX = '/AV:[LAN]\/AC:[HML]\/Au:[MSN]\/C:[NCP]\/I:[NCP]\/A:[NCP]/'; diff --git a/src/Exceptions/CvssException.php b/src/Exceptions/CvssException.php index 7dc5a00..8d76291 100644 --- a/src/Exceptions/CvssException.php +++ b/src/Exceptions/CvssException.php @@ -6,7 +6,7 @@ use Exception; -class CvssException extends Exception +final class CvssException extends Exception { public static function invalidValue(): self { diff --git a/src/Parsers/Cvss2Parser.php b/src/Parsers/Cvss2Parser.php index 17f0af8..5849b24 100644 --- a/src/Parsers/Cvss2Parser.php +++ b/src/Parsers/Cvss2Parser.php @@ -5,7 +5,7 @@ use Rootshell\Cvss\Exceptions\CvssException; use Rootshell\Cvss\ValueObjects\Cvss23Object; -class Cvss2Parser +final class Cvss2Parser { private const NETWORK = 'N'; private const ADJACENT = 'A'; diff --git a/src/Parsers/Cvss31Parser.php b/src/Parsers/Cvss31Parser.php index ca71e09..963e15c 100644 --- a/src/Parsers/Cvss31Parser.php +++ b/src/Parsers/Cvss31Parser.php @@ -7,7 +7,7 @@ use Rootshell\Cvss\Exceptions\CvssException; use Rootshell\Cvss\ValueObjects\Cvss23Object; -class Cvss31Parser +final class Cvss31Parser { private const NETWORK = 'N'; private const ADJACENT = 'A'; diff --git a/src/Parsers/Cvss40Parser.php b/src/Parsers/Cvss40Parser.php index 1dfbb1c..52d7da8 100644 --- a/src/Parsers/Cvss40Parser.php +++ b/src/Parsers/Cvss40Parser.php @@ -6,7 +6,7 @@ use Rootshell\Cvss\ValueObjects\Cvss23Object; use Rootshell\Cvss\ValueObjects\Cvss4Object; -class Cvss40Parser +final class Cvss40Parser { private const NETWORK = 'N'; private const ADJACENT = 'A'; @@ -326,7 +326,7 @@ private function findValueInVector(string $vector, string $section): string private function findOptionalValueInVector(string $vector, string $section): ?string { - $modifiedRegex = '/(?<=\/M' . $section . ':)(.*?)(?=\/|$)/'; + $modifiedRegex = '/(?<=\/M' . $section . ':)([^X\/]*)(?=\/|$)/'; preg_match($modifiedRegex, '/' . $vector, $modifiedMatches); @@ -334,7 +334,7 @@ private function findOptionalValueInVector(string $vector, string $section): ?st return $modifiedMatches[0]; } - $regex = '/(?<=\/' . $section . ':)(.*?)(?=\/|$)/'; + $regex = '/(?<=\/' . $section . ':)([^X\/]*)(?=\/|$)/'; preg_match($regex, '/' . $vector, $matches); return $matches[0] ?? null; diff --git a/src/ValueObjects/Cvss23Object.php b/src/ValueObjects/Cvss23Object.php index 311448d..b47b75c 100644 --- a/src/ValueObjects/Cvss23Object.php +++ b/src/ValueObjects/Cvss23Object.php @@ -4,7 +4,7 @@ namespace Rootshell\Cvss\ValueObjects; -class Cvss23Object extends CvssObject +final class Cvss23Object extends CvssObject { public const SCOPE_UNCHANGED = 'U'; public const SCOPE_CHANGED = 'C'; diff --git a/src/ValueObjects/Cvss4Distance.php b/src/ValueObjects/Cvss4Distance.php index 96aa049..e2a0b30 100644 --- a/src/ValueObjects/Cvss4Distance.php +++ b/src/ValueObjects/Cvss4Distance.php @@ -2,7 +2,7 @@ namespace Rootshell\Cvss\ValueObjects; -class Cvss4Distance +final class Cvss4Distance { public function __construct( public float $eqOne = 0.0, diff --git a/src/ValueObjects/Cvss4Object.php b/src/ValueObjects/Cvss4Object.php index 22ed3d9..d4b8be6 100644 --- a/src/ValueObjects/Cvss4Object.php +++ b/src/ValueObjects/Cvss4Object.php @@ -2,7 +2,7 @@ namespace Rootshell\Cvss\ValueObjects; -class Cvss4Object extends CvssObject +final class Cvss4Object extends CvssObject { public function __construct( public string $eq1, diff --git a/src/ValueObjects/CvssResults.php b/src/ValueObjects/CvssResults.php index c13923b..1576d22 100644 --- a/src/ValueObjects/CvssResults.php +++ b/src/ValueObjects/CvssResults.php @@ -2,7 +2,7 @@ namespace Rootshell\Cvss\ValueObjects; -class CvssResults +final class CvssResults { public function __construct( public float $baseScore, diff --git a/tests/CvssTest.php b/tests/CvssTest.php index 391049c..23bad38 100644 --- a/tests/CvssTest.php +++ b/tests/CvssTest.php @@ -46,6 +46,7 @@ public static function vectorProvider(): array ['CVSS:4.0/AV:A/AC:H/AT:P/PR:L/UI:P/VC:L/VI:H/VA:L/SC:L/SI:H/SA:L/E:P/CR:M/IR:L/AR:M/MAV:N/MAC:H/MAT:P/MPR:L/MUI:P/MVC:L/MVI:H/MVA:L/MSC:H/MSI:L/MSA:L/S:N/AU:N/R:U/V:D/RE:L/U:Green', 4.9, 4.9, 4.9], ['CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/MAV:N/MAC:L/MAT:N/MPR:N/MUI:N/S:N/AU:N/R:A/V:D/RE:L/U:Clear', 6.9, 6.9, 6.9], ['CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/S:N/AU:N/R:A/V:D/RE:L/U:Clear', 6.9, 6.9, 6.9], + ['CVSS:4.0/AV:N/AC:H/AT:N/PR:N/UI:A/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X', 7.5, 7.5, 7.5], ['CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:N/SC:N/SI:N/SA:N', 0, 0, 0], @@ -233,7 +234,7 @@ public static function vectorsProvider(): array 'Invalid CVSS4.0 - X passed as MAV' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/MAV:X/MAC:X/MAT:X/MPR:X/' . '/UI:X/S:N/AU:N/R:A/V:D/RE:L/U:Clear', - 'valid' => false + 'valid' => true ], 'Invalid CVSS4.0 - Q passed' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/MAV:Q', @@ -357,7 +358,7 @@ public static function vectorsProvider(): array ], 'Valid CVSS4.0 - with optional S:X' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/S:X', - 'valid' => false + 'valid' => true ], 'Valid CVSS4.0 - with optional S:N' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/S:N', @@ -369,7 +370,7 @@ public static function vectorsProvider(): array ], 'Valid CVSS4.0 - with optional AU:X' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/AU:X', - 'valid' => false + 'valid' => true ], 'Valid CVSS4.0 - with optional AU:N' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/AU:N', @@ -381,7 +382,7 @@ public static function vectorsProvider(): array ], 'Valid CVSS4.0 - with optional R:X' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/R:X', - 'valid' => false + 'valid' => true ], 'Valid CVSS4.0 - with optional R:A' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/R:A', @@ -397,7 +398,7 @@ public static function vectorsProvider(): array ], 'Valid CVSS4.0 - with optional V:X' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/V:X', - 'valid' => false + 'valid' => true ], 'Valid CVSS4.0 - with optional V:D' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/V:D', @@ -409,7 +410,7 @@ public static function vectorsProvider(): array ], 'Valid CVSS4.0 - with optional RE:X' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/RE:X', - 'valid' => false + 'valid' => true ], 'Valid CVSS4.0 - with optional RE:L' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/RE:L', @@ -425,7 +426,7 @@ public static function vectorsProvider(): array ], 'Valid CVSS4.0 - with optional U:X' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/RE:X', - 'valid' => false + 'valid' => true ], 'Valid CVSS4.0 - with optional U:Clear' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/U:Clear', @@ -445,7 +446,7 @@ public static function vectorsProvider(): array ], 'Valid CVSS4.0 - with optional MAV:X' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/MAV:X', - 'valid' => false + 'valid' => true ], 'Valid CVSS4.0 - with optional MAV:N' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/MAX:N', @@ -465,7 +466,7 @@ public static function vectorsProvider(): array ], 'Valid CVSS4.0 - with optional MAC:X' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/MAC:X', - 'valid' => false + 'valid' => true ], 'Valid CVSS4.0 - with optional MAC:L' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/MAC:L', @@ -477,7 +478,7 @@ public static function vectorsProvider(): array ], 'Valid CVSS4.0 - with optional MAT:X' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/MAT:X', - 'valid' => false + 'valid' => true ], 'Valid CVSS4.0 - with optional MAT:N' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/MAT:N', @@ -489,7 +490,7 @@ public static function vectorsProvider(): array ], 'Valid CVSS4.0 - with optional MPR:X' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/MPR:X', - 'valid' => false + 'valid' => true ], 'Valid CVSS4.0 - with optional MPR:N' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/MPR:N', @@ -505,7 +506,7 @@ public static function vectorsProvider(): array ], 'Valid CVSS4.0 - with optional MUI:X' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/MUI:X', - 'valid' => false + 'valid' => true ], 'Valid CVSS4.0 - with optional MUI:N' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/MUI:N', @@ -521,7 +522,7 @@ public static function vectorsProvider(): array ], 'Valid CVSS4.0 - with optional MVC:X' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/MVC:X', - 'valid' => false + 'valid' => true ], 'Valid CVSS4.0 - with optional MVC:N' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/MVC:N', @@ -537,7 +538,7 @@ public static function vectorsProvider(): array ], 'Valid CVSS4.0 - with optional MVI:X' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/MVI:X', - 'valid' => false + 'valid' => true ], 'Valid CVSS4.0 - with optional MVI:N' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/MVI:N', @@ -553,7 +554,7 @@ public static function vectorsProvider(): array ], 'Valid CVSS4.0 - with optional MVA:X' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/MVA:X', - 'valid' => false + 'valid' => true ], 'Valid CVSS4.0 - with optional MVA:N' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/MVA:N', @@ -569,7 +570,7 @@ public static function vectorsProvider(): array ], 'Valid CVSS4.0 - with optional MSC:X' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/MSC:X', - 'valid' => false + 'valid' => true ], 'Valid CVSS4.0 - with optional MSC:N' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/MSC:N', @@ -585,7 +586,7 @@ public static function vectorsProvider(): array ], 'Valid CVSS4.0 - with optional MSI:X' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/MSI:X', - 'valid' => false + 'valid' => true ], 'Valid CVSS4.0 - with optional MSI:S' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/MSI:N', @@ -605,7 +606,7 @@ public static function vectorsProvider(): array ], 'Valid CVSS4.0 - with optional MSA:X' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/MSA:X', - 'valid' => false + 'valid' => true ], 'Valid CVSS4.0 - with optional MSA:S' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/MSA:N', @@ -625,7 +626,7 @@ public static function vectorsProvider(): array ], 'Valid CVSS4.0 - with optional CR:X' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/CR:X', - 'valid' => false + 'valid' => true ], 'Valid CVSS4.0 - with optional CR:M' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/CR:M', @@ -641,7 +642,7 @@ public static function vectorsProvider(): array ], 'Valid CVSS4.0 - with optional IR:X' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/IR:X', - 'valid' => false + 'valid' => true ], 'Valid CVSS4.0 - with optional IR:M' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/IR:M', @@ -657,7 +658,7 @@ public static function vectorsProvider(): array ], 'Valid CVSS4.0 - with optional AR:X' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/AR:X', - 'valid' => false + 'valid' => true ], 'Valid CVSS4.0 - with optional AR:M' => [ 'vector' => 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/AR:M',