Skip to content

环境指标示例

本示例演示如何使用 CVSS 环境指标,这些指标允许分析师根据受影响 IT 资产的重要性和特定环境中安全控制的有效性来定制 CVSS 分数。

概述

环境指标包含两个类别:

环境需求:

  • 机密性需求 (CR) - 机密性对组织的重要性
  • 完整性需求 (IR) - 完整性对组织的重要性
  • 可用性需求 (AR) - 可用性对组织的重要性

修改的基础指标:

  • 所有基础指标都可以修改以反映环境因素
  • 前缀为"M"(例如,MAV、MAC、MPR等)

基本环境指标

理解环境影响

go
package main

import (
    "fmt"
    "log"

    "github.com/scagogogo/cvss-parser/pkg/cvss"
    "github.com/scagogogo/cvss-parser/pkg/parser"
)

func main() {
    // 基础向量
    baseVector := "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"
    
    // 带需求的环境向量
    envVector := "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H/CR:H/IR:H/AR:H"
    
    // 带修改基础指标的环境向量
    modifiedVector := "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H/CR:H/IR:H/AR:H/MAV:L/MAC:H/MPR:H/MUI:R/MS:C/MC:H/MI:H/MA:H"

    fmt.Println("=== 环境指标影响 ===")
    
    // 计算基础分数
    baseParser := parser.NewCvss3xParser(baseVector)
    baseParsed, err := baseParser.Parse()
    if err != nil {
        log.Fatal(err)
    }

    baseCalc := cvss.NewCalculator(baseParsed)
    baseScore, _ := baseCalc.Calculate()

    // 计算仅带需求的环境分数
    envParser := parser.NewCvss3xParser(envVector)
    envParsed, err := envParser.Parse()
    if err != nil {
        log.Fatal(err)
    }

    envCalc := cvss.NewCalculator(envParsed)
    envScore, _ := envCalc.Calculate()

    // 计算带修改指标的环境分数
    modParser := parser.NewCvss3xParser(modifiedVector)
    modParsed, err := modParser.Parse()
    if err != nil {
        log.Fatal(err)
    }

    modCalc := cvss.NewCalculator(modParsed)
    modScore, _ := modCalc.Calculate()

    fmt.Printf("基础向量: %s\n", baseVector)
    fmt.Printf("基础分数: %.1f (%s)\n", baseScore, baseCalc.GetSeverityRating(baseScore))
    
    fmt.Printf("\n环境(需求): %s\n", envVector)
    fmt.Printf("环境分数: %.1f (%s)\n", envScore, envCalc.GetSeverityRating(envScore))
    fmt.Printf("分数变化: %+.1f\n", envScore-baseScore)
    
    fmt.Printf("\n环境(修改): %s\n", modifiedVector)
    fmt.Printf("环境分数: %.1f (%s)\n", modScore, modCalc.GetSeverityRating(modScore))
    fmt.Printf("分数变化: %+.1f\n", modScore-baseScore)
}

环境指标分解

go
func analyzeEnvironmentalMetrics(vector *cvss.Cvss3x) {
    if !vector.HasEnvironmental() {
        fmt.Println("没有环境指标")
        return
    }

    fmt.Println("=== 环境指标分析 ===")
    
    env := vector.Cvss3xEnvironmental
    
    // 需求
    fmt.Println("需求:")
    if env.ConfidentialityRequirement != nil {
        fmt.Printf("  机密性需求: %s (%c) - %.2f\n",
            env.ConfidentialityRequirement.GetLongValue(),
            env.ConfidentialityRequirement.GetShortValue(),
            env.ConfidentialityRequirement.GetScore())
    }
    
    if env.IntegrityRequirement != nil {
        fmt.Printf("  完整性需求: %s (%c) - %.2f\n",
            env.IntegrityRequirement.GetLongValue(),
            env.IntegrityRequirement.GetShortValue(),
            env.IntegrityRequirement.GetScore())
    }
    
    if env.AvailabilityRequirement != nil {
        fmt.Printf("  可用性需求: %s (%c) - %.2f\n",
            env.AvailabilityRequirement.GetLongValue(),
            env.AvailabilityRequirement.GetShortValue(),
            env.AvailabilityRequirement.GetScore())
    }

    // 修改的基础指标
    fmt.Println("\n修改的基础指标:")
    if env.ModifiedAttackVector != nil {
        fmt.Printf("  修改的攻击向量: %s (%c)\n",
            env.ModifiedAttackVector.GetLongValue(),
            env.ModifiedAttackVector.GetShortValue())
    }
    
    if env.ModifiedAttackComplexity != nil {
        fmt.Printf("  修改的攻击复杂度: %s (%c)\n",
            env.ModifiedAttackComplexity.GetLongValue(),
            env.ModifiedAttackComplexity.GetShortValue())
    }
    
    // ... 其他修改指标
}

环境需求

需求级别影响

go
func demonstrateRequirementLevels() {
    baseVector := "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"
    
    requirements := []struct {
        name   string
        suffix string
        desc   string
    }{
        {"低需求", "/CR:L/IR:L/AR:L", "低重要性环境"},
        {"中等需求", "/CR:M/IR:M/AR:M", "中等重要性环境"},
        {"高需求", "/CR:H/IR:H/AR:H", "高重要性环境"},
        {"混合需求", "/CR:H/IR:M/AR:L", "混合重要性级别"},
    }

    fmt.Println("=== 环境需求影响 ===")
    fmt.Printf("基础向量: %s\n\n", baseVector)

    // 计算基础分数
    baseParser := parser.NewCvss3xParser(baseVector)
    baseParsed, _ := baseParser.Parse()
    baseCalc := cvss.NewCalculator(baseParsed)
    baseScore, _ := baseCalc.Calculate()

    fmt.Printf("基础分数: %.1f\n\n", baseScore)

    for _, req := range requirements {
        vectorStr := baseVector + req.suffix
        
        parser := parser.NewCvss3xParser(vectorStr)
        vector, _ := parser.Parse()
        
        calculator := cvss.NewCalculator(vector)
        score, _ := calculator.Calculate()
        severity := calculator.GetSeverityRating(score)
        change := score - baseScore

        fmt.Printf("%-12s: %.1f (%s) [%+.1f]\n", req.name, score, severity, change)
        fmt.Printf("  %s\n", req.desc)
        fmt.Printf("  向量: %s\n", vectorStr)
        fmt.Println()
    }
}

组织上下文示例

go
func demonstrateOrganizationalContexts() {
    baseVector := "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"
    
    contexts := []struct {
        organization string
        requirements string
        rationale    string
    }{
        {
            "金融机构",
            "/CR:H/IR:H/AR:H",
            "所有方面对监管合规和客户信任都至关重要",
        },
        {
            "电商平台",
            "/CR:H/IR:H/AR:H",
            "客户数据保护和交易完整性至关重要",
        },
        {
            "内部开发",
            "/CR:M/IR:M/AR:L",
            "具有中等敏感性的开发环境",
        },
        {
            "公共网站",
            "/CR:L/IR:M/AR:H",
            "公共信息,但可用性对业务至关重要",
        },
        {
            "研究环境",
            "/CR:H/IR:M/AR:L",
            "敏感研究数据,但可用性不太关键",
        },
    }

    fmt.Println("=== 组织上下文示例 ===")
    fmt.Printf("基础向量: %s\n\n", baseVector)

    for _, context := range contexts {
        vectorStr := baseVector + context.requirements
        
        parser := parser.NewCvss3xParser(vectorStr)
        vector, _ := parser.Parse()
        
        calculator := cvss.NewCalculator(vector)
        score, _ := calculator.Calculate()
        severity := calculator.GetSeverityRating(score)

        fmt.Printf("组织: %s\n", context.organization)
        fmt.Printf("  分数: %.1f (%s)\n", score, severity)
        fmt.Printf("  需求: %s\n", context.requirements)
        fmt.Printf("  理由: %s\n", context.rationale)
        fmt.Println()
    }
}

修改的基础指标

安全控制影响

go
func demonstrateSecurityControls() {
    baseVector := "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"
    
    controls := []struct {
        name     string
        modified string
        desc     string
    }{
        {
            "网络分段",
            "/MAV:L",
            "网络控制将攻击向量限制为本地",
        },
        {
            "需要身份验证",
            "/MPR:H",
            "强身份验证控制到位",
        },
        {
            "用户培训",
            "/MUI:R",
            "用户意识培训需要交互",
        },
        {
            "数据加密",
            "/MC:L",
            "加密降低机密性影响",
        },
        {
            "备份系统",
            "/MA:L",
            "冗余系统降低可用性影响",
        },
        {
            "组合控制",
            "/MAV:L/MPR:H/MUI:R/MC:L/MI:L/MA:L",
            "实施多种安全控制",
        },
    }

    fmt.Println("=== 安全控制影响 ===")
    fmt.Printf("基础向量: %s\n\n", baseVector)

    // 计算基础分数
    baseParser := parser.NewCvss3xParser(baseVector)
    baseParsed, _ := baseParser.Parse()
    baseCalc := cvss.NewCalculator(baseParsed)
    baseScore, _ := baseCalc.Calculate()

    fmt.Printf("基础分数: %.1f\n\n", baseScore)

    for _, control := range controls {
        vectorStr := baseVector + "/CR:H/IR:H/AR:H" + control.modified
        
        parser := parser.NewCvss3xParser(vectorStr)
        vector, _ := parser.Parse()
        
        calculator := cvss.NewCalculator(vector)
        score, _ := calculator.Calculate()
        severity := calculator.GetSeverityRating(score)
        reduction := baseScore - score

        fmt.Printf("控制: %s\n", control.name)
        fmt.Printf("  分数: %.1f (%s) [%.1f 降低]\n", score, severity, reduction)
        fmt.Printf("  修改: %s\n", control.modified)
        fmt.Printf("  描述: %s\n", control.desc)
        fmt.Println()
    }
}

纵深防御分析

go
func analyzeDefenseInDepth() {
    baseVector := "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"
    
    layers := []struct {
        layer    string
        controls string
        desc     string
    }{
        {
            "无控制",
            "",
            "没有控制的基线漏洞",
        },
        {
            "边界安全",
            "/MAV:A",
            "防火墙限制访问到相邻网络",
        },
        {
            "访问控制",
            "/MAV:A/MPR:L",
            "需要基本身份验证",
        },
        {
            "增强身份验证",
            "/MAV:A/MPR:H",
            "实施多因素身份验证",
        },
        {
            "用户意识",
            "/MAV:A/MPR:H/MUI:R",
            "用户培训减少社会工程",
        },
        {
            "数据保护",
            "/MAV:A/MPR:H/MUI:R/MC:L/MI:L",
            "加密和完整性控制",
        },
        {
            "全面防御",
            "/MAV:L/MAC:H/MPR:H/MUI:R/MS:U/MC:L/MI:L/MA:L",
            "全面的安全控制",
        },
    }

    fmt.Println("=== 纵深防御分析 ===")
    fmt.Printf("基础向量: %s\n\n", baseVector)

    for i, layer := range layers {
        vectorStr := baseVector + "/CR:H/IR:H/AR:H" + layer.controls
        
        parser := parser.NewCvss3xParser(vectorStr)
        vector, _ := parser.Parse()
        
        calculator := cvss.NewCalculator(vector)
        score, _ := calculator.Calculate()
        severity := calculator.GetSeverityRating(score)

        fmt.Printf("层 %d: %s\n", i+1, layer.layer)
        fmt.Printf("  分数: %.1f (%s)\n", score, severity)
        fmt.Printf("  控制: %s\n", layer.controls)
        fmt.Printf("  描述: %s\n", layer.desc)
        fmt.Println()
    }
}

环境分数计算

详细计算分解

go
func explainEnvironmentalCalculation(vector *cvss.Cvss3x) {
    if !vector.HasEnvironmental() {
        fmt.Println("没有环境指标可分析")
        return
    }

    calculator := cvss.NewCalculator(vector)
    
    // 获取各个分数
    baseScore, _ := calculator.CalculateBaseScore()
    envScore, _ := calculator.CalculateEnvironmentalScore()

    fmt.Println("=== 环境分数计算 ===")
    fmt.Printf("基础分数: %.1f\n", baseScore)
    
    env := vector.Cvss3xEnvironmental
    
    // 显示需求乘数
    crMultiplier := 1.0
    if env.ConfidentialityRequirement != nil {
        crMultiplier = env.ConfidentialityRequirement.GetScore()
    }
    
    irMultiplier := 1.0
    if env.IntegrityRequirement != nil {
        irMultiplier = env.IntegrityRequirement.GetScore()
    }
    
    arMultiplier := 1.0
    if env.AvailabilityRequirement != nil {
        arMultiplier = env.AvailabilityRequirement.GetScore()
    }

    fmt.Printf("\n需求乘数:\n")
    fmt.Printf("  机密性需求: %.1f\n", crMultiplier)
    fmt.Printf("  完整性需求: %.1f\n", irMultiplier)
    fmt.Printf("  可用性需求: %.1f\n", arMultiplier)
    
    // 检查修改的基础指标
    hasModified := env.ModifiedAttackVector != nil ||
                   env.ModifiedAttackComplexity != nil ||
                   env.ModifiedPrivilegesRequired != nil ||
                   env.ModifiedUserInteraction != nil ||
                   env.ModifiedScope != nil ||
                   env.ModifiedConfidentialityImpact != nil ||
                   env.ModifiedIntegrityImpact != nil ||
                   env.ModifiedAvailabilityImpact != nil

    if hasModified {
        fmt.Printf("\n存在修改的基础指标:\n")
        fmt.Printf("  使用修改指标计算环境分数\n")
    }
    
    fmt.Printf("\n最终环境分数: %.1f\n", envScore)
}

逐步计算

go
func stepByStepEnvironmentalCalculation() {
    baseVector := "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"
    envVector := baseVector + "/CR:H/IR:M/AR:L/MAV:L/MC:L"
    
    fmt.Println("=== 逐步环境计算 ===")
    fmt.Printf("向量: %s\n\n", envVector)
    
    parser := parser.NewCvss3xParser(envVector)
    vector, _ := parser.Parse()
    
    calculator := cvss.NewCalculator(vector)
    
    // 步骤1:计算修改的基础分数
    fmt.Println("步骤1:计算修改的基础分数")
    fmt.Println("  使用提供的修改指标:")
    fmt.Println("  - 修改的攻击向量: 本地(而不是网络)")
    fmt.Println("  - 修改的机密性: 低(而不是高)")
    
    // 步骤2:应用环境需求
    fmt.Println("\n步骤2:应用环境需求")
    fmt.Println("  - 机密性需求: 高 (1.5x)")
    fmt.Println("  - 完整性需求: 中等 (1.0x)")
    fmt.Println("  - 可用性需求: 低 (0.5x)")
    
    // 步骤3:最终计算
    envScore, _ := calculator.CalculateEnvironmentalScore()
    fmt.Printf("\n步骤3:最终环境分数: %.1f\n", envScore)
}

实际应用

按环境的风险评估

go
func assessRiskByEnvironment(baseVector string) {
    environments := []struct {
        name         string
        requirements string
        controls     string
        description  string
    }{
        {
            "生产DMZ",
            "/CR:H/IR:H/AR:H",
            "/MAV:A/MPR:L",
            "面向互联网的生产环境,具有基本控制",
        },
        {
            "内部生产",
            "/CR:H/IR:H/AR:H", 
            "/MAV:L/MPR:H/MUI:R",
            "具有强访问控制的内部生产",
        },
        {
            "开发环境",
            "/CR:M/IR:M/AR:L",
            "/MAV:L/MPR:L",
            "具有测试数据的开发环境",
        },
        {
            "隔离测试实验室",
            "/CR:L/IR:L/AR:L",
            "/MAV:L/MAC:H/MPR:H",
            "隔离的测试环境",
        },
    }

    fmt.Println("=== 按环境的风险评估 ===")
    fmt.Printf("基础向量: %s\n\n", baseVector)

    for _, env := range environments {
        vectorStr := baseVector + env.requirements + env.controls
        
        parser := parser.NewCvss3xParser(vectorStr)
        vector, _ := parser.Parse()
        
        calculator := cvss.NewCalculator(vector)
        score, _ := calculator.Calculate()
        severity := calculator.GetSeverityRating(score)

        fmt.Printf("环境: %s\n", env.name)
        fmt.Printf("  分数: %.1f (%s)\n", score, severity)
        fmt.Printf("  需求: %s\n", env.requirements)
        fmt.Printf("  控制: %s\n", env.controls)
        fmt.Printf("  描述: %s\n", env.description)
        fmt.Println()
    }
}

控制有效性分析

go
func analyzeControlEffectiveness(baseVector string) {
    controls := []struct {
        control     string
        investment  string
        reduction   string
        description string
    }{
        {
            "基本防火墙",
            "低",
            "/MAV:A",
            "网络边界保护",
        },
        {
            "WAF + IPS",
            "中等",
            "/MAV:A/MAC:H",
            "Web应用防火墙和入侵防护",
        },
        {
            "零信任",
            "高",
            "/MAV:L/MPR:H/MUI:R",
            "零信任架构实施",
        },
        {
            "完整安全栈",
            "非常高",
            "/MAV:L/MAC:H/MPR:H/MUI:R/MC:L/MI:L/MA:L",
            "全面的安全控制",
        },
    }

    fmt.Println("=== 控制有效性分析 ===")
    fmt.Printf("基础向量: %s\n\n", baseVector)

    // 计算基础分数
    baseParser := parser.NewCvss3xParser(baseVector)
    baseParsed, _ := baseParser.Parse()
    baseCalc := cvss.NewCalculator(baseParsed)
    baseScore, _ := baseCalc.Calculate()

    fmt.Printf("基础分数: %.1f\n\n", baseScore)

    for _, control := range controls {
        vectorStr := baseVector + "/CR:H/IR:H/AR:H" + control.reduction
        
        parser := parser.NewCvss3xParser(vectorStr)
        vector, _ := parser.Parse()
        
        calculator := cvss.NewCalculator(vector)
        score, _ := calculator.Calculate()
        severity := calculator.GetSeverityRating(score)
        reduction := baseScore - score
        effectiveness := (reduction / baseScore) * 100

        fmt.Printf("控制: %s\n", control.control)
        fmt.Printf("  投资: %s\n", control.investment)
        fmt.Printf("  分数: %.1f (%s)\n", score, severity)
        fmt.Printf("  降低: %.1f 分 (%.1f%% 有效)\n", reduction, effectiveness)
        fmt.Printf("  描述: %s\n", control.description)
        fmt.Println()
    }
}

测试和验证

环境指标验证

go
func validateEnvironmentalMetrics(vector *cvss.Cvss3x) []string {
    var issues []string

    if !vector.HasEnvironmental() {
        return issues
    }

    env := vector.Cvss3xEnvironmental

    // 验证需求指标
    if env.ConfidentialityRequirement != nil {
        value := env.ConfidentialityRequirement.GetShortValue()
        if value != 'X' && value != 'L' && value != 'M' && value != 'H' {
            issues = append(issues, fmt.Sprintf("无效的机密性需求: %c", value))
        }
    }

    if env.IntegrityRequirement != nil {
        value := env.IntegrityRequirement.GetShortValue()
        if value != 'X' && value != 'L' && value != 'M' && value != 'H' {
            issues = append(issues, fmt.Sprintf("无效的完整性需求: %c", value))
        }
    }

    if env.AvailabilityRequirement != nil {
        value := env.AvailabilityRequirement.GetShortValue()
        if value != 'X' && value != 'L' && value != 'M' && value != 'H' {
            issues = append(issues, fmt.Sprintf("无效的可用性需求: %c", value))
        }
    }

    // 验证修改的基础指标(类似基础指标验证)
    // ... 额外的验证逻辑

    return issues
}

下一步

掌握环境指标后,您可以探索:

相关文档

Released under the MIT License.