예제 #1
0
        public static CvssV3BaseScore FromVectorString(string vectorString)
        {
            vectorString = vectorString ?? throw new ArgumentNullException(nameof(vectorString));
            if (string.IsNullOrWhiteSpace(vectorString) ||
                !Regex.IsMatch(vectorString, "^CVSS:3\\.0\\/((AV:[NALP]|AC:[LH]|PR:[UNLH]|UI:[NR]|S:[UC]|[CIA]:[NLH]|E:[XUPFH]|RL:[XOTWU]|RC:[XURC]|[CIA]R:[XLMH]|MAV:[XNALP]|MAC:[XLH]|MPR:[XUNLH]|MUI:[XNR]|MS:[XUC]|M[CIA]:[XNLH])\\/)*(AV:[NALP]|AC:[LH]|PR:[UNLH]|UI:[NR]|S:[UC]|[CIA]:[NLH]|E:[XUPFH]|RL:[XOTWU]|RC:[XURC]|[CIA]R:[XLMH]|MAV:[XNALP]|MAC:[XLH]|MPR:[XUNLH]|MUI:[XNR]|MS:[XUC]|M[CIA]:[XNLH])$"))
            {
                throw new ArgumentException("Not a valid CVSS V3 vector string, invalid format", nameof(vectorString));
            }

            var cvssV3BaseScore = new CvssV3BaseScore
            {
                AttackVector       = VectorStringParser <CvssV3Enums.AttackVector> .Parse(vectorString),
                AttackComplexity   = VectorStringParser <CvssV3Enums.AttackComplexity> .Parse(vectorString),
                PrivilegesRequired = VectorStringParser <CvssV3Enums.PrivilegesRequired> .Parse(vectorString),
                UserInteraction    = VectorStringParser <CvssV3Enums.UserInteraction> .Parse(vectorString),
                Scope           = VectorStringParser <CvssV3Enums.Scope> .Parse(vectorString),
                Confidentiality = VectorStringParser <CvssV3Enums.Confidentiality> .Parse(vectorString),
                Integrity       = VectorStringParser <CvssV3Enums.Integrity> .Parse(vectorString),
                Availability    = VectorStringParser <CvssV3Enums.Availability> .Parse(vectorString),
            };

            var hasAllRequiredValues = true;

            hasAllRequiredValues = hasAllRequiredValues && cvssV3BaseScore.AttackVector != CvssV3Enums.AttackVector.NotSpecified;
            hasAllRequiredValues = hasAllRequiredValues && cvssV3BaseScore.AttackComplexity != CvssV3Enums.AttackComplexity.NotSpecified;
            hasAllRequiredValues = hasAllRequiredValues && cvssV3BaseScore.PrivilegesRequired != CvssV3Enums.PrivilegesRequired.NotSpecified;
            hasAllRequiredValues = hasAllRequiredValues && cvssV3BaseScore.UserInteraction != CvssV3Enums.UserInteraction.NotSpecified;
            hasAllRequiredValues = hasAllRequiredValues && cvssV3BaseScore.Scope != CvssV3Enums.Scope.NotSpecified;
            hasAllRequiredValues = hasAllRequiredValues && cvssV3BaseScore.Confidentiality != CvssV3Enums.Confidentiality.NotSpecified;
            hasAllRequiredValues = hasAllRequiredValues && cvssV3BaseScore.Integrity != CvssV3Enums.Integrity.NotSpecified;
            hasAllRequiredValues = hasAllRequiredValues && cvssV3BaseScore.Availability != CvssV3Enums.Availability.NotSpecified;

            if (!hasAllRequiredValues)
            {
                throw new ArgumentException("Not a valid CVSS V3 vector string, missing required metric", nameof(vectorString));
            }

            return(cvssV3BaseScore);
        }
예제 #2
0
        public static CvssV3BaseScore FromCvssV2BaseScore(CvssV2BaseScore cvssV2BaseScore)
        {
            var cvssV3BaseScore = new CvssV3BaseScore();

            switch (cvssV2BaseScore.AccessVector)
            {
            case CvssV2Enums.AccessVector.Network:
                cvssV3BaseScore.AttackVector = CvssV3Enums.AttackVector.Network;
                break;

            case CvssV2Enums.AccessVector.AdjacentNetwork:
                cvssV3BaseScore.AttackVector = CvssV3Enums.AttackVector.Adjacent;
                break;
            }

            switch (cvssV2BaseScore.Authentication)
            {
            case CvssV2Enums.Authentication.None:
                cvssV3BaseScore.PrivilegesRequired = CvssV3Enums.PrivilegesRequired.None;
                break;
            }

            switch (cvssV2BaseScore.ConfidentialityImpact)
            {
            case CvssV2Enums.ConfidentialityImpact.Complete:
                cvssV3BaseScore.Confidentiality = CvssV3Enums.Confidentiality.High;
                break;

            case CvssV2Enums.ConfidentialityImpact.Partial:
                cvssV3BaseScore.Confidentiality = CvssV3Enums.Confidentiality.Low;
                break;

            case CvssV2Enums.ConfidentialityImpact.None:
                cvssV3BaseScore.Confidentiality = CvssV3Enums.Confidentiality.None;
                break;
            }

            switch (cvssV2BaseScore.IntegrityImpact)
            {
            case CvssV2Enums.IntegrityImpact.Complete:
                cvssV3BaseScore.Integrity = CvssV3Enums.Integrity.High;
                break;

            case CvssV2Enums.IntegrityImpact.Partial:
                cvssV3BaseScore.Integrity = CvssV3Enums.Integrity.Low;
                break;

            case CvssV2Enums.IntegrityImpact.None:
                cvssV3BaseScore.Integrity = CvssV3Enums.Integrity.None;
                break;
            }

            switch (cvssV2BaseScore.AvailabilityImpact)
            {
            case CvssV2Enums.AvailabilityImpact.Complete:
                cvssV3BaseScore.Availability = CvssV3Enums.Availability.High;
                break;

            case CvssV2Enums.AvailabilityImpact.Partial:
                cvssV3BaseScore.Availability = CvssV3Enums.Availability.Low;
                break;

            case CvssV2Enums.AvailabilityImpact.None:
                cvssV3BaseScore.Availability = CvssV3Enums.Availability.None;
                break;
            }

            return(cvssV3BaseScore);
        }
예제 #3
0
 public CvssV3Score()
 {
     BaseScore          = new CvssV3BaseScore();
     TemporalScore      = new CvssV3TemporalScore();
     EnvironmentalScore = new CvssV3EnvironmentalScore();
 }