从两个中危漏洞读懂 CVSS 评分体系:向量拆解、数学计算与实战观察
本文基于作者真实报送的 CNVD 漏洞公告改写。为保护相关方信息,涉及厂商名称、报送人身份、漏洞编号均已脱敏处理;漏洞类型、评分向量、危害等级等关键事实保持原样,可放心阅读与转载。
一、写在前面:两个"恰好中危"的漏洞


某日登录国家信息安全漏洞共享平台(CNVD),发现此前报送的两个漏洞均已公开收录。两条公告长得几乎一模一样:
| 项目 | 漏洞 A | 漏洞 B |
|---|---|---|
| 漏洞标题 | 某管理平台存在硬编码漏洞 | 某管理平台存在信息泄露漏洞 |
| 危害级别 | 中危 | 中危 |
| 评分向量 | (AV:N/AC:L/Au:N/C:P/I:N/A:N) | (AV:N/AC:L/Au:N/C:P/I:P/A:N) |
两条公告之间只差一个字符:I:N 变成了 I:P。就这一个字母,让两个漏洞的 CVSS 基础分从 5.0 拉开到 6.4------恰好都停在"中危"区间,又恰好一个贴近下限、一个逼近高危门槛。
不少朋友看到这类公告的第一反应是:"都远程可打了、还不要认证,怎么才中危?"要回答这个问题,就需要把 CVSS 这套评分体系从头讲清楚。
二、CVSS 是什么:一句话与一段历史
CVSS(Common Vulnerability Scoring System,通用漏洞评分系统) 是由 FIRST(Forum of Incident Response and Security Teams,事件响应与安全团队论坛)维护的公开评分标准,目标是让不同组织对同一漏洞的严重程度评估"可以互相比较、可以复算复现"。
它的演进脉络大致是:
| 版本 | 发布时间 | 主要变化 |
|---|---|---|
| CVSS v1 | 2005 年 | 首次提出结构化评分框架 |
| CVSS v2 | 2007 年 | 引入三维指标模型,业界大规模采用 |
| CVSS v3.0 | 2015 年 | 细粒度化(如 AC 细分、新增 UI 指标、C 区分物理等) |
| CVSS v3.1 | 2019 年 | 澄清若干含糊定义 |
| CVSS v4.0 | 2023 年 | 重构指标、引入威胁与环境的补充指标等 |
需要注意的是:直到今天,国内不少漏洞平台(含 CNVD)的公告页仍沿用 CVSS v2 向量格式。这不是平台落后,而是大量历史漏洞库按 v2 口径归档,切换成本极高。因此本文先以 v2 为主线展开------这也是公告里两个向量所属的版本------随后补充 v3/v4 的差异。
三、CVSS 的"三维指标"框架
CVSS v2 由三组指标构成,分别回答三个问题:
- 基础指标(Base):漏洞本身的固有属性,不随部署环境变化------"这漏洞本身多严重?"
- 时间指标(Temporal):随时间变化的因素------"现在市面上有没有利用代码?厂商修复了吗?"
- 环境指标(Environmental):在特定部署环境下的修正------"对我这个系统到底多严重?"
其中基础指标是几乎所有公告页都会展示的部分(本文两条向量即为基础指标向量),也是后续所有量化计算的起点。
基础指标又可细分为 6 个分量:
| 分量 | 全称 | 含义 |
|---|---|---|
| AV | Access Vector 攻击途径 | 攻击者从哪里发起攻击 |
| AC | Access Complexity 攻击复杂度 | 利用该漏洞需要多高的条件 |
| Au | Authentication 认证要求 | 利用漏洞是否需要通过身份认证 |
| C | Confidentiality Impact 机密性影响 | 对信息保密性的破坏程度 |
| I | Integrity Impact 完整性影响 | 对数据/系统完整性的破坏程度 |
| A | Availability Impact 可用性影响 | 对服务可用性的破坏程度 |
四、基础指标逐个拆解:取值与含义
4.1 AV:攻击途径
| 取值 | 权重 | 含义 |
|---|---|---|
| L(Local) | 0.395 | 本地利用,攻击者需在本机或通过本地会话操作 |
| A(Adjacent Network) | 0.646 | 邻近网络利用,如同一 Wi-Fi、蓝牙、相邻网段 |
| N(Network) | 1.000 | 网络远程利用,可从任意网络位置发起 |
权重差异的直觉:能远程打的漏洞,天然比要坐到机器面前的漏洞覆盖面广、门槛低,因此权重最高。
4.2 AC:攻击复杂度
| 取值 | 权重 | 含义 |
|---|---|---|
| H(High) | 0.350 | 利用需要苛刻条件(如特定配置、竞态窗口、社工配合) |
| M(Medium) | 0.610 | 存在一定附加条件,但并非难以满足 |
| L(Low) | 0.710 | 利用条件宽松,攻击者可稳定复现 |
4.3 Au:认证要求
| 取值 | 权重 | 含义 |
|---|---|---|
| M(Multiple) | 0.450 | 需要多重认证(如多因子)才能触达漏洞 |
| S(Single) | 0.560 | 需要一次有效认证(如一个普通账号) |
| N(None) | 0.704 | 无需任何认证即可利用 |
4.4 C / I / A:三类安全影响
| 取值 | 权重 | 含义 |
|---|---|---|
| N(None) | 0.000 | 无影响 |
| P(Partial) | 0.275 | 部分影响(部分数据泄露/部分数据可篡改/服务降级) |
| C(Complete) | 0.660 | 完全影响(全部数据泄露/完全失控/完全中断) |
三者的权重共同决定了"Impact(影响子分)"------这也是两个案例中唯一产生差异的地方。
五、案例回放:逐字符解析两条向量
现在把公告里的两条向量翻译成人话。
漏洞 A:(AV:N/AC:L/Au:N/C:P/I:N/A:N)
| 分量 | 取值 | 人话 |
|---|---|---|
| AV:N | 网络 | 远程可打,不需要物理接触 |
| AC:L | 低复杂度 | 利用条件宽松,可稳定复现 |
| Au:N | 无需认证 | 匿名即可触发 |
| C:P | 部分机密性影响 | 可造成部分敏感信息(如硬编码口令、内部配置)泄露 |
| I:N | 无完整性影响 | 数据不会被篡改 |
| A:N | 无可用性影响 | 服务不被打断 |
画像 :一个存在于代码中的硬编码凭据/密钥(此类问题在 CWE 中通常对应 CWE-798 Use of Hard-coded Credentials)------远程、免认证、低门槛地把"不该让你知道的东西"暴露给了攻击者,但它本身"不删不改不瘫"。
漏洞 B:(AV:N/AC:L/Au:N/C:P/I:P/A:N)
除完整性外与 A 完全一致:
| 分量 | 取值 | 与漏洞 A 的差异 |
|---|---|---|
| I:P | 部分完整性影响 | 攻击者不仅能读到敏感信息,还能对部分数据/配置实施篡改 |
画像 :一个未授权/信息泄露类缺陷(此类问题通常关联 CWE-200 Exposure of Sensitive Information 及其细分变体)------在泄露的基础上叠加了"改"的能力,危害面扩大了一档。
小结 :这两条向量说明,CNVD 评审认为两个漏洞"可远程、易利用、免认证",但没有证据表明能拿到系统完全控制权、能改任意数据或能打瘫服务------因此影响面被圈定在 C:P/I:N 与 C:P/I:P 的组合内。这正是"中危"的技术依据。
六、评分的数学:把向量算成分数
CVSS v2 的威力在于:任何一条向量,任何人都能套用同一套公式复算出唯一分数。基础分计算分三步:
第一步:计算影响子分 Impact
Impact = 10.41 × (1 − (1 − C) × (1 − I) × (1 − A))
第二步:计算可利用性子分 Exploitability
Exploitability = 20 × AV × AC × Au
第三步:合成基础分 BaseScore
BaseScore = (0.6 × Impact + 0.4 × Exploitability − 1.5) × f(Impact)
其中 f(Impact) = 0(Impact=0 时);否则 f(Impact) = 1.176
把两条向量代入(权重见第四节表格):
漏洞 A 计算过程
Impact = 10.41 × (1 − (1−0.275) × (1−0) × (1−0))
= 10.41 × 0.275
= 2.8628
Exploitability = 20 × 1.0 × 0.71 × 0.704
= 9.9968
BaseScore = (0.6 × 2.8628 + 0.4 × 9.9968 − 1.5) × 1.176
= (1.7177 + 3.9987 − 1.5) × 1.176
= 4.2164 × 1.176
≈ 5.0
漏洞 B 计算过程
Impact = 10.41 × (1 − (1−0.275) × (1−0.275) × (1−0))
= 10.41 × (1 − 0.725 × 0.725)
= 10.41 × 0.4744
= 4.9382
Exploitability = 20 × 1.0 × 0.71 × 0.704 = 9.9968 (同漏洞 A)
BaseScore = (0.6 × 4.9382 + 0.4 × 9.9968 − 1.5) × 1.176
= (2.9629 + 3.9987 − 1.5) × 1.176
= 5.4616 × 1.176
≈ 6.4
可复现验证脚本(Python):
python
def cvss2_base(av, ac, au, c, i, a):
AV = {"L": 0.395, "A": 0.646, "N": 1.0}
AC = {"H": 0.35, "M": 0.61, "L": 0.71}
AU = {"M": 0.45, "S": 0.56, "N": 0.704}
CIA = {"N": 0.0, "P": 0.275, "C": 0.660}
impact = 10.41 * (1 - (1 - CIA[c]) * (1 - CIA[i]) * (1 - CIA[a]))
exploitability = 20 * AV[av] * AC[ac] * AU[au]
f = 0.0 if impact == 0 else 1.176
return round(((0.6 * impact) + (0.4 * exploitability) - 1.5) * f, 1)
# 漏洞 A -> 5.0;漏洞 B -> 6.4
print(cvss2_base("N", "L", "N", "P", "N", "N"))
print(cvss2_base("N", "L", "N", "P", "P", "N"))
这就是"一个字母之差拉开 1.4 分"的由来:I 从 N 变为 P 时,Impact 子分从 2.8628 跳到 4.9382,而可利用性部分完全不变。
七、从分数到等级:分级阈值
拿到分数后,按固定阈值映射等级:
| CVSS v2 分数 | 等级 |
|---|---|
| 0.0 -- 3.9 | 低危(Low) |
| 4.0 -- 6.9 | 中危(Medium) |
| 7.0 -- 10.0 | 高危(High) |
因此:漏洞 A = 5.0 中危;漏洞 B = 6.4 中危。若漏洞 B 的完整性影响再进一步(I:C),或将机密性推高(C:C),或攻击途径/复杂度/认证条件再恶化一档,分数很容易突破 7.0 进入高危------这也解释了为什么"远程免认证 + 完整数据读取"的漏洞通常都是高危起步。
补充:CVSS v3.x 在 7.0--10.0 之间又细分出 9.0--10.0 为严重(Critical);v4.0 继续沿用四档体系并调整了部分映射方式。
八、平台实践中的定级观察
结合大量实际报送经验,有以下几条规律值得记录(均为公开实践中的一般性观察,具体以平台最终评审为准):
-
代码级硬编码凭据与配置型弱口令,定级逻辑截然不同。写死在代码/固件中的口令、密钥、出厂默认凭据属于产品设计缺陷,实践中往往中危起步、高危亦不罕见;而部署侧"admin/123456"这类弱口令常被视为运维配置问题,容易被压到低危。报送论证时若不刻意区分,极易被归入弱口令范畴而拉低级别。
-
信息泄露类漏洞普遍偏低。纯被动式信息泄露(如报错堆栈泄露、目录列举、冗余信息返回,典型如 CWE-209)在 CNVD 实践中多定低危,且通常难以达到原创漏洞证书要求的中危门槛;这类漏洞的价值更多在于方法论沉淀、行业素材积累与"收录"本身,而不是证书与编号。
-
"远程 + 免认证 + 部分影响"的经典组合落在中危区间(4.0--6.9),是公告里最常见的面孔;能否再往上走,取决于影响是否完整(P→C)、是否有完整利用链、是否叠加了认证绕过等高阶前提。
-
业务场景通常不直接改分,但影响评审感知。CVSS 是纯技术度量,不考虑"这个系统是干什么的"。应急广播、电力、医疗等关键信息基础设施场景下,同类漏洞的真实业务危害往往远超普通系统------这是平台评级与业务风险的天然落差,也是报送方可以额外提交业务影响说明、利用链演示等材料争取复核的依据。
九、CVSS 的边界与正确用法
CVSS 是严重程度度量 ,不是风险度量,更不是"该不该修"的唯一答案。它有三条著名边界:
- 不含业务上下文。同样 6.4 分的漏洞,打在门户网站和打在某某应急调度平台上的真实风险完全不同。
- 不含实际被利用概率。时间指标中的 Exploit Code Maturity(利用代码成熟度)在多数公告中按最坏情况或未知处理,导致大量"理论漏洞"分数虚高。
- 静态快照。漏洞被组合进攻击链后,单独看每个环节的 CVSS 都不高,串联起来可能足以造成灾难------CVSS 天然不擅长表达这种 1+1>2。
因此,一个负责任的处置流程应当把 CVSS 当作第一道过滤器 ,而不是最终裁决:先用分数完成分级排序,再用资产价值、暴露面、实际可利用性、业务影响做二次加权。
十、结语
回到开头的疑问:"都远程可打了、还不要认证,怎么才中危?"
答案在这套体系的设计里:CVSS 的中危区间容纳的是"利用容易、但破坏有限 "的漏洞。两个案例一个只读不改(5.0),一个能读能改但只到部分程度(6.4),恰好是这个区间的典型样本。而当你看到一条向量,真正要做的不是纠结"为什么才中危",而是沿着 AV→AC→Au→C/I/A 逐项追问:如果把它喂进一条真实攻击链,它还能只是"中危"吗?
附:本文涉及的 CVSS 公式、权重表与分级阈值均引用自 FIRST 公开发布的 CVSS v2 规范文档,读者可用文末 Python 脚本自行复算验证。