4. 漏洞评估与优先级排序:CVSS评分机制、EPSS利用概率评估、自定义优先级算法
漏洞扫出来一大堆,然后呢?
这是我在很多企业里看到的真实场景——安全团队手里攥着几百上千个漏洞,却不知道先修哪个。修了不重要的,重要的没修,结果被攻击者钻了空子。
说白了,漏洞评估就是回答一个问题:哪个漏洞最该先修?
这一章,我带你拆解三种主流方法:CVSS、EPSS,以及我自己在项目中常用的自定义优先级算法。
4.1 CVSS评分机制——基础分、时间分、环境分
CVSS(Common Vulnerability Scoring System)是目前最通用的漏洞评分标准。目前主流是CVSS v3.1,我习惯把它拆成三部分来看。
4.1.1 基础指标(Base Metrics)
这部分是固定的,跟漏洞本身有关,跟你的环境无关。包含两个维度:
- 可利用性(Exploitability):攻击者要什么条件才能利用?比如是否需要认证、是否需要用户交互、攻击路径是网络还是本地。
- 影响(Impact):利用成功后,对机密性、完整性、可用性造成多大损害。
基础分范围是0.0到10.0。举个例子,一个远程无需认证、能直接拿root权限的漏洞,基础分基本在9.0以上。
关键点:基础分只反映漏洞本身的严重程度,不代表它在你的环境里有多危险。
4.1.2 时间指标(Temporal Metrics)
这部分会随时间变化。我记得有一次,一个Apache Struts2的漏洞刚出来时CVSS是7.5,但两周后PoC公开了,分数涨到了9.3。
时间指标包括:
- 利用代码成熟度:从无PoC到有成熟武器化代码
- 补丁状态:官方是否已发布修复
- 报告可信度:漏洞是否被确认
4.1.3 环境指标(Environmental Metrics)
这才是真正跟你相关的部分。同样的漏洞,在DMZ区和核心数据库区,风险完全不同。
环境指标让你调整:
- 安全要求:你的业务对机密性、完整性、可用性的要求等级
- 缓解措施:是否已有WAF、ACL等防护
我建议你直接用NVD(National Vulnerability Database)提供的CVSS计算器,输入你的环境参数,得到最终分。
我的习惯:在自动化流程里,我会把CVSS环境分作为初始权重,但不会完全依赖它。原因很简单——CVSS不考虑漏洞被利用的概率。
4.2 EPSS利用概率评估——从“严重”到“可能被攻击”
CVSS告诉你漏洞有多严重,但没告诉你它会不会被利用。
EPSS(Exploit Prediction Scoring System)就是干这个的。它基于历史数据、威胁情报、攻击趋势,预测一个漏洞在未来30天内被利用的概率。
4.2.1 EPSS的工作原理
EPSS模型分析了几百个特征,包括:
- 漏洞是否出现在CISA KEV(已知被利用漏洞目录)
- 是否有公开PoC
- 漏洞类型(RCE、SQL注入等)
- CVSS分数
- 发布时间
输出是一个0到1的概率值。比如EPSS=0.95,意味着这个漏洞有95%的概率在未来30天内被利用。
我曾经踩过的坑:EPSS不是万能的。它基于统计,对于新出的0day,EPSS可能很低甚至为0,因为缺乏历史数据。这时候不能只看EPSS,要结合威胁情报。
4.2.2 CVSS vs EPSS:怎么配合用?
| 维度 | CVSS | EPSS |
|---|---|---|
| 评估对象 | 漏洞本身的严重性 | 漏洞被利用的概率 |
| 数据来源 | 专家分析、标准定义 | 历史攻击数据、威胁情报 |
| 时效性 | 相对稳定 | 动态更新(每天) |
| 适用场景 | 初始筛选、合规要求 | 优先级排序、资源分配 |
我个人习惯是:先用CVSS做粗筛,再用EPSS做精排。CVSS 9.0以上但EPSS低于0.1的漏洞,我会标记为“高严重低风险”,排在后面修。
4.3 自定义优先级算法——把CVSS和EPSS揉在一起
光靠CVSS和EPSS还不够。为什么?
你想想看,一个CVSS 7.5、EPSS 0.8的漏洞,打在一台互联网暴露的Web服务器上,跟打在内网测试机上,优先级能一样吗?
所以,我建议你构建自己的优先级算法。下面是我在项目中用过的公式:
Priority_Score = (CVSS_Env_Score × W1) + (EPSS_Score × 100 × W2) + (Asset_Criticality × W3) + (Exposure_Factor × W4)
参数说明:
- CVSS_Env_Score:经过环境调整后的CVSS分数(0-10)
- EPSS_Score:EPSS概率值(0-1),乘以100是为了跟CVSS量级对齐
- Asset_Criticality:资产重要性(1-10),由资产管理系统提供
- Exposure_Factor:暴露因子(0-1),比如是否公网可达、是否可远程利用
- W1-W4:权重,总和为1,根据你的业务场景调整
我的经验:在金融行业,我会把W3(资产重要性)设到0.4,因为核心交易系统的漏洞哪怕CVSS只有6.0,也得优先修。在互联网公司,W4(暴露因子)可能更重要。
4.3.1 一个真实案例
我记得有一次,某客户同时收到两个漏洞:
- 漏洞A:CVSS 9.8,EPSS 0.95,打在一台公网Nginx反向代理上(资产重要性5,暴露因子0.9)
- 漏洞B:CVSS 7.5,EPSS 0.3,打在内网核心数据库上(资产重要性10,暴露因子0.1)
用我的算法(W1=0.3, W2=0.3, W3=0.2, W4=0.2):
漏洞A: (9.8×0.3) + (0.95×100×0.3) + (5×0.2) + (0.9×0.2) = 2.94 + 28.5 + 1.0 + 0.18 = 32.62
漏洞B: (7.5×0.3) + (0.3×100×0.3) + (10×0.2) + (0.1×0.2) = 2.25 + 9.0 + 2.0 + 0.02 = 13.27
结果很明显:漏洞A的优先级远高于漏洞B。虽然漏洞B在核心数据库上,但它的利用概率低、暴露面小,所以排在后面。
4.4 自动化优先级排序流程
手动算太慢了。在自动化流程里,我通常这样设计:
- 数据采集:从扫描器、资产管理系统、威胁情报源获取漏洞列表、资产信息、EPSS数据
- CVSS环境分计算:根据资产所在网络区域、安全要求,自动调整CVSS分数
- EPSS查询:调用FIRST.org的EPSS API,获取每个漏洞的利用概率
- 自定义算法计算:用上面提到的公式,算出每个漏洞的Priority_Score
- 排序与分桶:按分数从高到低排序,分成P0(立即修复)、P1(24小时内)、P2(一周内)、P3(下一轮)
- 自动派单:将P0/P1漏洞自动创建工单,分配给对应资产负责人
下面是我画的一个流程图,帮你理解整个逻辑:
4.5 避坑指南
最后,分享几个我踩过的坑:
- 别只看CVSS基础分:我见过有人直接拿NVD的CVSS基础分排序,结果把内网低风险漏洞排到了公网高风险漏洞前面。一定要用环境分。
- EPSS不是银弹:对于新出的0day,EPSS可能为0。这时候要结合威胁情报、厂商公告、社区讨论来判断。
- 权重需要持续调优:我刚开始设的权重是W1=0.4, W2=0.3, W3=0.2, W4=0.1。跑了三个月发现暴露因子权重太低,导致公网漏洞被低估。后来调成了W1=0.3, W2=0.3, W3=0.2, W4=0.2,效果好了很多。
- 别忘了业务上下文:同一个漏洞,在核心交易系统和在测试环境,优先级完全不同。资产重要性一定要从CMDB或资产管理系统自动获取,别手动填。
我曾经犯过的错:有一次我完全依赖自动化排序,结果一个CVSS 6.5、EPSS 0.2的漏洞被排到了P3。但那个漏洞打在一台暴露在公网的VPN网关上,而且我们当时正在被APT组织盯上。后来我加了一个“强制提升”规则:如果漏洞涉及VPN、堡垒机、AD域控等关键基础设施,自动提升一个优先级等级。