CVE 记录长什么样
CVE 计划从 2020 年代起用 JSON 5.0 结构替代旧的纯文本记录:每条 CVE 是一份 JSON 文档,顶层 cveMetadata 记录编号、状态、分配与发布时间,containers 里 cna 是分配机构填报的漏洞信息(描述、受影响产品、参考链接、CNA 自评分),adp 是下游授权数据发布机构补充的富化数据。做漏洞库自动入库、资产匹配和通报生成时,解析的就是这份结构。
基本信息
| 规范 | CVE JSON 5.0(cve-schema,CVE Program 维护) |
|---|---|
| 获取途径 | cve.org 记录页、GitHub cvelistV5 仓库、CVE Services API |
| 必填容器 | containers.cna,由 CNA(编号分配机构)填报 |
| 可选容器 | containers.adp,如 CISA-ADP 补充 KEV、SSVC 决策点 |
| 与 NVD 的关系 | 互补关系:字段命名不同,NVD 在 CVE 基础上做 CPE 与评分富化 |
| 排序变化 | 同一记录可能被回填修订,需按更新时间而非发布时间做增量 |
关键字段读法
| 字段 | 含义 | 使用注意 |
|---|---|---|
| cveMetadata.cveId | CVE 编号 | 全局唯一,编号年份段不等于漏洞发现年份 |
| cveMetadata.state | 记录状态 | 入库过滤 REJECTED,DISPUTED 需人工确认 |
| cveMetadata.datePublished | 首次发布时间 | 用于对外引用,不适合做增量窗口 |
| cveMetadata.dateUpdated | 最近更新时间 | 增量同步以它为准,记录被修订时才会变 |
| containers.cna.descriptions | 漏洞描述数组 | 多语言,取 lang 为 en 或 zh 的条目 |
| containers.cna.affected | 受影响产品与版本 | 常不完整,机器解析要容错并回看厂商公告 |
| containers.cna.references | 参考链接 | 带 tags,可筛 vendor-advisory 提权处理 |
| containers.adp | 下游机构补充 | KEV、SSVC 等富化数据,可能不存在 |
典型使用场景
- 自建漏洞库增量同步:按 dateUpdated 窗口拉取变更记录
- 资产匹配:用 affected 的产品与版本范围与 CMDB 比对
- 通报生成:取 descriptions 与 references 生成内网告警
- 与厂商公告交叉核对:CVE 描述缺失时以厂商 KB 为准
- 入库清洗:过滤 REJECTED、DISPUTED,避免产生无效工单
- 对外引用:报告里引用 cveId 而不是别名,便于核查
结构示意(节选)
结构示意(节选)
{
"cveMetadata": {"cveId": "CVE-2021-44228", "state": "PUBLISHED",
"datePublished": "2021-12-10T00:00:00Z",
"assignerShortName": "apache"},
"containers": {
"cna": {"descriptions": [{"lang": "en", "value": "..."}],
"affected": [{"product": "log4j",
"versions": [{"version": "2.0", "status": "affected"}]}],
"references": [{"url": "https://...", "tags": ["vendor-advisory"]}]},
"adp": [{"providerMetadata": {"shortName": "CISA-ADP"},
"metrics": [{"cvssV3_1": {}}]}]
}
}不同 CNA 的字段完整度差异很大:affected 的版本范围常缺失或只写「全部版本」,NVD 的 CPE 匹配也可能滞后,资产匹配结果要人工抽样复核。
只按 datePublished 做增量会漏掉修订记录:CNA 会回填描述、版本范围和参考链接,同步脚本要同时维护「首次入库」与「最近更新」两个时间。