Skip to content

cvss 包 ​

cvss 包是 CVSS Skills 的核心包,提供了 CVSS 3.x 向量的数据结构、评分计算和分析功能。

包概述 ​

go
import "github.com/scagogogo/cvss-skills/pkg/cvss"

主要类型 ​

核心结构 ​

类型描述文档链接
Cvss3xCVSS 3.x 向量的主要数据结构详细文档
Cvss3xBase基础指标组详细文档
Cvss3xTemporal时间指标组详细文档
Cvss3xEnvironmental环境指标组详细文档

计算器 ​

类型描述文档链接
CalculatorCVSS 评分计算器详细文档
DistanceCalculator向量距离计算器详细文档

快速示例 ​

创建 CVSS 向量 ​

go
// 手动创建向量
cvssVector := cvss.NewCvss3x()
cvssVector.MajorVersion = 3
cvssVector.MinorVersion = 1

// 设置基础指标
cvssVector.Cvss3xBase.AttackVector = vector.AttackVectorNetwork
cvssVector.Cvss3xBase.AttackComplexity = vector.AttackComplexityLow
// ... 设置其他指标

计算评分 ​

go
// 创建计算器
calculator := cvss.NewCalculator(cvssVector)

// 计算基础评分
baseScore, err := calculator.GetBaseScore()
if err != nil {
    log.Fatal(err)
}

// 计算时间评分
temporalScore, err := calculator.GetTemporalScore()
if err != nil {
    log.Fatal(err)
}

// 计算环境评分
environmentalScore, err := calculator.GetEnvironmentalScore()
if err != nil {
    log.Fatal(err)
}

fmt.Printf("基础评分: %.1f\n", baseScore)
fmt.Printf("时间评分: %.1f\n", temporalScore)
fmt.Printf("环境评分: %.1f\n", environmentalScore)

向量距离计算 ​

go
// 创建两个向量
vector1, _ := parser.NewCvss3xParser("CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H").Parse()
vector2, _ := parser.NewCvss3xParser("CVSS:3.1/AV:L/AC:H/PR:H/UI:R/S:U/C:L/I:L/A:L").Parse()

// 计算距离
distCalc := cvss.NewDistanceCalculator(vector1, vector2)
euclideanDist := distCalc.EuclideanDistance()
manhattanDist := distCalc.ManhattanDistance()

fmt.Printf("欧几里得距离: %.3f\n", euclideanDist)
fmt.Printf("曼哈顿距离: %.3f\n", manhattanDist)

主要功能 ​

🧮 评分计算 ​

  • 基础评分: 根据基础指标计算 CVSS 基础评分
  • 时间评分: 考虑时间因素的评分调整
  • 环境评分: 根据环境因素的最终评分

📊 向量分析 ​

  • 距离计算: 计算两个向量之间的距离
  • 相似度分析: 评估向量的相似程度
  • 向量比较: 多维度的向量对比

🔧 数据处理 ​

  • JSON 序列化: 完整的 JSON 支持
  • 向量验证: 确保向量的有效性
  • 错误处理: 详细的错误信息

包结构 ​

cvss/
├── calculator.go          # 评分计算器
├── cvss3x.go             # CVSS 3.x 数据结构
├── distance.go           # 距离计算器
├── json.go               # JSON 支持
├── errors.go             # 错误定义
└── utils.go              # 工具函数

类型定义 ​

Calculator ​

Calculator 是一个结构体(非接口),用待评分的 *Cvss3x 构造:

go
type Calculator struct { /* 非导出:持有 *Cvss3x */ }

func NewCalculator(cvss *Cvss3x) *Calculator
func (c *Calculator) Calculate() (float64, error)
func (c *Calculator) GetBaseScore() (float64, error)
func (c *Calculator) GetTemporalScore() (float64, error)
func (c *Calculator) GetEnvironmentalScore() (float64, error)
func (c *Calculator) GetSeverityRating(score float64) Severity // Severity 是命名字符串类型

DistanceCalculator ​

DistanceCalculator 同样是结构体(非接口),持有两个 *Cvss3x:

go
func NewDistanceCalculator(vector1, vector2 *Cvss3x) *DistanceCalculator
func (dc *DistanceCalculator) EuclideanDistance() float64
func (dc *DistanceCalculator) ManhattanDistance() float64
func (dc *DistanceCalculator) HammingDistance() int
func (dc *DistanceCalculator) JaccardSimilarity() float64
func (dc *DistanceCalculator) ScoreDifference() float64

常用模式 ​

1. 基本使用模式 ​

go
// 解析 -> 计算 -> 输出
vector, err := parser.ParseString(vectorString)
if err != nil {
    return err
}

calculator := cvss.NewCalculator(vector)
score, err := calculator.Calculate()
if err != nil {
    return err
}

fmt.Printf("评分: %.1f (%s)\n", score, calculator.GetSeverityRating(score))

2. 批量处理模式 ​

go
func processBatch(vectors []string) []Result {
    var results []Result
    
    for _, vectorStr := range vectors {
        vector, err := parser.ParseString(vectorStr)
        if err != nil {
            continue
        }
        
        calculator := cvss.NewCalculator(vector)
        score, err := calculator.Calculate()
        if err != nil {
            continue
        }
        
        results = append(results, Result{
            Vector: vectorStr,
            Score:  score,
            Severity: calculator.GetSeverityRating(score),
        })
    }
    
    return results
}

3. 向量比较模式 ​

go
func compareVectors(v1, v2 string) ComparisonResult {
    vector1, _ := parser.ParseString(v1)
    vector2, _ := parser.ParseString(v2)
    
    calc1 := cvss.NewCalculator(vector1)
    calc2 := cvss.NewCalculator(vector2)
    
    score1, _ := calc1.Calculate()
    score2, _ := calc2.Calculate()
    
    distCalc := cvss.NewDistanceCalculator(vector1, vector2)
    distance := distCalc.EuclideanDistance()
    
    return ComparisonResult{
        Score1:   score1,
        Score2:   score2,
        Distance: distance,
        MoreSevere: score1 > score2,
    }
}

性能特性 ​

⚡ 高性能 ​

  • 零分配计算: 优化的计算算法,减少内存分配
  • 并发安全: 所有计算器都是并发安全的
  • 缓存友好: 数据结构设计考虑了缓存效率

📈 可扩展性 ​

  • 插件架构: 支持自定义计算器
  • 接口设计: 易于扩展和测试
  • 模块化: 功能模块化,按需使用

最佳实践 ​

1. 错误处理 ​

go
calculator := cvss.NewCalculator(vector)
score, err := calculator.Calculate()
if err != nil {
    // Calculate 通过 Check() 返回普通 error(首个缺失/无效指标)
    log.Printf("计算失败(向量不完整): %v", err)
    return
}

2. 资源管理 ​

Calculator 在构造时绑定向量,没有 SetVector 方法,因此不可用对象池复用。每次评分构造新的 Calculator(开销很小);若要批量评分,直接循环构造即可:

go
func calculateScore(vector *cvss.Cvss3x) (float64, error) {
    calc := cvss.NewCalculator(vector)
    return calc.Calculate()
}

3. 性能监控 ​

go
func calculateWithMetrics(vector *cvss.Cvss3x) (float64, error) {
    start := time.Now()
    defer func() {
        duration := time.Since(start)
        metrics.RecordCalculationTime(duration)
    }()
    
    calculator := cvss.NewCalculator(vector)
    return calculator.Calculate()
}

相关文档 ​

Released under the MIT License.