深夜的急诊室里灯火通明,救护车一辆接一辆地送来病人:有胸口剧痛的老先生,有出了小车祸的大学生,还有疑似食物中毒的一家三口。如果护士们只是按“先来后到”的顺序看诊,那位胸痛患者很可能在漫长的等待中错过黄金抢救时间。于是,急诊室有了“分诊”制度——用统一的评估表格快速判断每位病人的危重程度,贴上绿、黄、红标签,决定谁先进抢救室。 网络安全的世界如出一辙。安全团队每天面对扫描器、众测平台、威胁情报推送来的成百上千个“病人”(漏洞),每个发现都可能被报告方宣称“极其严重”。如果没有一把公认的尺子,团队就会陷入“所有人都在喊救命”的混乱。CVSS(Common Vulnerability Scoring System,通用漏洞评分系统)就是业界这把“急诊分诊尺”:它把漏洞从 0 到 10 打分,用基础指标、时间指标、环境指标三张“评估表”逐层问诊,最终给出严重度等级,指导你排定修复优先级、制定 SLA 和分配资源。
CVSS 是安全测试与漏洞管理的通用语言:掌握它,才能把扫描器与 AI 模型发现的漏洞翻译成修复优先级和 SLA,是 AI 安全测试产品落地的关键能力。
可视化演示
展示CVSS漏洞严重度评分流程:基础指标评估、时间指标调整、环境指标调整,最终输出0-10分标准化评分与修复优先级。
本节配有交互动效(进入视口后自动加载,约 3KB)。
基础指标评估 8项基础指标评估漏洞本质特征:攻击向量、复杂度、权限、交互、范围及CIA三要素 Base = roundup(min(Impact,Scope)×Exploitability) 基础分反映漏洞固有严重程度。
CVSS评分简介
想象你第一天入职安全团队,打开漏洞管理平台,屏幕上整整齐齐列着 500 个漏洞:有的来自扫描器,有的来自众测报告,每一条都写着“严重”。如果你逐条阅读技术细节再开会讨论,一周都排不出优先级。这正是急诊室当年遇到过的困境——直到分诊护士拿出一张标准化的三页评估表,问题才有了公用的答案。
CVSS 就是安全界的“分诊评估表”。它由 FIRST 组织维护,目前主流版本是 v3.1(v4.0 也已发布),核心产出是 0 到 10 的标准化分数和一段向量字符串。0 分代表无风险,10 分代表最严重。更关键的是它的三层结构:基础指标描述漏洞“天生的体质”,时间指标记录“病情随时间的演变”,环境指标则允许每个组织“量身定制”——同一个漏洞,在你和别人的评分里可以不同。
三组指标按固定顺序逐层作用:先由基础指标算出基础分,再乘上时间因子反映利用情报,最后用环境需求修订。用一句话概括就是“基础定门类,时间看演变,环境量身定”。最终分数不是把三个数字简单相加,而是嵌套的加权计算。
就这样,三张分诊评估表的逻辑贯穿了 CVSS 的全部设计。对新手而言,先记住“三层结构”这个骨架,后面每一节都是在往骨架里填肉。
- 三个输入参数基础、时间、环境三大度量组依次代入计算。
- 基础指标展开攻击向量、复杂度、权限、交互、作用域与三性影响。
- 时间指标展开利用代码成熟度、修复级别与报告置信度。
- 函数 F先算基础分,再乘时间因子,最后用环境需求修订。
基础指标度量
分诊护士问病人的第一个问题往往是:“你这伤是怎么来的?”是被飞来的流弹击中,还是在健身房自己拉伤了肌肉?这决定了病情有多“容易到达”和“值得警惕”。CVSS 的基础指标第一组,问的正是这个问题——攻击者到底是怎么打进系统的。
这一组包含四个“利用难度”指标。攻击向量(AV)描述攻击者与目标之间的距离:能隔着互联网远程打击(N),还是必须靠近目标(A),或者要已经进到本机(L),甚至得物理接触设备(P)。攻击复杂度(AC)衡量利用的门槛高低:是开箱即用的低门槛(L),还是需要凑齐特殊条件的高门槛(H)。所需权限(PR)问攻击者要先拿到什么身份:完全匿名(N)、普通用户(L)还是管理员(H)。用户交互(UI)则看要不要骗一个“倒霉用户”点一下链接(R)——不需要就是 N。每一项都对应一个小于 1 的权重,全部乘起来,就得到利用难度子分数。
如果一个漏洞能从公网匿名远程利用、不需要任何权限、也不需要用户点任何东西,那它在“利用难度”这一栏几乎拿满——正如急诊室里被流弹击中且大量失血的患者,分诊护士会立刻意识到:这是要抢时间的伤。
- 取攻击向量档位网络、相邻、本地、物理四档,距离越远权重越高。
- 取攻击复杂度档位低复杂度意味着更容易被利用,权重更高。
- 取所需权限档位权限要求越高越难利用;作用域改变时取另一组更高值。
- 取用户交互档位需要受害者配合会降低可利用性,权重更低。
- 连乘回归常数 8.22 把四因子乘积归一到 0–10 的尺度。
影响与作用域
分诊的第二步是评估“伤得有多重”:是擦破皮,还是大出血?CVSS 用三个维度衡量漏洞对系统造成的伤害——机密性(C)对应“病人的隐私信息有没有泄露”,完整性(I)对应“身体的档案数据有没有被篡改”,可用性(A)对应“人还能不能正常行动”。每个维度只有三档:高(0.56)、低(0.22)、无(0.00)。
三个维度并非简单相加,而是用“概率补集”的方式组合:先把“三个维度都没被破坏”的概率乘出来,再用 1 减去它,得到“至少破坏了一个维度”的整体影响。这个中间量叫影响子分数(ISS)。随后乘以系数 6.42,把影响归一到 0–10 尺度。注意,这只是作用域不变(S:U)时的算法——如果作用域改变(S:C),公式的系数会不同,我们留到“分数计算流程”一节再说。
回到急诊室:一个病人如果只是脚踝扭伤(可用性轻微受损),另一个病人是内脏出血加意识模糊(三性全高),分诊护士闭着眼也知道后者要进抢救室。CVSS 里的 Impact 越大,就相当于病人离抢救室越近。
- 三性取值机密性、完整性、可用性各自取高、低、无三档权重。
- 缺口乘积计算“三性都未被破坏”的剩余概率。
- ISS 补集1 减去剩余概率,得到至少破坏一个维度的整体影响。
- 系数放大6.42 把 0 到 1 的 ISS 归一到 0–10 分尺度。
时间与环境指标
分诊完成后,病情不会静止。护士每隔一段时间会重新评估:社区里是不是已经有人得了同样的病?特效药(补丁)上市了吗?当初的诊断结论可靠吗?CVSS 的时间指标组正是这套“动态复查”——利用代码成熟度(E)衡量攻击代码是否已经公开甚至武器化,修复缓解级别(RL)看官方补丁、临时方案是否存在,报告置信度(RC)则反映漏洞细节被确认的程度。三者都是小于等于 1 的系数,乘上基础分,分数只会维持或下降。
环境指标组则是“因人而异”的定制:同样是失去一根手指,对钢琴家和普通人的意义完全不同。CR、IR、AR 让你声明组织对机密性、完整性、可用性的重视程度(低 0.5、中 1.0、高 1.5),还可通过 MAV、MAC 等“修改后的基础指标”直接覆盖默认评估。时间分数与环境分数的计算骨架是一致的:
环境指标的修订本质上是“换一把更适合你组织的尺子”:对银行来说,数据泄露(C)比服务中断(A)更致命,于是把 CR 调高、AR 调低,同一个漏洞在银行和游戏公司手里会得到不同的最终分。
- 利用代码成熟度 E从未证实到已被武器化,权重逐级接近 1。
- 修复缓解级别 RL官方补丁权重最低,完全无缓解则取 1.0。
- 报告置信度 RC漏洞报告越被确认,分数越接近原值。
- 连乘取整三因子连乘后向上取整到一位小数。
向量字符串解析
分诊护士给每位病人系上的手环写满了缩写:红标、胸痛、5 分钟前。旁人看着像密码,护士们却能在三秒内读完关键信息——因为格式是固定统一的。CVSS 的向量字符串就是漏洞的“分诊手环”:一段由斜杠分隔的字段串,每个字段是“指标:取值”的缩写对,按固定顺序排列。
读向量的规则只有两条:从左到右按约定顺序读,每个字段的第一个字母代表指标,冒号后是该指标的档位。基础向量固定为版本号 + AV、AC、PR、UI、S、C、I、A 八个字段;后面还可以追加时间组(E、RL、RC)和环境组(CR、IR、AR、MAV 等)。下面这条是经典的“远程代码执行”向量,拆开来看每个字段都不神秘:
学会读向量字符串,就像学会看护士手环:一眼扫过“A 网 B 密 C 高 D 低”,漏洞画像已经浮现在眼前。这也是为什么各大漏洞平台都直接用向量字符串交换信息——它比一长段文字描述更精确、更省空间。
- 版本前缀声明评分版本,v3.1 与旧版不能直接混比。
- 攻击向量与复杂度AV:N 表示可经网络远程利用,AC:L 表示门槛低。
- 权限与交互PR:N 表示无需任何权限,UI:N 表示无需用户配合。
- 作用域S:U 表示影响被限制在同一安全边界内。
- 三性影响C:H/I:H/A:H 表示机密性、完整性、可用性均为高损害。
- 顺序规则基础组固定按 AV→AC→PR→UI→S→C→I→A 排列,时间、环境组后缀同理。
分数计算流程
现在把前面所有零件组装起来。基础分计算的路径是:先算影响子分数(ISS)与利用难度(ES),再按作用域选择合并公式。作用域不变(S:U)时,影响与利用难度直接相加;作用域改变(S:C)时,说明漏洞能冲出被攻击组件的安全边界波及他处,需要乘上 1.08 的放大系数,同时权限权重也要换成更高档位。最后与 10 取最小值,再向上取整到一位小数——这就是 CVSS 的 Roundup 规则,它保证分数只会被“多报”而不会被“抹零”。
算出的分数再映射到严重度等级:0.0 为 None,0.1–3.9 为 Low,4.0–6.9 为 Medium,7.0–8.9 为 High,9.0–10.0 为 Critical。以日志泄露类漏洞为例,AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N 算出基础分约 5.8,属于 Medium;而远程代码执行的 9.8 分直接跨入 Critical——急诊室里,一个标着“红色危重”的病人和一个标着“黄色普通”的病人,命运从此分岔。
- 判断作用域S:U 走直加分支,S:C 走放大分支。
- 合并子分数把影响与利用难度相加(S:C 时乘 1.08)。
- 封顶与 10 取最小值,防止分数越界。
- 向上取整Roundup 到一位小数,分数只升不降。
修复优先级实践
分诊标签不是治疗方案的终点。一个 80 岁的老爷爷得了普通感冒也值得高度警惕,而一个年轻运动员的轻微骨折可能只需回家静养——分诊护士必须结合病人的年龄、病史、家庭情况做最终判断。安全团队亦然:CVSS 分数只是“漏洞自身的受伤程度”,真正的修复优先级还要乘以资产关键度和暴露程度。
这就是优先级矩阵的由来:把严重度等级(0–10 分档)、资产关键度(核心业务系统还是边缘工具)、暴露程度(是否公网可达、是否正被在野利用)三者相乘,得到“先救谁”的答案。SLA 也随之分层:Critical 且高价值资产 24 小时内修复,High 一周内,Medium 一个月内,Low 纳入常规排期。资源分配同样遵循这条链——最贵的专家和最快的应急响应,永远留给矩阵右上角的组合。
最后要记住:CVSS 是“分诊工具”而不是“主治医生”。它给出的是标准化的受伤程度,不能替你回答“这台服务器值不值得通宵修复”。把分数当作输入,把业务上下文当作约束,才能从“会打分的工程师”成长为“会做决策的安全负责人”。
- 严重度等级由 CVSS 分数映射到 None/Low/Medium/High/Critical 五档。
- 资产关键度按业务价值给资产定级,核心系统权重更高。
- 暴露程度公网可达、已有在野利用会显著抬高优先级。
- 决策输出综合分映射到 SLA 时间窗口与资源投入档位。
AI 应用场景
AI 漏洞扫描器的自动评分与分诊
阶段:安全测试结果生成与评估
解决的问题:传统渗透测试依赖人工阅读漏洞描述并打分,速度慢、标准不一;同一漏洞不同测试员可能打出相差 3 分的成绩。AI 安全 agent 检测到漏洞后,可自动生成 CVSS 向量字符串并计算基础分,再结合资产清单形成“红黄绿”分诊队列,把人工评估时间从小时级压缩到秒级。
具体案例:某 LLM 驱动的自动化渗透测试平台在扫描 Web 应用时发现一处 SQL 注入,自动对照利用路径生成向量 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:L,计算出 8.2 分(High),并依据资产库中“订单库为高关键资产”自动建议 7 天内修复、安排两名资深工程师跟进。
威胁情报驱动的动态时间分数修订
阶段:风险评估与威胁情报分析
解决的问题:静态 CVSS 基础分不随“是否已被公开利用”变化,导致修复决策滞后。安全团队靠人工刷新 E、RL、RC 因子不现实。AI 持续抓取 NVD、厂商公告和暗网情报,自动更新每个漏洞的时间分数,让“正在被武器化利用”的漏洞分数自动跃升、优先级自动前移。
具体案例:某安全运营中心的 AI Copilot 每小时读取威胁情报源,发现内网某中间件漏洞对应 PoC 已在 GitHub 公开,自动将 E 从 0.91 提升到 0.97,时间分数从 6.8 涨到 7.3,触发 High 级 SLA 告警并推送给值班工程师。
Python 演示
# -*- coding: utf-8 -*-"""CVSS v3.1 向量解析与基础分计算(教学简化版)"""import math class CvssCalculator: """解析 CVSS v3.1 向量字符串,计算基础分与严重度等级。""" AV_VALUES = {'N': 0.85, 'A': 0.62, 'L': 0.55, 'P': 0.2} AC_VALUES = {'L': 0.77, 'H': 0.44} PR_VALUES = {'N': 0.85, 'L': 0.62, 'H': 0.27} PR_SCOPE_VALUES = {'L': 0.68, 'H': 0.5} UI_VALUES = {'N': 0.85, 'R': 0.62} IMPACT_VALUES = {'H': 0.56, 'L': 0.22, 'N': 0.0} def __init__(self, vector): self.vector = vector self.metrics = self._parse(vector) def _parse(self, vector): """把 'CVSS:3.1/AV:N/AC:L/...' 拆成指标字典。""" result = {} for segment in vector.strip().split('/')[1:]: key, value = segment.split(':') result[key] = value return result def exploitability_score(self): """利用难度子分数 ES = 8.22 * AV * AC * PR * UI。""" av = self.AV_VALUES[self.metrics['AV']] ac = self.AC_VALUES[self.metrics['AC']] pr_key = self.metrics['PR'] if self.metrics['S'] == 'C': pr = self.PR_SCOPE_VALUES.get(pr_key, 0.27) else: pr = self.PR_VALUES[pr_key] ui = self.UI_VALUES[self.metrics['UI']] return 8.22 * av * ac * pr * ui def impact_iss(self): """影响子分数 ISS = 1 - (1-C)(1-I)(1-A)。""" c = self.IMPACT_VALUES[self.metrics['C']] i = self.IMPACT_VALUES[self.metrics['I']] a = self.IMPACT_VALUES[self.metrics['A']] return 1 - (1 - c) * (1 - i) * (1 - a) def impact_score(self): """作用域不变时 Impact = 6.42 * ISS。""" return 6.42 * self.impact_iss() @staticmethod def roundup(value): """CVSS 向上取整到一位小数。""" return math.ceil(value * 10) / 10 def base_score(self): """基础分 = Roundup(min(Impact + ES, 10))。""" if self.impact_iss() <= 0: return 0.0 total = self.impact_score() + self.exploitability_score() return self.roundup(min(total, 10)) def severity(self): """严重度等级映射。""" score = self.base_score() if score == 0.0: return 'None' if score < 4.0: return 'Low' if score < 7.0: return 'Medium' if score < 9.0: return 'High' return 'Critical' if __name__ == '__main__': vectors = [ '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:L/I:N/A:N', 'CVSS:3.1/AV:L/AC:H/PR:L/UI:R/S:U/C:H/I:N/A:N', ] for v in vectors: calc = CvssCalculator(v) score = calc.base_score() print(v) print(' ISS=%.3f ES=%.3f 基础分=%.1f 等级=%s' % ( calc.impact_iss(), calc.exploitability_score(), score, calc.severity()))
for segment in vector.strip().split('/')[1:]用斜杠切分并跳过开头的版本号,逐段读取“指标:取值”。key, value = segment.split(':')冒号左边是两字母指标名,右边是档位缩写,存入字典。pr = self.PR_SCOPE_VALUES.get(pr_key, 0.27)作用域改变时权限权重换成更高档位。return 8.22 * av * ac * pr * ui连乘得到 0–10 尺度的利用难度分。if self.impact_iss() <= 0: return 0.0三性全无影响时,基础分直接归零。return self.roundup(min(total, 10))与 10 取小后向上取整到一位小数。calc.severity()由基础分映射到 None/Low/Medium/High/Critical 等级。
常见误区
误区看到 9.8 分就觉得“这个漏洞明天就要被打穿”,立刻全员通宵应急。
正解CVSS 衡量的是“一旦被利用会造成多严重的损害 + 利用难度有多大”,并不表示实际武器化程度。一个 9.8 分的漏洞可能只有理论 PoC 从未被使用,而一个 5 分的漏洞可能正在被大规模在野利用。要判断真实威胁,必须结合时间指标的 E 因子(利用代码成熟度)和威胁情报,而不是只看静态基础分。
为何常见:分数是单一数字,视觉冲击力强,人脑天然容易把“严重”直接等同于“紧迫”。
误区把漏洞列表按分数从高到低排个序,照着一个个修就万事大吉。
正解基础分只描述漏洞自身,完全没描述业务。一个无人访问的内部测试系统上的 9.8 分漏洞,优先级应当低于暴露在公网核心订单库上的 7.5 分漏洞。正确做法是构建优先级矩阵:分数 × 资产关键度 × 暴露程度,再映射到 SLA。
为何常见:按分数排序最省力,且“数字越高越危险”的直觉在日常场景里经常成立,让人忽略了业务上下文。
误区看到向量里 S:C,以为 C 代表 Confidentiality 或 Certificate,误读为“系统安全/通信加密”。
正解S 是作用域(Scope),C 是 Changed(已改变)。S:C 表示漏洞的影响范围能够冲出被攻击组件的安全边界,波及同一授权边界外的其他组件,属于“伤情会传染”的危险信号,会放大基础分。
为何常见:缩写的两个字母太容易让人望文生义,尤其 C 在别处刚见过是“机密性”。
误区拿着 v2 报告的 7.5 分和 v3.1 的 7.5 分对比,认为两者严重度相同。
正解v2 与 v3.1 的评分哲学不同:v3.1 引入了作用域概念,权限权重、影响系数都变了,同一漏洞在两个版本下分数可能差出 2 分以上。比较时先看向量字符串版本号,跨版本对比需要先换算或统一版本。
为何常见:两个版本都输出 0–10 浮点数,看起来是同一把尺子,容易忽略刻度本身已经换过。
面试题
Q1. CVSS v3.1 最终输出的分数范围是?
- A.0 到 5 之间的浮点数
- B.0 到 10 之间的浮点数← 正确答案
- C.0 到 100 之间的整数
- D.1 到 10 之间的整数
答案:B。CVSS 的输出是一个 0 到 10 的浮点数,0 表示无风险,10 表示最严重。它把漏洞的严重程度归一到一条标准刻度上,方便跨系统比较。A、C、D 的区间都不符合规范。
Q2. 向量字符串 "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H" 中 C:H 表示?
- A.机密性影响为高← 正确答案
- B.完整性影响为高
- C.可用性影响为高
- D.攻击复杂度为高
答案:A。C 是 Confidentiality(机密性),H 是 High(高)。C:H 表示漏洞对机密性的破坏程度为高,即可能造成严重的敏感数据泄露。I:A 才是完整性,A:H 才是可用性,AC 才是攻击复杂度。
Q3. CVSS 三个度量组中,哪一组的评分会随漏洞被公开利用、补丁发布而动态变化?
- A.基础指标组
- B.时间指标组← 正确答案
- C.环境指标组
- D.所有度量组
答案:B。时间指标组(E、RL、RC)专门记录利用代码成熟度、修复缓解级别和报告置信度,这些情报随时间变化,因此分数会动态调整。基础指标是漏洞固有属性基本不变,环境指标由组织自定义但不会随利用情况自动变化。
Q4. 某个漏洞基础分为 8.0,时间因子 E=0.97、RL=0.95、RC=1.0,其时间分数约为?
- A.7.0
- B.7.4← 正确答案
- C.7.8
- D.8.0
答案:B。时间分数 = Roundup(8.0 × 0.97 × 0.95 × 1.0) = Roundup(7.372) = 7.4。CVSS 的取整规则是向上取整到一位小数,所以 7.372 进为 7.4 而非 7.3。
Q5. 关于作用域 S,下列说法正确的是?
- A.S:C 表示漏洞无法影响授权边界外组件
- B.S:U 表示漏洞影响范围超出安全边界
- C.S:C 时使用系数 1.08 且权限权重取更高档值← 正确答案
- D.作用域只在环境指标中参与计算
答案:C。S:C(Changed)表示影响能冲出安全边界,S:U(Unchanged)表示不越界,A、B 说反了。作用域属于基础指标组,直接影响基础分计算,D 错误。S:C 时基础分公式乘 1.08 放大,且 PR 权重改用 0.68/0.50 的更高档值。
Q6. 下列属于基础指标组的是?
- A.攻击向量 AV← 正确答案
- B.利用代码成熟度 E
- C.所需权限 PR← 正确答案
- D.报告置信度 RC
答案:AC。基础指标组包含 AV、AC、PR、UI、S、C、I、A,描述漏洞固有属性。E 和 RC 属于时间指标组,分别描述利用代码成熟度和报告置信度,会随时间变化。
Q7. 时间指标组包含哪些因子?
- A.利用代码成熟度 E← 正确答案
- B.修复缓解级别 RL← 正确答案
- C.报告置信度 RC← 正确答案
- D.用户交互 UI
答案:ABC。时间指标组由 E、RL、RC 三个因子组成,反映漏洞被利用情报的演变。UI(用户交互)属于基础指标组,描述利用漏洞是否需要受害者配合。
Q8. 严重度等级 High 对应的分数区间是?
- A.0.1 到 3.9
- B.4.0 到 6.9
- C.7.0 到 8.9← 正确答案
- D.9.0 到 10.0
答案:C。CVSS v3.1 的等级区间为:0.0 为 None,0.1–3.9 为 Low,4.0–6.9 为 Medium,7.0–8.9 为 High,9.0–10.0 为 Critical。7.0 是 High 的起点,9.0 及以上才进入 Critical。
Q9. 某漏洞向量为 AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H,其基础分约为?
- A.7.5
- B.8.8
- C.9.8← 正确答案
- D.10.0
答案:C。ISS = 1−(1−0.56)³ ≈ 0.915,Impact = 6.42×0.915 ≈ 5.87;ES = 8.22×0.85×0.77×0.85×0.85 ≈ 3.89;Base = Roundup(min(5.87+3.89, 10)) = Roundup(9.76) = 9.8。这是典型的远程代码执行类漏洞,属于 Critical。
Q10. 关于 CVSS 在修复优先级中的使用,正确的认知是?
- A.CVSS 分数应与资产关键度结合← 正确答案
- B.分数越高就应先修且只修它
- C.时间指标可反映在野利用情况← 正确答案
- D.环境指标可定制组织相对风险← 正确答案
答案:ACD。修复优先级 = 严重度等级 × 资产关键度 × 暴露程度,A 正确。时间指标的 E 因子反映利用代码成熟度,可辅助判断在野利用风险,C 正确。环境指标通过 CR/IR/AR 定制组织对三性的重视程度,D 正确。只按分数一项排期、忽略上下文是常见误区,B 错误。