时间指标示例
本示例演示如何使用 CVSS 时间指标,这些指标反映随时间变化的漏洞特征。
概述
时间指标允许您根据以下因素调整 CVSS 分数:
- 漏洞利用代码成熟度 (E) - 漏洞利用代码的可用性和复杂程度
- 修复级别 (RL) - 修复或变通方法的可用性
- 报告可信度 (RC) - 对漏洞报告的信心程度
这些指标有助于通过考虑当前威胁环境提供更准确的风险评估。
基本时间指标
理解时间指标
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"
// 带时间指标的相同向量
temporalVector := "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H/E:F/RL:O/RC:C"
fmt.Println("=== 时间指标影响 ===")
// 解析并计算基础分数
baseParser := parser.NewCvss3xParser(baseVector)
baseParsed, err := baseParser.Parse()
if err != nil {
log.Fatal(err)
}
baseCalc := cvss.NewCalculator(baseParsed)
baseScore, _ := baseCalc.Calculate()
// 解析并计算时间分数
temporalParser := parser.NewCvss3xParser(temporalVector)
temporalParsed, err := temporalParser.Parse()
if err != nil {
log.Fatal(err)
}
temporalCalc := cvss.NewCalculator(temporalParsed)
temporalScore, _ := temporalCalc.Calculate()
fmt.Printf("基础向量: %s\n", baseVector)
fmt.Printf("基础分数: %.1f (%s)\n", baseScore, baseCalc.GetSeverityRating(baseScore))
fmt.Printf("\n时间向量: %s\n", temporalVector)
fmt.Printf("时间分数: %.1f (%s)\n", temporalScore, temporalCalc.GetSeverityRating(temporalScore))
fmt.Printf("分数降低: %.1f 分\n", baseScore-temporalScore)
}
时间指标分解
go
func analyzeTemporalMetrics(vector *cvss.Cvss3x) {
if !vector.HasTemporal() {
fmt.Println("没有时间指标")
return
}
fmt.Println("=== 时间指标分析 ===")
temporal := vector.Cvss3xTemporal
// 漏洞利用代码成熟度
if temporal.ExploitCodeMaturity != nil {
fmt.Printf("漏洞利用代码成熟度: %s (%c)\n",
temporal.ExploitCodeMaturity.GetLongValue(),
temporal.ExploitCodeMaturity.GetShortValue())
fmt.Printf(" 分数乘数: %.2f\n", temporal.ExploitCodeMaturity.GetScore())
fmt.Printf(" 描述: %s\n", temporal.ExploitCodeMaturity.GetDescription())
}
// 修复级别
if temporal.RemediationLevel != nil {
fmt.Printf("\n修复级别: %s (%c)\n",
temporal.RemediationLevel.GetLongValue(),
temporal.RemediationLevel.GetShortValue())
fmt.Printf(" 分数乘数: %.2f\n", temporal.RemediationLevel.GetScore())
fmt.Printf(" 描述: %s\n", temporal.RemediationLevel.GetDescription())
}
// 报告可信度
if temporal.ReportConfidence != nil {
fmt.Printf("\n报告可信度: %s (%c)\n",
temporal.ReportConfidence.GetLongValue(),
temporal.ReportConfidence.GetShortValue())
fmt.Printf(" 分数乘数: %.2f\n", temporal.ReportConfidence.GetScore())
fmt.Printf(" 描述: %s\n", temporal.ReportConfidence.GetDescription())
}
}
漏洞利用代码成熟度 (E)
不同成熟度级别
go
func demonstrateExploitMaturity() {
baseVector := "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"
exploitLevels := map[string]string{
"未定义": baseVector + "/E:X",
"未证实": baseVector + "/E:U",
"概念验证": baseVector + "/E:P",
"功能性": baseVector + "/E:F",
"高成熟度": baseVector + "/E:H",
}
fmt.Println("=== 漏洞利用代码成熟度影响 ===")
for level, vectorStr := range exploitLevels {
parser := parser.NewCvss3xParser(vectorStr)
vector, err := parser.Parse()
if err != nil {
continue
}
calculator := cvss.NewCalculator(vector)
score, _ := calculator.Calculate()
fmt.Printf("%-12s: %.1f", level, score)
if vector.HasTemporal() && vector.Cvss3xTemporal.ExploitCodeMaturity != nil {
multiplier := vector.Cvss3xTemporal.ExploitCodeMaturity.GetScore()
fmt.Printf(" (乘数: %.2f)", multiplier)
}
fmt.Println()
}
}
漏洞利用演化跟踪
go
func trackExploitEvolution(baseVector string) {
stages := []struct {
stage string
exploitCode string
description string
}{
{"发现阶段", "E:X", "漏洞刚被发现"},
{"研究阶段", "E:U", "研究人员正在调查"},
{"PoC发布", "E:P", "概念验证代码可用"},
{"工作漏洞利用", "E:F", "功能性漏洞利用代码可用"},
{"武器化", "E:H", "复杂的漏洞利用工具可用"},
}
fmt.Println("=== 漏洞利用演化时间线 ===")
fmt.Printf("基础向量: %s\n\n", baseVector)
for i, stage := range stages {
vectorStr := baseVector + "/" + stage.exploitCode
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, stage.stage)
fmt.Printf(" 向量: %s\n", vectorStr)
fmt.Printf(" 分数: %.1f (%s)\n", score, severity)
fmt.Printf(" 描述: %s\n", stage.description)
fmt.Println()
}
}
修复级别 (RL)
修复进展
go
func demonstrateRemediationLevels() {
baseVector := "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"
remediationLevels := map[string]string{
"未定义": baseVector + "/RL:X",
"官方修复": baseVector + "/RL:O",
"临时修复": baseVector + "/RL:T",
"变通方法": baseVector + "/RL:W",
"不可用": baseVector + "/RL:U",
}
fmt.Println("=== 修复级别影响 ===")
for level, vectorStr := range remediationLevels {
parser := parser.NewCvss3xParser(vectorStr)
vector, err := parser.Parse()
if err != nil {
continue
}
calculator := cvss.NewCalculator(vector)
score, _ := calculator.Calculate()
fmt.Printf("%-8s: %.1f", level, score)
if vector.HasTemporal() && vector.Cvss3xTemporal.RemediationLevel != nil {
multiplier := vector.Cvss3xTemporal.RemediationLevel.GetScore()
fmt.Printf(" (乘数: %.2f)", multiplier)
}
fmt.Println()
}
}
修复时间线
go
func trackRemediationProgress(baseVector string) {
timeline := []struct {
day int
remediation string
description string
}{
{0, "RL:U", "漏洞披露,无修复可用"},
{7, "RL:W", "变通方法发布"},
{14, "RL:T", "临时补丁发布"},
{30, "RL:O", "官方修复发布"},
}
fmt.Println("=== 修复时间线 ===")
fmt.Printf("基础向量: %s\n\n", baseVector)
for _, entry := range timeline {
vectorStr := baseVector + "/" + entry.remediation
parser := parser.NewCvss3xParser(vectorStr)
vector, _ := parser.Parse()
calculator := cvss.NewCalculator(vector)
score, _ := calculator.Calculate()
severity := calculator.GetSeverityRating(score)
fmt.Printf("第 %d 天: %s\n", entry.day, entry.description)
fmt.Printf(" 向量: %s\n", vectorStr)
fmt.Printf(" 分数: %.1f (%s)\n", score, severity)
fmt.Println()
}
}
报告可信度 (RC)
可信度级别
go
func demonstrateReportConfidence() {
baseVector := "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"
confidenceLevels := map[string]string{
"未定义": baseVector + "/RC:X",
"未知": baseVector + "/RC:U",
"合理": baseVector + "/RC:R",
"已确认": baseVector + "/RC:C",
}
fmt.Println("=== 报告可信度影响 ===")
for level, vectorStr := range confidenceLevels {
parser := parser.NewCvss3xParser(vectorStr)
vector, err := parser.Parse()
if err != nil {
continue
}
calculator := cvss.NewCalculator(vector)
score, _ := calculator.Calculate()
fmt.Printf("%-8s: %.1f", level, score)
if vector.HasTemporal() && vector.Cvss3xTemporal.ReportConfidence != nil {
multiplier := vector.Cvss3xTemporal.ReportConfidence.GetScore()
fmt.Printf(" (乘数: %.2f)", multiplier)
}
fmt.Println()
}
}
可信度演化
go
func trackConfidenceEvolution(baseVector string) {
stages := []struct {
stage string
confidence string
description string
}{
{"初始报告", "RC:U", "未验证的漏洞报告"},
{"分析阶段", "RC:R", "分析后的合理可信度"},
{"复现验证", "RC:C", "漏洞已确认并复现"},
}
fmt.Println("=== 可信度演化 ===")
fmt.Printf("基础向量: %s\n\n", baseVector)
for i, stage := range stages {
vectorStr := baseVector + "/" + stage.confidence
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, stage.stage)
fmt.Printf(" 向量: %s\n", vectorStr)
fmt.Printf(" 分数: %.1f (%s)\n", score, severity)
fmt.Printf(" 描述: %s\n", stage.description)
fmt.Println()
}
}
综合时间分析
完整时间场景
go
func analyzeTemporalScenarios() {
baseVector := "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"
scenarios := []struct {
name string
temporal string
description string
}{
{
"最坏情况",
"/E:H/RL:U/RC:C",
"高漏洞利用成熟度,无修复,已确认",
},
{
"最好情况",
"/E:U/RL:O/RC:R",
"未证实漏洞利用,官方修复,合理可信度",
},
{
"典型情况",
"/E:F/RL:T/RC:C",
"功能性漏洞利用,临时修复,已确认",
},
{
"早期阶段",
"/E:P/RL:W/RC:R",
"PoC可用,存在变通方法,合理可信度",
},
}
fmt.Println("=== 时间场景分析 ===")
fmt.Printf("基础向量: %s\n", baseVector)
baseParser := parser.NewCvss3xParser(baseVector)
baseVector_parsed, _ := baseParser.Parse()
baseCalc := cvss.NewCalculator(baseVector_parsed)
baseScore, _ := baseCalc.Calculate()
fmt.Printf("基础分数: %.1f\n\n", baseScore)
for _, scenario := range scenarios {
vectorStr := baseVector + scenario.temporal
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", scenario.name)
fmt.Printf(" 向量: %s\n", vectorStr)
fmt.Printf(" 分数: %.1f (%s)\n", score, severity)
fmt.Printf(" 降低: %.1f 分\n", reduction)
fmt.Printf(" 描述: %s\n", scenario.description)
fmt.Println()
}
}
时间分数计算
go
func explainTemporalCalculation(vector *cvss.Cvss3x) {
if !vector.HasTemporal() {
fmt.Println("没有时间指标可分析")
return
}
calculator := cvss.NewCalculator(vector)
// 获取各个分数
baseScore, _ := calculator.CalculateBaseScore()
temporalScore, _ := calculator.CalculateTemporalScore()
fmt.Println("=== 时间分数计算 ===")
fmt.Printf("基础分数: %.1f\n", baseScore)
temporal := vector.Cvss3xTemporal
// 显示乘数
eMultiplier := 1.0
if temporal.ExploitCodeMaturity != nil {
eMultiplier = temporal.ExploitCodeMaturity.GetScore()
}
rlMultiplier := 1.0
if temporal.RemediationLevel != nil {
rlMultiplier = temporal.RemediationLevel.GetScore()
}
rcMultiplier := 1.0
if temporal.ReportConfidence != nil {
rcMultiplier = temporal.ReportConfidence.GetScore()
}
fmt.Printf("\n时间乘数:\n")
fmt.Printf(" 漏洞利用代码成熟度: %.2f\n", eMultiplier)
fmt.Printf(" 修复级别: %.2f\n", rlMultiplier)
fmt.Printf(" 报告可信度: %.2f\n", rcMultiplier)
combinedMultiplier := eMultiplier * rlMultiplier * rcMultiplier
fmt.Printf(" 组合乘数: %.3f\n", combinedMultiplier)
fmt.Printf("\n计算:\n")
fmt.Printf(" 时间分数 = 基础分数 × 组合乘数\n")
fmt.Printf(" 时间分数 = %.1f × %.3f = %.1f\n",
baseScore, combinedMultiplier, temporalScore)
}
实际应用
随时间的风险评估
go
func assessRiskOverTime(baseVector string, days int) {
fmt.Println("=== 风险评估时间线 ===")
fmt.Printf("基础向量: %s\n\n", baseVector)
timeline := []struct {
day int
metrics string
event string
}{
{0, "/E:X/RL:U/RC:U", "漏洞发现"},
{1, "/E:U/RL:U/RC:R", "初始分析完成"},
{3, "/E:P/RL:U/RC:C", "PoC发布"},
{7, "/E:P/RL:W/RC:C", "变通方法可用"},
{14, "/E:F/RL:W/RC:C", "工作漏洞利用发布"},
{21, "/E:F/RL:T/RC:C", "临时补丁可用"},
{30, "/E:H/RL:O/RC:C", "官方修复发布,漏洞利用武器化"},
}
for _, entry := range timeline {
if entry.day > days {
break
}
vectorStr := baseVector + entry.metrics
parser := parser.NewCvss3xParser(vectorStr)
vector, _ := parser.Parse()
calculator := cvss.NewCalculator(vector)
score, _ := calculator.Calculate()
severity := calculator.GetSeverityRating(score)
fmt.Printf("第 %2d 天: %s\n", entry.day, entry.event)
fmt.Printf(" 分数: %.1f (%s)\n", score, severity)
fmt.Printf(" 向量: %s\n", vectorStr)
fmt.Println()
}
}
漏洞生命周期管理
go
func manageVulnerabilityLifecycle(baseVector string) {
phases := []struct {
phase string
metrics string
actions []string
}{
{
"发现阶段",
"/E:X/RL:U/RC:U",
[]string{"验证漏洞", "评估影响", "通知利益相关者"},
},
{
"分析阶段",
"/E:U/RL:U/RC:R",
[]string{"开发变通方法", "制定修复计划", "监控漏洞利用"},
},
{
"利用阶段",
"/E:F/RL:W/RC:C",
[]string{"部署变通方法", "加速补丁开发", "增强监控"},
},
{
"修复阶段",
"/E:F/RL:O/RC:C",
[]string{"部署补丁", "验证修复", "更新文档"},
},
}
fmt.Println("=== 漏洞生命周期管理 ===")
fmt.Printf("基础向量: %s\n\n", baseVector)
for i, phase := range phases {
vectorStr := baseVector + phase.metrics
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, phase.phase)
fmt.Printf(" 分数: %.1f (%s)\n", score, severity)
fmt.Printf(" 向量: %s\n", vectorStr)
fmt.Printf(" 行动:\n")
for _, action := range phase.actions {
fmt.Printf(" - %s\n", action)
}
fmt.Println()
}
}
测试和验证
时间指标验证
go
func validateTemporalMetrics(vector *cvss.Cvss3x) []string {
var issues []string
if !vector.HasTemporal() {
return issues
}
temporal := vector.Cvss3xTemporal
// 验证漏洞利用代码成熟度
if temporal.ExploitCodeMaturity != nil {
value := temporal.ExploitCodeMaturity.GetShortValue()
if value != 'X' && value != 'U' && value != 'P' && value != 'F' && value != 'H' {
issues = append(issues, fmt.Sprintf("无效的漏洞利用代码成熟度: %c", value))
}
}
// 验证修复级别
if temporal.RemediationLevel != nil {
value := temporal.RemediationLevel.GetShortValue()
if value != 'X' && value != 'O' && value != 'T' && value != 'W' && value != 'U' {
issues = append(issues, fmt.Sprintf("无效的修复级别: %c", value))
}
}
// 验证报告可信度
if temporal.ReportConfidence != nil {
value := temporal.ReportConfidence.GetShortValue()
if value != 'X' && value != 'U' && value != 'R' && value != 'C' {
issues = append(issues, fmt.Sprintf("无效的报告可信度: %c", value))
}
}
return issues
}
下一步
掌握时间指标后,您可以探索: