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.85
  • AC:L → 0.77
  • PR:N → 0.85
  • UI:N → 0.85
  • S:U → 作用域不变
  • C:H → 0.56
  • I:H → 0.56
  • A: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
关键结论:这个漏洞的基础分是 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。

注意:在线计算器有时会默认使用 CVSS v3.0 而不是 v3.1。虽然两者在基础分计算上几乎一致,但时间指标和环境指标有差异。记得确认版本。

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 实战计算流程 1. 解析向量字符串 AV/AC/PR/UI/S/C/I/A 2. 查表获取数值 每个指标对应一个数字 3. 计算影响子分数 S:U 或 S:C 不同公式 4. 计算可利用性子分数 8.22 × AV × AC × PR × UI 5. 计算基础分 取整(最小值(影响+利用, 10)) 6. 在线计算器验证 NVD / FIRST 工具 ⚠ 常见误判:忽略 S:C / AC:H / UI:R / 时间与环境指标 最终输出:基础分 + 时间分 + 环境分 用于补丁优先级排序

这张图把整个计算链路分成了六个步骤,外加一个「常见误判」的提醒。你每次做 CVSS 计算时,可以对照着走一遍,确保没有遗漏。