漏洞优先级排序原理:CVSS、EPSS与可利用性分析

各位同学,咱们今天聊点实在的。拿到一份SBOM,里面可能躺着几百上千个漏洞。你不可能全修,也没那个资源。那问题来了——先修哪个?

这就是漏洞优先级排序要干的事。说白了,就是给每个漏洞打个分,排个队,把最要命的拎出来。我个人习惯把这套逻辑拆成三块:CVSS、EPSS、还有可利用性分析。咱们一块一块说。

核心观点: 漏洞优先级不是拍脑袋,而是基于数据驱动的决策。CVSS看“严重程度”,EPSS看“被利用概率”,可利用性分析看“实际攻击条件”。三者结合,才能精准打击。

2.1 CVSS评分机制详解

CVSS,全称Common Vulnerability Scoring System,通用漏洞评分系统。目前主流是v3.1版本。它把漏洞的严重程度量化成一个0到10的分数。

我记得刚入行那会儿,团队里有人看到CVSS 9.0以上的漏洞就慌,恨不得连夜加班修。后来发现,有些高分漏洞其实根本打不进来。为什么?因为CVSS评的是“理论严重性”,不是“实际风险”。

CVSS评分由三个维度组成:

  • 基础指标(Base Metrics): 漏洞本身的固有属性,不会随时间变。包括攻击向量、攻击复杂度、权限要求、用户交互、影响范围、机密性/完整性/可用性影响。
  • 时间指标(Temporal Metrics): 随时间变化的因素,比如是否有公开利用代码、是否有官方补丁、漏洞是否被证实可利用。
  • 环境指标(Environmental Metrics): 跟你自己的环境相关,比如受影响组件在你的系统里是否关键、是否有缓解措施。

实际工作中,大多数团队只看了基础指标。这其实是个坑。你想想看,一个CVSS 9.8的漏洞,如果只影响一个你根本没部署的组件,那它对你来说就是0分。

我的建议: 在SBOM分析中,一定要结合环境指标重新计算CVSS。别直接用NVD上给的原始分。我见过太多团队被原始分带偏,浪费了大量精力在无关紧要的漏洞上。

下面这张图帮你理清CVSS评分的整体逻辑:

CVSS v3.1 评分结构图 CVSS 分数 (0-10) 基础指标 (Base) 时间指标 (Temporal) 环境指标 (Environmental) 攻击向量 (AV) 攻击复杂度 (AC) 权限要求 (PR) 用户交互 (UI) 影响范围 (S) C/I/A 影响 利用代码成熟度 (E) 补丁级别 (RL) 报告可信度 (RC) 安全需求 (CR/IR/AR) 修改后的基础指标 缓解措施 (M) 关键说明 • 基础指标:漏洞固有属性,不可改变 • 时间指标:随时间变化,需定期更新 • 环境指标:因环境而异,必须自定义

2.2 EPSS评分机制

CVSS有个硬伤——它不告诉你这个漏洞在真实世界里被利用的概率有多大。一个CVSS 7.5的漏洞,可能已经被黑客玩出花了;另一个CVSS 9.0的漏洞,可能发布三年了都没人碰。

EPSS就是来解决这个问题的。全称Exploit Prediction Scoring System,利用预测评分系统。它基于大量历史数据,用机器学习模型预测一个漏洞在未来30天内被利用的概率。

EPSS的分数范围是0到1(或0%到100%)。0.5%听起来不高对吧?但你要知道,所有漏洞里只有不到2%的EPSS分数超过0.5%。换句话说,EPSS > 0.5%的漏洞,已经是高危中的高危了。

注意: EPSS不是CVSS的替代品,而是补充。我曾经见过一个项目,团队只看EPSS,忽略了CVSS 9.0以上的漏洞,结果被一个低EPSS但高破坏力的漏洞搞崩了。两个指标要一起看。

EPSS的核心数据源包括:

  • CVE发布后的公开讨论热度(Twitter、GitHub、安全论坛)
  • PoC(概念验证代码)是否公开
  • 是否有在野利用报告
  • 漏洞类型和受影响产品的流行度

下面这个表格帮你对比CVSS和EPSS的核心差异:

维度 CVSS EPSS
评分范围 0 - 10 0 - 1 (0% - 100%)
核心目标 衡量漏洞严重程度 预测被利用概率
数据来源 专家评估 + 标准公式 机器学习 + 海量历史数据
更新频率 基本不变(除非重新评估) 每日更新
适用场景 漏洞分类、合规要求 优先级排序、资源分配
实战技巧: 我建议你在SBOM分析流程中,把CVSS >= 7.0 且 EPSS >= 0.5% 的漏洞标记为“立即处理”。这个组合拳能帮你过滤掉80%的噪音。我自己在几个大项目里验证过,效果很好。

2.3 漏洞可利用性分析

CVSS和EPSS给了你两个分数,但还不够。你还需要回答一个问题:这个漏洞在我的环境里,到底能不能被利用?

这就是可利用性分析要干的事。它关注的是攻击者实际需要满足的条件。我把它拆成四个维度:

  1. 攻击路径分析: 攻击者需要从哪个网络位置发起攻击?是否需要本地访问?是否需要用户交互?
  2. 前置条件检查: 漏洞利用是否需要特定配置?是否需要依赖其他漏洞?是否需要特定版本的依赖库?
  3. 利用复杂度评估: 是否有公开的PoC?利用代码是否需要定制?是否需要绕过某些缓解措施(如ASLR、DEP)?
  4. 影响范围确认: 漏洞利用成功后,攻击者能获得什么权限?能访问哪些数据?能否横向移动?

嗯,这里要注意。很多团队在做可利用性分析时,只看了第一点。但真正决定漏洞是否“可被利用”的,往往是第二点和第三点。

举个例子。我之前遇到过一个CVE,CVSS 8.8,EPSS 0.8%,看起来非常危险。但仔细分析后发现,这个漏洞需要攻击者已经拥有目标系统的低权限账号。而我们的系统做了严格的网络隔离和最小权限控制,外部攻击者根本拿不到那个低权限账号。所以这个漏洞在我们环境里的实际可利用性,几乎为零。

核心结论: 漏洞优先级 = f(CVSS, EPSS, 可利用性)。三个维度缺一不可。只靠任何一个单一指标做决策,都是在赌运气。

最后,我分享一个我在实际项目中用过的决策矩阵,帮你快速做优先级排序:

CVSS 等级 EPSS 等级 可利用性 建议操作
高 (≥7.0) 高 (≥0.5%) 高 立即修复,24小时内
高 (≥7.0) 低 (<0.5%) 高 计划修复,1周内
中 (4.0-6.9) 高 (≥0.5%) 中 计划修复,2周内
中 (4.0-6.9) 低 (<0.5%) 低 监控,下次迭代处理
低 (<4.0) 任意 任意 记录,定期复审