4、CVSS实战计算:从向量到分数的完整链路
CVSS 分数,说白了就是一张「漏洞严重程度」的成绩单。但很多人拿到向量字符串后,要么直接丢给计算器,要么凭感觉估个分。我个人习惯是——先手算一遍,再用工具验证。这样既能理解分数的构成,也能发现那些「看起来低分、实际很危险」的误判场景。
这一节,我带你把 CVSS 的计算流程走一遍。从解析向量字符串开始,到手动计算基础分,再到用在线计算器验证,最后聊聊那些容易翻车的坑。
4.1 向量字符串解析:一眼看懂每个字母的含义
先看一个真实的 CVSS v3.1 向量字符串:
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
这串东西看起来像乱码,其实结构很清晰。它由三部分组成:
- 版本标识:
CVSS:3.1,告诉你是哪个版本的评分体系 - 基础指标:
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H,这是分数的核心 - 分隔符:斜杠
/把每个指标隔开
每个指标都是一个缩写 + 一个值。我整理了一张速查表,你对照着看就明白了:
| 指标 | 全称 | 可选值(按严重程度排序) |
|---|---|---|
| AV | 攻击向量 | N(网络)> A(相邻)> L(本地)> P(物理) |
| AC | 攻击复杂度 | L(低)> H(高) |
| PR | 权限要求 | N(无)> L(低)> H(高) |
| UI | 用户交互 | N(不需要)> R(需要) |
| S | 作用域 | U(不变)> C(改变) |
| C | 机密性影响 | H(高)> L(低)> N(无) |
| I | 完整性影响 | H(高)> L(低)> N(无) |
| A | 可用性影响 | H(高)> L(低)> N(无) |
AV 和 PR。这两个指标决定了漏洞的「可达性」。如果 AV:N 且 PR:N,基本可以判断这是一个远程无权限利用的漏洞,严重程度不会低。
4.2 手动计算基础分:一步步拆解公式
CVSS v3.1 的基础分计算,其实就三步。别被公式吓到,我带你手算一遍。
还是用刚才那个向量:CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
第一步:查表获取每个指标的数值
CVSS 官方给每个指标值都配了一个数字。我挑几个关键的:
AV:N→ 0.85AC:L→ 0.77PR:N→ 0.85UI:N→ 0.85S:U→ 作用域不变C:H→ 0.56I:H→ 0.56A:H→ 0.56
第二步:计算影响子分数(Impact Sub-Score)
因为作用域不变(S:U),公式是:
影响子分数 = 6.42 × (1 - (1 - C) × (1 - I) × (1 - A))
= 6.42 × (1 - (1 - 0.56) × (1 - 0.56) × (1 - 0.56))
= 6.42 × (1 - 0.44 × 0.44 × 0.44)
= 6.42 × (1 - 0.085)
= 6.42 × 0.915
= 5.874
第三步:计算可利用性子分数(Exploitability Sub-Score)
可利用性子分数 = 8.22 × AV × AC × PR × UI
= 8.22 × 0.85 × 0.77 × 0.85 × 0.85
= 8.22 × 0.473
= 3.888
第四步:计算基础分
因为影响子分数(5.874)大于 0,且作用域不变,公式是:
基础分 = 取整(最小值(影响子分数 + 可利用性子分数, 10))
= 取整(最小值(5.874 + 3.888, 10))
= 取整(9.762)
= 9.8
4.3 利用在线计算器验证:别信自己的手算
手算容易出错。我每次算完,都会用在线计算器验证一遍。推荐两个工具:
- NVD CVSS Calculator(nvd.nist.gov/vuln-metrics/cvss/v3-calculator)
- FIRST CVSS Calculator(www.first.org/cvss/calculator/3.1)
操作很简单:把向量字符串粘贴进去,点计算,分数就出来了。我验证了一下刚才的结果,确实是 9.8。
4.4 常见误判场景:这些坑我踩过
做漏洞优先级评估这么多年,我见过太多「分数看着低,实际危害大」的情况。下面这几个场景,你一定要注意。
场景一:忽略作用域变化(S:C)
我曾经遇到一个漏洞,向量是 AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N。手算时我按 S:U 的公式算,得了个 7.5。后来用计算器一算,发现是 8.6。
为什么会这样?因为作用域变化(S:C)时,影响子分数的计算公式完全不同,会乘以一个 1.08 的系数。说白了,漏洞能从低权限环境影响到高权限环境,危害自然更大。
场景二:忽略攻击复杂度(AC:H)
有些漏洞虽然攻击向量是网络(AV:N),但攻击复杂度高(AC:H)。比如需要精确的时间窗口、特定的内存布局。这种漏洞的基础分会被拉低不少。
我记得有个 Apache Log4j 的变种,就是 AC:H。很多人一看 AV:N 就给了 10 分,其实实际分数只有 6.5 左右。你想想看,如果按 10 分去排优先级,可能会浪费大量精力在实际上很难利用的漏洞上。
场景三:忽略用户交互(UI:R)
需要用户交互的漏洞,分数会打折扣。比如一个钓鱼链接,需要用户点击才能触发。虽然危害可能很大,但 CVSS 分数不会太高。
我见过一个团队,把所有 UI:R 的漏洞都标记为「低风险」。结果有个漏洞是「点击一次即可远程执行代码」,虽然分数只有 6.1,但在他们的业务场景下,用户点击链接的概率极高。嗯,这里要注意:CVSS 分数是通用评分,不代表实际风险。
场景四:忽略时间指标和环境指标
基础分只是起点。真正做优先级评估时,一定要加上时间指标(E、RL、RC)和环境指标(CR、IR、AR、MAV、MAC 等)。
举个例子:一个基础分 7.5 的漏洞,如果已经有公开的利用代码(E:H),且你的系统是面向公网的(MAV:N),最终的环境分可能飙升到 9.0 以上。反之,如果漏洞只在理论层面(E:U),且你的系统有严格的网络隔离(MAV:L),环境分可能降到 4.0 以下。
4.5 知识体系总览
下面这张图,把 CVSS 实战计算的整个流程串起来了。你可以把它当作一个检查清单:
这张图把整个计算链路分成了六个步骤,外加一个「常见误判」的提醒。你每次做 CVSS 计算时,可以对照着走一遍,确保没有遗漏。