3. CVE与内部漏洞编号映射表构建
映射表要解决的核心问题
内部扫描器通常使用自己的漏洞编号(如 SCAN-2024-0001),而漏洞公告、厂商通告和修复建议普遍以 CVE 编号为通用标识。构建映射表的目标,是把同一漏洞在不同来源中的编号对齐,并明确哪些内部编号能映射、哪些不能映射。
映射关系并不总是简单的一对一,实际会出现三类情况:
- 一对一:一个内部编号对应一个 CVE,直接写入映射表。
- 一对多:一个内部扫描结果实际覆盖多个 CVE,需要拆成多行,每行一个 CVE。
- 多对一:多个内部编号指向同一个 CVE,需要保留全部内部编号,避免丢失扫描来源。
- 无法映射:扫描器未提供 CVE、CVE 尚未分配或匹配失败,需要标记为
UNMAPPED并记录原因。
映射表字段设计
映射表至少应包含以下字段,才能支撑后续覆盖率统计和漏洞治理:
| 字段 | 含义 | 示例 |
|---|---|---|
| internal_id | 内部扫描器漏洞编号 | SCAN-2024-0001 |
| cve_id | CVE 编号,无法映射时填 UNMAPPED | CVE-2024-1234 |
| map_type | 映射类型 | 1:1 / 1:N / N:1 / UNMAPPED |
| source | 映射依据来源 | scanner / nvd / vendor |
| confidence | 映射置信度 | high / medium / low |
| reason | 无法映射或低置信原因 | no_cve_in_scanner / cve_pending |
映射处理流程
处理时先按内部编号分组,再对每个内部编号提取候选 CVE 集合。若候选集合为空,标记为 UNMAPPED;若候选集合只有一个 CVE,标记为 1:1;若候选集合有多个 CVE,则拆分为多行并标记为 1:N。随后反向检查同一 CVE 是否被多个内部编号引用,若是则将这些行标记为 N:1。
覆盖率统计与输出
映射完成后,按内部编号维度统计覆盖率:
覆盖率 = 已映射内部编号数 / 内部编号总数 × 100%
以图中示例为例,6 个内部编号中有 4 个成功映射,覆盖率为 4/6 ≈ 66.7%。同时应分别统计 1:1、1:N、N:1 和 UNMAPPED 的数量,便于判断扫描器与 CVE 数据源的匹配质量。
若覆盖率偏低,优先检查扫描器是否输出了 CVE 字段、CVE 数据源是否及时更新,以及匹配规则是否过于严格。不要为了提升覆盖率而强行给无法确认的漏洞分配 CVE。
可执行的映射表样例
以下映射表可直接作为输出模板使用,每行代表一个内部编号与一个 CVE 的对应关系:
| internal_id | cve_id | map_type | source | confidence | reason |
|---|---|---|---|---|---|
| SCAN-2024-0001 | CVE-2024-1234 | 1:1 | scanner | high | |
| SCAN-2024-0002 | CVE-2024-5678 | 1:N | nvd | high | |
| SCAN-2024-0002 | CVE-2024-5679 | 1:N | nvd | high | |
| SCAN-2024-0003 | CVE-2024-1234 | N:1 | scanner | high | |
| SCAN-2024-0004 | CVE-2024-9012 | 1:1 | vendor | medium | |
| SCAN-2024-0005 | UNMAPPED | UNMAPPED | scanner | low | no_cve_in_scanner |
| SCAN-2024-0006 | UNMAPPED | UNMAPPED | scanner | low | cve_pending |
映射表构建完成后,应保留原始扫描记录与映射结果的关联,确保后续漏洞优先级排序、修复跟踪和复测都能追溯到同一个内部编号和 CVE 编号。