Skip to content

⚖️ 风险评分

risk_scoring 模块将 CVSS、EPSS、KEV 收录与可达性综合为单一 0-10 的 OverallScoreRiskPriority。提供 RiskScorer 接口、默认加权实现、批量评分及排序/过滤辅助函数。

类型:RiskPriority

go
type RiskPriority string

枚举风险优先级。

常量类型
RiskPriorityCriticalRiskPriority"critical"
RiskPriorityHighRiskPriority"high"
RiskPriorityMediumRiskPriority"medium"
RiskPriorityLowRiskPriority"low"
RiskPriorityNoneRiskPriority"none"

类型:RiskScore

go
type RiskScore struct {
    Component       *SBOMComponent    // 被评估的组件
    OverallScore    float64           // 综合风险评分 (0-10)
    CVSSMax         float64           // 最高 CVSS 评分
    EPSSScore       float64           // EPSS 漏洞利用预测评分 (0.0-1.0)
    KEVListed       bool              // 是否在 CISA KEV 目录中
    ExploitMaturity string            // 漏洞利用成熟度
    Reachability    string            // 可达性
    Priority        RiskPriority      // 风险优先级
    Factors         map[string]float64 // 各因素贡献值
}

类型:RiskScorer

go
type RiskScorer interface {
    Score(findings []*VulnerabilityFinding, component *SBOMComponent) *RiskScore
}

风险评分器接口。实现根据组件的漏洞发现为其计算 RiskScore

类型:DefaultRiskScorer

go
type DefaultRiskScorer struct {
    CVSSWeight         float64 // CVSS 评分权重
    EPSSWeight         float64 // EPSS 评分权重
    KEVWeight          float64 // KEV 收录权重
    ReachabilityWeight float64 // 可达性权重
}

默认评分器以可配置权重综合 CVSS、EPSS、KEV 与可达性。

🆕 NewDefaultRiskScorer

go
func NewDefaultRiskScorer() *DefaultRiskScorer

创建一个默认评分器,权重为 CVSSWeight: 0.5EPSSWeight: 0.2KEVWeight: 0.2ReachabilityWeight: 0.1

返回值类型说明
#1*DefaultRiskScorer配置好的评分器
go
scorer := cpeskills.NewDefaultRiskScorer()

⚖️ Score

go
func (s *DefaultRiskScorer) Score(findings []*VulnerabilityFinding, component *SBOMComponent) *RiskScore

为单个组件计算 RiskScore。无发现时返回 Priority: RiskPriorityNone 的分数。否则提取最高 CVSS、最高 EPSS、是否 KEV 收录及可达性分数(direct → 1.0,transitive → 0.5),按权重计算 OverallScore(上限 10.0)。Factors map 记录 cvssepsskevreachability 的贡献。优先级由分数阈值与 KEV 状态决定。

参数类型说明
findings[]*VulnerabilityFinding组件的漏洞发现
component*SBOMComponent被评分的组件
返回值类型说明
#1*RiskScore计算得到的风险评分
go
score := scorer.Score(findings, comp)
fmt.Printf("%.1f %s\n", score.OverallScore, score.Priority)

⚖️ ScoreComponents

go
func ScoreComponents(components []*SBOMComponent, nvdData *NVDCPEData) []*RiskScore

为一批组件评分。对每个带 CPE 且 nvdData 非 nil 的组件,经 nvdData.FindCVEsForCPE 查询 CVE ID,包装为 VulnerabilityFindingReachability: "unknown"),再用新建的 DefaultRiskScorer 评分。

参数类型说明
components[]*SBOMComponent待评分的组件
nvdData*NVDCPEData用于 CVE 查询的 NVD 数据(可为 nil)
返回值类型说明
#1[]*RiskScore风险评分,每组件一条
go
scores := cpeskills.ScoreComponents(sbom.Components, nvdData)

↕️ SortByRisk

go
func SortByRisk(scores []*RiskScore)

OverallScore 降序原地排序。

参数类型说明
scores[]*RiskScore待原地排序的切片
go
cpeskills.SortByRisk(scores)

🔍 FilterByPriority

go
func FilterByPriority(scores []*RiskScore, priority RiskPriority) []*RiskScore

返回 Priority 等于 priority 的评分。

参数类型说明
scores[]*RiskScore输入评分
priorityRiskPriority目标优先级
返回值类型说明
#1[]*RiskScore匹配的评分
go
critical := cpeskills.FilterByPriority(scores, cpeskills.RiskPriorityCritical)

风险评分流水线

Released under the MIT License.