漏洞信息采集:NVD、CNNVD、CNVD 与 GitHub Advisory 实战

做漏洞管理,第一步不是去翻 CVE 编号,而是搞清楚「去哪儿查、怎么查、查完怎么用」。我见过不少团队,拿着一个 CVE 号就去打补丁,结果补丁打错了版本,或者压根没影响自己的组件。说白了,信息采集这一步没走稳,后面全是坑。

这一章,我带你过一遍四个主流数据源:NVD、CNNVD、CNVD 和 GitHub Advisory Database。每个都有它的脾气,也有它的价值。

2.1 NVD 数据库:全球漏洞的「官方档案」

NVD(National Vulnerability Database)是美国 NIST 维护的漏洞库。它不生产 CVE,但给每个 CVE 打上了「结构化标签」——CVSS 评分、CPE 匹配、CWE 分类。我个人习惯,所有漏洞分析的第一步,永远是去 NVD 确认基础信息。

2.1.1 怎么高效查 NVD?

NVD 的搜索其实挺灵活的。你可以在搜索框里直接拼关键字,也可以用它的高级过滤。我常用的几个技巧:

  • 按时间范围过滤:pubStartDate=2024-01-01&pubEndDate=2024-12-31,适合做月度漏洞盘点。
  • 按 CVSS 分数排序:cvssV3Severity=CRITICAL,只看高危。
  • 按 CPE 匹配产品:比如 cpe:2.3:a:apache:log4j,直接定位到组件。

我的小技巧:NVD 的 API 比网页搜索好用得多。写个脚本每天拉一次增量数据,比手动翻页效率高十倍。我曾经用 Python 写了个定时任务,每天凌晨拉取前 24 小时的新增 CVE,然后自动匹配内部资产清单。

2.1.2 CPE 匹配:别小看这个字段

CPE(Common Platform Enumeration)是 NVD 的灵魂。每个 CVE 会关联一组受影响的 CPE 字符串。比如:

cpe:2.3:a:apache:log4j:2.14.1:*:*:*:*:*:*:*

这个字符串拆开看:a 表示应用,apache 是厂商,log4j 是产品名,2.14.1 是版本。你想想看,如果你的资产清单里也维护了 CPE 字段,那匹配就是秒级的事。

注意:CPE 匹配不是万能的。有些厂商的产品名写得不规范,比如「Windows 10」和「Windows_10」可能同时存在。我建议你在做自动化匹配时,先做一次 CPE 标准化清洗。

2.2 CNNVD 与 CNVD:国内漏洞库的「双生子」

做国内合规或者等保项目时,NVD 有时候不够用。CNNVD(中国国家漏洞数据库)和 CNVD(国家信息安全漏洞共享平台)是必须了解的两个库。很多人分不清它们,我简单说说差异。

对比维度 CNNVD CNVD
维护单位 中国信息安全测评中心 国家互联网应急中心(CNCERT)
编号格式 CNNVD-202412-3456 CNVD-2024-12345
覆盖范围 偏向通用软硬件漏洞 偏向国内行业、工控、物联网
CVSS 评分 有,但更新有时滞后 部分漏洞有自评
补丁信息 相对完整 部分漏洞有厂商修复建议
适用场景 等保合规、政府项目 国内资产、行业监管

我个人经验是:做国际业务优先看 NVD,做国内合规两个都得看。CNNVD 的编号和 NVD 的 CVE 有映射关系,但 CNVD 的编号体系是独立的,有时候同一个漏洞在 CNVD 里会有更详细的国内影响范围描述。

避坑指南:我曾经遇到一个工控漏洞,NVD 上只写了影响 Siemens 某款 PLC,但 CNVD 里补充了「该漏洞已被国内某厂商的 ODM 产品使用」。如果只看 NVD,你可能会漏掉这部分资产。

2.3 GitHub Advisory Database:开源社区的「实时情报」

GitHub Advisory Database 是 GitHub 维护的漏洞库,专门针对开源生态。它的特点是:更新快、直接关联仓库、有修复 commit。我特别喜欢它的「Advisory」页面,每个漏洞都直接链到受影响的 GitHub 仓库和修复 PR。

2.3.1 怎么用 GitHub Advisory?

你可以在 github.com/advisories 直接搜索,也可以用 GitHub 的 API。我常用的方式:

  • 按生态过滤:比如 ecosystem:npm 只看 npm 包。
  • 按严重程度:severity:critical。
  • 查看修复 commit:每个 Advisory 都有 Patched Versions 和 Fixed Commit 字段。
# 用 gh CLI 查询某个仓库的漏洞
gh api /advisories?ecosystem=npm&per_page=10

嗯,这里要注意:GitHub Advisory 的数据会同步到 NVD,但通常比 NVD 快 1-3 天。对于紧急漏洞,我建议直接盯 GitHub Advisory。

2.3.2 实战:用 GitHub Advisory 做补丁溯源

假设你发现一个 npm 包有漏洞,但不知道具体修在哪一版。去 GitHub Advisory 搜一下,直接看 Patched Versions 和 Fixed Commit。我举个例子:

  • 漏洞:CVE-2024-1234
  • 影响:lodash < 4.17.21
  • 修复 commit:abc123
  • 修复版本:4.17.21

有了这些信息,你就能精确判断:当前用的版本是否在影响范围内,以及升级到哪个版本能彻底修复。

我的习惯:把 GitHub Advisory 的 RSS 订阅到内部监控系统。一旦有新的 Advisory 发布,自动触发资产匹配和告警。比等 NVD 更新快不少。

2.4 知识体系总览:一张图看懂漏洞信息采集

下面这张图,我把四个数据源的核心流程和关系画出来了。你可以把它当作本章的「地图」。

漏洞信息采集知识体系 漏洞信息采集知识体系 NVD NIST 官方漏洞库 CNNVD 中国信息安全测评中心 CNVD CNCERT 国内行业库 GitHub Advisory 开源生态实时情报 核心字段:CVE 编号 | CVSS 评分 | CPE 匹配 | CWE 分类 | 补丁信息 每个数据源都提供这些字段,但完整度和时效性不同 采集方式:API 定时拉取 | RSS 订阅 | 网页搜索 | 自动化脚本 推荐组合:API 做批量 + RSS 做实时告警 输出:结构化漏洞清单 | 资产匹配结果 | 补丁优先级排序 为后续的 CVE 匹配和补丁优先级策略提供输入 💡 核心原则:多源交叉验证,不依赖单一数据源 NVD 做基础、CNNVD/CNVD 做国内补充、GitHub Advisory 做实时追踪

2.5 实战建议:怎么组合使用这四个数据源?

我自己的流程是这样的,你可以参考:

  1. 日常监控:GitHub Advisory RSS + NVD API 每日增量拉取。
  2. 漏洞分析:先去 NVD 看 CVSS 和 CPE,再去 GitHub Advisory 看修复 commit。
  3. 国内合规:交叉查 CNNVD 和 CNVD,确认国内影响范围和监管要求。
  4. 补丁决策:综合四个数据源的补丁信息,确定最小修复版本。

核心原则:多源交叉验证,不依赖单一数据源。NVD 可能更新慢,CNVD 可能覆盖不全,GitHub Advisory 可能只针对开源。只有组合使用,才能拿到最完整的漏洞画像。

好了,这一章的内容就到这里。信息采集是漏洞管理的「地基」,地基稳了,后面的匹配和优先级排序才能站得住脚。