「CVSS 10.0」「CVSS 9.8 的 RCE」这样的数字,几乎出现在每一则漏洞新闻里。它不是随意打的分,而是从既定的评分标准(指标)和公式算出来的。下面从零开始讲解它的读法。
分数的对照
| 分数 | 等级 | 体感 |
|---|---|---|
| 9.0 – 10.0 | Critical(重大) | 立即处理。多为接管级 |
| 7.0 – 8.9 | High(高) | 尽早处理 |
| 4.0 – 6.9 | Medium(中) | 有计划地处理 |
| 0.1 – 3.9 | Low(低) | 观察处理 |
如果说 CVE 是表示「是哪个漏洞」的名字,那么 CVSS 就是表示「它有多严重」的分数。例如「CVSS 10.0 的 RCE」,意味着最高等级的远程代码执行=最坏等级。
CVSS 的评分标准
CVSS 的分数大体由 3 个评估组搭建而成。现实中公布的「CVE-XXXX 是 CVSS 9.8」,绝大多数指的是最上面那一组 基础评估(Base) 的分数。
基础 Base
漏洞本身的性质。公布出来的主体分数。
威胁 Threat
按利用代码的流传程度随时间修正。
环境 Environmental
按你自己的配置・重要度重新计算。
① 易被利用程度
② 影响的大小
基础评估大致由 「① 易被利用程度」×「② 影响的大小」 决定。攻击越简单、危害越大,得分越高。下面两个表就是这些评分项目的内容。
① 易被利用程度(攻击有多容易)
| 指标 | 可取值 | 偏向高分的条件 |
|---|---|---|
| 攻击途径 (AV) | 网络 / 相邻 / 本地 / 物理 | 网络(隔着互联网)最危险 |
| 攻击复杂度 (AC) | 低 / 高 | 低(不需要特殊条件或运气)危险 |
| 所需权限 (PR) | 不需要 / 低 / 高 | 不需要(连登录都不用)危险 |
| 用户交互 (UI) | 不需要 / 需要 | 不需要(受害者什么都不做也能成立)危险 |
如果全部都落在「最危险的那一侧」,那就意味着可以隔着网络、轻松、免认证、无需对方操作地发起攻击,这是最坏的前提。
② 影响的大小(一旦成功会发生什么)
CIA 是信息安全三大支柱 机密性・完整性・可用性 的首字母。
| 指标 | 可取值 | 「高」的含义 |
|---|---|---|
| 影响范围 (S) | 无变化 / 有变化 | 有变化=侵害越过了原有权限的边界,波及到其他地方 |
| 机密性 (C) | 高 / 低 / 无 | 能把数据一网打尽地读取 |
| 完整性 (I) | 高 / 低 / 无 | 能随意篡改数据 |
| 可用性 (A) | 高 / 低 / 无 | 能彻底停掉服务 |
“影响范围(S):有变化”会把分数推高
比如,是只在容器内部的危害(无变化),还是从那里侵蚀到宿主机乃至其他服务(有变化),区别就在这里。是否越过这一边界,即便在相同条件下也会让分数大幅变动。
向量字符串:用一行写出分数的构成
CVSS 的分数必定附带一段叫 向量字符串的短字符串。它记录了「选了哪些指标、各自怎么选的」,是分数的依据,读懂它就能明白分数的来由。
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H → 10.0 (Critical)把这一行拆开,就能看到所有项目都落在了「最危险的那一侧」。
| 分段 | 含义 | 本例的选择 |
|---|---|---|
AV:N | 攻击途径 = 网络 | 可隔着网络攻击 |
AC:L | 攻击复杂度 = 低 | 轻松成立 |
PR:N | 所需权限 = 不需要 | 免认证即可 |
UI:N | 用户交互 = 不需要 | 无需受害者操作 |
S:C | 影响范围 = 有变化 | 越过边界波及 |
C:H / I:H / A:H | 机密性・完整性・可用性 = 全部高 | 全被读取・被篡改・被停掉 |
区分“10.0”与“9.8”的关键
上例中如果影响范围变成「无变化(S:U)」,那么即便条件相同,分数也会降到 9.8。是否为 S:C(越过边界)就是能否达到最高分 10.0 的分水岭。所以 9.8 和 10.0 可以理解为「两者都是最坏等级,只是危害多扩散了一步」。
v3.1 与 v4.0:如今两者并存
CVSS 有版本之分,现行最新是 v4.0(2023 年公开)。不过现实中的 CVE 大多仍用 v3.1(2019 年) 打分,短期内会并存。
| CVSS v3.1 | CVSS v4.0 | |
|---|---|---|
| 公开 | 2019 年 | 2023 年 |
| 表记 | 分数 + 向量 | 用 CVSS-B / BT / BE / BTE 明示用途 |
| 用户交互(UI) | 不需要 / 需要 的 2 档 | 细分为 不需要 / 被动 / 主动 的 3 档 |
| 影响范围 | Scope(S) 单一项目 | 分开评估「受击系统」和「波及目标系统」 |
| 补充信息 | 无 | 增加是否可自动化・可恢复性・安全性等参考指标 |
实例:知名漏洞的实际分数
下面是 NVD 上登记的实际分数。从中可以看出:分数未必与现实中的危害大小一致,而且评估者或 CVSS 版本不同,分数也会变。
| 漏洞 | CVSS v3.1 | 向量要点 | 说明了什么 |
|---|---|---|---|
| Log4Shell(CVE-2021-44228) | 10.0 Critical | 所有指标都是最坏值,S:C | 教科书式的 10.0,出现在被广泛使用的组件里 |
| Apache Struts(CVE-2017-5638) | 9.8 Critical | S:U(影响范围无变化) | 在旧版 v2 中是 10.0——版本不同,数字也不同 |
| 某 VPN 设备的漏洞(CVE-2018-13379) | NVD 9.8 / 产品厂商 9.1 | 评估者对完整性 I 的判断不同 | 同一个 CVE,来源不同分数也不同;据报道是 半田医院事件的入侵入口 |
| Heartbleed(CVE-2014-0160) | 7.5 High | 只有机密性 C:H,没有篡改或停机 | 不是 Critical,却成了可能暴露私钥的重大事故 |
这四个都被收录在美国 CISA 的「已知被利用漏洞目录(KEV)」中。7.5 的 Heartbleed 同样遭到了利用,所以光凭分数无法断定「可以往后放」。
分数之外还要确认什么
懂了评分标准,CVSS 就是个强大的工具。但别忘了分数是 「最坏条件下的理论值」。在实务中,把分数再乘上下面两点来决定优先级,才比较贴近现实。
看是否真的在被利用(KEV)
现实中已观测到攻击的漏洞(KEV=Known Exploited Vulnerabilities),无论分数高低都是最优先。比起理论值,「此刻是否正在被攻击」更重要。
确认你自己是否在用这个功能
即便是 CVSS 10.0,只要没在用对应的功能或组件,实际危害就很小。反过来,中等分数但在你的生产环境里必然中招,那就是最优先。以「实际在跑的版本」来判定是铁律。
实例:曾有人把已公开的 CVSS 10.0 当作「与我无关」放着不管,结果被踩中而导致非法扣费。分数绝不能成为「可以放着不管的理由」。→ 放任 CVSS 10.0 的故事
如何检查自己的环境
查出你在用的软件的 CVE 与分数
查看厂商的安全公告、NVD 或 JVN。如果已经知道 CVE 编号,用本站的 CVE / KEV 查询就能一次看到 CVSS、EPSS 和 KEV。
读向量,判断是否适用于你的环境
即便是 AV:N(可隔着网络攻击),如果该功能没有暴露在互联网上,风险就会降低。如果是 PR:L(需要登录),就要确认谁能登录。把向量粘贴到 CVSS 计算与向量解读中,可以看到每一项的含义。
让机器去匹配你的依赖
对于自己的 Web 应用,用 依赖漏洞扫描器或 Dependabot 扫描锁文件,列出相关的 CVE 和分数。这比靠肉眼逐个追踪可靠得多。
出处(一手资料)
- FIRST, "CVSS v3.1 Specification Document" — first.org(指标与严重程度等级)
- FIRST, "CVSS v4.0 Specification Document" — first.org
- NIST NVD, "CVE-2014-0160" — nvd.nist.gov(CVE-2021-44228、CVE-2017-5638、CVE-2018-13379 的分数与向量同样在各自的 NVD 页面上确认)
- CISA, "Known Exploited Vulnerabilities Catalog" — cisa.gov
- FIRST, "Exploit Prediction Scoring System (EPSS)" — first.org
接下来阅读
- 判断:先修哪个 CVE?CVSS、EPSS、KEV 各自衡量什么
- 工具:CVSS 计算与向量解读(粘贴向量字符串即可查看评分与各项含义)
- 术语:CVE 是什么(给漏洞标注的“流水号”) / RCE 是什么(最坏等级的危害)
- 对策:把 CVE/CVSS 纳入运维(依赖的机器化监控)
- 事故:放任已公开的 CVSS 10.0 而被非法扣费的故事