using System.Text.Json.Serialization;
namespace StellaOps.Policy.Scoring;
///
/// CVSS v4.0 Base metric group - Exploitability and impact metrics.
/// Per FIRST CVSS v4.0 Specification Document.
///
public sealed record CvssBaseMetrics
{
/// Attack Vector (AV) - Mandatory.
[JsonPropertyName("av")]
public required AttackVector AttackVector { get; init; }
/// Attack Complexity (AC) - Mandatory.
[JsonPropertyName("ac")]
public required AttackComplexity AttackComplexity { get; init; }
/// Attack Requirements (AT) - Mandatory.
[JsonPropertyName("at")]
public required AttackRequirements AttackRequirements { get; init; }
/// Privileges Required (PR) - Mandatory.
[JsonPropertyName("pr")]
public required PrivilegesRequired PrivilegesRequired { get; init; }
/// User Interaction (UI) - Mandatory.
[JsonPropertyName("ui")]
public required UserInteraction UserInteraction { get; init; }
/// Vulnerable System Confidentiality (VC) - Mandatory.
[JsonPropertyName("vc")]
public required ImpactMetricValue VulnerableSystemConfidentiality { get; init; }
/// Vulnerable System Integrity (VI) - Mandatory.
[JsonPropertyName("vi")]
public required ImpactMetricValue VulnerableSystemIntegrity { get; init; }
/// Vulnerable System Availability (VA) - Mandatory.
[JsonPropertyName("va")]
public required ImpactMetricValue VulnerableSystemAvailability { get; init; }
/// Subsequent System Confidentiality (SC) - Mandatory.
[JsonPropertyName("sc")]
public required ImpactMetricValue SubsequentSystemConfidentiality { get; init; }
/// Subsequent System Integrity (SI) - Mandatory.
[JsonPropertyName("si")]
public required ImpactMetricValue SubsequentSystemIntegrity { get; init; }
/// Subsequent System Availability (SA) - Mandatory.
[JsonPropertyName("sa")]
public required ImpactMetricValue SubsequentSystemAvailability { get; init; }
}
///
/// CVSS v4.0 Threat metric group.
///
public sealed record CvssThreatMetrics
{
/// Exploit Maturity (E) - Optional, defaults to Not Defined.
[JsonPropertyName("e")]
public ExploitMaturity ExploitMaturity { get; init; } = ExploitMaturity.NotDefined;
/// When the threat signal was last observed (UTC).
[JsonPropertyName("observedAt")]
public DateTimeOffset? ObservedAt { get; init; }
/// When this threat signal should expire.
[JsonPropertyName("expiresAt")]
public DateTimeOffset? ExpiresAt { get; init; }
/// Source of threat intelligence (kev, epss, internal).
[JsonPropertyName("source")]
public string? Source { get; init; }
}
///
/// CVSS v4.0 Environmental metric group - Modified base metrics for specific environments.
///
public sealed record CvssEnvironmentalMetrics
{
/// Modified Attack Vector (MAV).
[JsonPropertyName("mav")]
public ModifiedAttackVector? ModifiedAttackVector { get; init; }
/// Modified Attack Complexity (MAC).
[JsonPropertyName("mac")]
public ModifiedAttackComplexity? ModifiedAttackComplexity { get; init; }
/// Modified Attack Requirements (MAT).
[JsonPropertyName("mat")]
public ModifiedAttackRequirements? ModifiedAttackRequirements { get; init; }
/// Modified Privileges Required (MPR).
[JsonPropertyName("mpr")]
public ModifiedPrivilegesRequired? ModifiedPrivilegesRequired { get; init; }
/// Modified User Interaction (MUI).
[JsonPropertyName("mui")]
public ModifiedUserInteraction? ModifiedUserInteraction { get; init; }
/// Modified Vulnerable System Confidentiality (MVC).
[JsonPropertyName("mvc")]
public ModifiedImpactMetricValue? ModifiedVulnerableSystemConfidentiality { get; init; }
/// Modified Vulnerable System Integrity (MVI).
[JsonPropertyName("mvi")]
public ModifiedImpactMetricValue? ModifiedVulnerableSystemIntegrity { get; init; }
/// Modified Vulnerable System Availability (MVA).
[JsonPropertyName("mva")]
public ModifiedImpactMetricValue? ModifiedVulnerableSystemAvailability { get; init; }
/// Modified Subsequent System Confidentiality (MSC).
[JsonPropertyName("msc")]
public ModifiedImpactMetricValue? ModifiedSubsequentSystemConfidentiality { get; init; }
/// Modified Subsequent System Integrity (MSI).
[JsonPropertyName("msi")]
public ModifiedSubsequentImpact? ModifiedSubsequentSystemIntegrity { get; init; }
/// Modified Subsequent System Availability (MSA).
[JsonPropertyName("msa")]
public ModifiedSubsequentImpact? ModifiedSubsequentSystemAvailability { get; init; }
/// Confidentiality Requirement (CR).
[JsonPropertyName("cr")]
public SecurityRequirement? ConfidentialityRequirement { get; init; }
/// Integrity Requirement (IR).
[JsonPropertyName("ir")]
public SecurityRequirement? IntegrityRequirement { get; init; }
/// Availability Requirement (AR).
[JsonPropertyName("ar")]
public SecurityRequirement? AvailabilityRequirement { get; init; }
}
///
/// CVSS v4.0 Supplemental metric group - Additional context metrics that do not affect scoring.
///
public sealed record CvssSupplementalMetrics
{
/// Safety (S) - Does the vulnerability affect human safety?
[JsonPropertyName("s")]
public Safety? Safety { get; init; }
/// Automatable (AU) - Can the vulnerability be exploited automatically?
[JsonPropertyName("au")]
public Automatable? Automatable { get; init; }
/// Recovery (R) - What is the recovery capability?
[JsonPropertyName("r")]
public Recovery? Recovery { get; init; }
/// Value Density (V) - Resource density of the vulnerable system.
[JsonPropertyName("v")]
public ValueDensity? ValueDensity { get; init; }
/// Vulnerability Response Effort (RE) - Effort required to respond.
[JsonPropertyName("re")]
public ResponseEffort? VulnerabilityResponseEffort { get; init; }
/// Provider Urgency (U) - Urgency as assessed by the provider.
[JsonPropertyName("u")]
public ProviderUrgency? ProviderUrgency { get; init; }
}
#region Base Metric Enums
/// Attack Vector values per CVSS v4.0.
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum AttackVector
{
/// Network (N) - Remotely exploitable.
Network,
/// Adjacent (A) - Same network segment.
Adjacent,
/// Local (L) - Local access required.
Local,
/// Physical (P) - Physical access required.
Physical
}
/// Attack Complexity values per CVSS v4.0.
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum AttackComplexity
{
/// Low (L) - No specialized conditions.
Low,
/// High (H) - Specialized conditions required.
High
}
/// Attack Requirements values per CVSS v4.0.
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum AttackRequirements
{
/// None (N) - No preconditions required.
None,
/// Present (P) - Preconditions must exist.
Present
}
/// Privileges Required values per CVSS v4.0.
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum PrivilegesRequired
{
/// None (N) - No privileges needed.
None,
/// Low (L) - Basic user privileges needed.
Low,
/// High (H) - Admin/elevated privileges needed.
High
}
/// User Interaction values per CVSS v4.0.
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum UserInteraction
{
/// None (N) - No user interaction required.
None,
/// Passive (P) - Involuntary user action.
Passive,
/// Active (A) - Conscious user action required.
Active
}
/// Impact metric values (None/Low/High) per CVSS v4.0.
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum ImpactMetricValue
{
/// None (N) - No impact.
None,
/// Low (L) - Limited impact.
Low,
/// High (H) - Serious impact.
High
}
#endregion
#region Threat Metric Enums
/// Exploit Maturity values per CVSS v4.0.
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum ExploitMaturity
{
/// Not Defined (X) - Not assessed.
NotDefined,
/// Attacked (A) - Active exploitation observed.
Attacked,
/// Proof of Concept (P) - PoC code exists.
ProofOfConcept,
/// Unreported (U) - No public exploit code.
Unreported
}
#endregion
#region Environmental Metric Enums (Modified versions)
/// Modified Attack Vector values.
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum ModifiedAttackVector
{
NotDefined, Network, Adjacent, Local, Physical
}
/// Modified Attack Complexity values.
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum ModifiedAttackComplexity
{
NotDefined, Low, High
}
/// Modified Attack Requirements values.
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum ModifiedAttackRequirements
{
NotDefined, None, Present
}
/// Modified Privileges Required values.
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum ModifiedPrivilegesRequired
{
NotDefined, None, Low, High
}
/// Modified User Interaction values.
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum ModifiedUserInteraction
{
NotDefined, None, Passive, Active
}
/// Modified Impact metric values.
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum ModifiedImpactMetricValue
{
NotDefined, None, Low, High
}
/// Modified Subsequent System Impact values (includes Safety dimension).
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum ModifiedSubsequentImpact
{
NotDefined, Negligible, Low, High, Safety
}
/// Security Requirement values.
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum SecurityRequirement
{
NotDefined, Low, Medium, High
}
#endregion
#region Supplemental Metric Enums
/// Safety values per CVSS v4.0.
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum Safety
{
NotDefined, Negligible, Present
}
/// Automatable values per CVSS v4.0.
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum Automatable
{
NotDefined, No, Yes
}
/// Recovery values per CVSS v4.0.
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum Recovery
{
NotDefined, Automatic, User, Irrecoverable
}
/// Value Density values per CVSS v4.0.
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum ValueDensity
{
NotDefined, Diffuse, Concentrated
}
/// Response Effort values per CVSS v4.0.
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum ResponseEffort
{
NotDefined, Low, Moderate, High
}
/// Provider Urgency values per CVSS v4.0.
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum ProviderUrgency
{
NotDefined, Clear, Green, Amber, Red
}
#endregion