恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
Fleet 漏洞扫描管线与 NVD Tools 实战指南:CPE 采集、漏洞匹配与多源数据源集成
首页
资讯中心
/
Fleet 漏洞扫描管线与 NVD Tools 实战指南:CPE 采集、漏洞匹配与多源数据源集成
Fleet 漏洞扫描管线与 NVD Tools 实战指南:CPE 采集、漏洞匹配与多源数据源集成
发布时间:2026/9/21 1:51:42
Fleet 漏洞扫描管线与 NVD Tools 实战指南CPE 采集、漏洞匹配与多源数据源集成【免费下载链接】fleetOpen device management项目地址: https://gitcode.com/GitHub_Trending/fl/fleetFleet 是开源的设备管理平台其服务端在 server/vulnerabilities/nvd/tools 目录下内置了一套源自 facebookincubator/nvdtools 的 NVD美国国家漏洞数据库工具集用于将设备软件清单转换为 CPE通用平台枚举并与 CVE 漏洞数据做匹配。本文将完整介绍这套工具的命令行用法、采集器/处理器管线的搭建方式、底层匹配算法以及它在 Fleet 服务端实际漏洞处理流程中的落地方式帮助读者掌握如何构建自己的 CPE 库存到 CVE 报告的处理管道。目录结构与工具总览server/vulnerabilities/nvd/tools目录原文档称其内容于 2024 年 4 月从 nvdtools 仓库复制而来包含以下组件cpedict/CPE 字典解析cvefeed/NVD CVE 数据源解析与匹配引擎含nvd子包和schemaproviders/数据源提供方含nvd同步实现与lib/client、lib/rate等基础设施wfn/CPE 2.3 WFNWell-Formed Name的解析、匹配与序列化HOWTO.md更宏观的使用视角生产环境管线设计README.md、Makefile、nvdtools.spec、LICENSE。命令行工具清单工具作用cpe2cve扫描 CPE 名称清单输出命中的 CVEcsv2cpe从 CSV 输入生成 URI 形式 CPEfireeye2nvd下载 FireEye 漏洞数据并转为 NVD 格式flexera2nvd下载 Flexera 漏洞数据并转为 NVD 格式idefense2nvd下载 Idefense 漏洞数据并转为 NVD 格式nvdsync将 NVD 数据源同步到本地目录校验哈希、增量更新rpm2cpe从 RPM 包名解析出 CPErustsec2nvd将 RustSec Advisory-DB 转为 NVD 格式snyk2nvd下载 Snyk 漏洞数据并转为 NVD 格式vfeed2nvd将 vFeed 漏洞数据转为 NVD 格式vulndb管理基于 MySQL 的 NVD 风格漏洞数据库另有三个可复用 Go 库cvss2CVSS v2 规范的向量序列化/反序列化与评分计算cvss3CVSS v3 规范同样功能wfnCPE 2.3 WFN 的处理。环境要求、安装与构建环境要求Go 1.13 或更新版本需要配置好 Go 环境。安装不同 Go 版本有不同的安装方式Go 1.13~1.14 使用go getgo get github.com/facebookincubator/nvdtools/... cd $GOPATH/src/github.com/facebookincubator/nvdtools/cmd go install ./...从 Go 1.15 起模块不再下载到GOPATH而是进入GOMODCACHE推荐先 clone 仓库再go installgit clone https://github.com/facebookincubator/nvdtools cd nvdtools go install ./...Go 1.17 起go get已弃用改用go installgo install github.com/facebookincubator/nvdtools/...latest构建go mod init github.com/facebookincubator/nvdtools go mod tidy make cp build/bin/* ~/go/bin/核心命令行工具详解cpe2cveCPE 库存漏洞扫描器cpe2cve是最核心的漏洞匹配处理器。它从标准输入读取“定界符分隔字段”的行其中某一字段是逗号分隔的 CPE 名称列表漏洞数据源以 JSON 格式作为命令行参数传入输出为在原输入字段基础上附加 CVE ID 与匹配该漏洞的 CPE 列表。可用选项-e从输出中擦除指定输入字段-d/-d2输入字段分隔符与输入 CPE 列表分隔符-o/-o2输出字段分隔符与输出 CPE 列表分隔符-cve/-matches指定 CVE 输出列与匹配 CPE 输出列-cwe额外输出 CWE 列见 HOWTO。先下载 NVD 数据源README 中的方法curl -o- -s -k -v https://nvd.nist.gov/vuln/data-feeds data-feeds.html cat>echo cpe:/a:apache|cpe2cve -cpe 1 -e 1 -cve 1 nvdcve-1.1-*.json.gz echo cpe:/a:gnu:glibc:2.28 | cpe2cve -cpe 1 -e 1 -cve 1 nvdcve-1.0-*.json.gz输出CVE-2009-4881 CVE-2015-8985 CVE-2016-4429 CVE-2010-3192 CVE-2010-4756示例 2按主机输出软件清单命中的漏洞注意-d 、-d2 ,、-o 、-o2 ,、-cpe 2、-e 2、-matches 3、-cve 2的组合./cpe2cve -d -d2 , -o -o2 , -cpe 2 -e 2 -matches 3 -cve 2 nvdcve-1.0-*.json.gz EOF host1.foo.bar cpe:/a:gnu:glibc:2.28,cpe:/a:gnu:zlib:1.2.8 host2.foo.bar cpe:/a:gnu:glibc:2.28,cpe:/a:haxx:curl:7.55.0 EOF输出host1.foo.bar CVE-2009-4881 cpe:/a:gnu:glibc:2.28 host1.foo.bar CVE-2016-4429 cpe:/a:gnu:glibc:2.28 host2.foo.bar CVE-2014-5119 cpe:/a:gnu:glibc:2.28 ...从底层实现看cpe2cve的匹配能力由 server/vulnerabilities/nvd/tools/cvefeed/feed.go 的ParseJSON提供它读取数据源后对每个CVEItem调用nvd.ToVuln构造匹配器setupReader会嗅探文件头——0x1f 0x8b走 gzip 解压、BZ走 bzip2 解压——因此可直接传入nvdcve-1.0-*.json.gz这类压缩数据源文件。csv2cpeCSV 生成 CPEcsv2cpe从 CSV 输入生成 URI 形式的 CPE各字段含义由 flag 指定Flag含义-cpe_part产品类别h硬件、a应用、o操作系统-cpe_vendor生产产品的个人或组织-cpe_product产品最常见、可识别的名称-cpe_version具体发布版本-cpe_update更新、服务包或补丁版本-cpe_edition版本相关的市场术语CPE 2.3 中已弃用向后兼容 2.2 时可为 ANY-cpe_swedition产品面向的市场或最终用户类别-cpe_targetsw产品运行所需的软件计算环境-cpe_targethw产品运行所需的硬件计算环境-cpe_language产品用户界面支持的语言须符合 RFC5646 语言标签-cpe_other其他厂商/产品专属描述信息省略的属性默认取逻辑值 ANY依 NISTIR 7695 规范。可选 flag-lower将字符串转为小写。示例echo a,Microsoft,Internet Explorer,8.1,SP1,-,* | csv2cpe -x -lower -cpe_part1 -cpe_vendor2 -cpe_product3 -cpe_version4 -cpe_update5 -cpe_edition6 -cpe_language7输出cpe:/a:microsoft:internet_explorer:8.1:sp1:-底层对应 server/vulnerabilities/nvd/tools/wfn 包Parse同时支持cpe:/URI 绑定与cpe:2.3:格式化字符串绑定两种输入WFNize负责把任意字符串规范化为 CPE 2.3 合规的 avstring 值替换空格为下划线、剔除非法字符、处理*?通配符与转义Attributes结构体完整定义了 CPE 2.3 的 11 个属性part、vendor、product、version、update、edition、sw_edition、target_sw、target_hw、other、language。各类数据转换工具fireeye2nvd下载 FireEye 漏洞数据并转为 NVD 格式产物可直接作为cpe2cve的数据源flexera2nvd同上数据源为 Flexeraidefense2nvd同上数据源为 Idefenserustsec2nvd将 RustSec Advisory-DB 的漏洞转为 NVD 格式snyk2nvd下载 Snyk 漏洞数据并转为 NVD 格式vfeed2nvd将 vFeed 漏洞数据转为 NVD 格式。这些工具的价值在于NVD 官方数据源对部分生态php、python、nodejs、go覆盖不足通过多厂商数据源转换可以在cpe2cve处理器中统一使用。rpm2cpe从 RPM 包名解析 CPErpm2cpe接收定界符分隔输入其中一字段为 RPM 包名输出原字段 从包名解析出的 CPEecho openoffice-eu-writer-4.1.5-9789.i586.rpm | rpm2cpe -rpm1 -cpe2 -e1输出cpe:/a::openoffice-eu-writer:4.1.5:9789:~~~~i586~nvdsync同步 NVD 数据源nvdsync将 NVD 数据源同步到本地目录会对照 NVD 提供的哈希校验只更新发生变化的文件。底层同步逻辑可参考 server/vulnerabilities/nvd/tools/providers/nvd/sync.goSync.Do先创建本地目录再对每个 feed 执行同步并聚合错误Syncer接口抽象了数据源同步器。vulndb管理 MySQL 漏洞数据库vulndb是基于 MySQL 的 NVD 风格漏洞数据库管理工具支持 NVD CVE JSON 1.0 数据源数据按厂商命名、按 vendor/custom/snoozes 三个数据集组织Vendor dataset只读、持续导入的 CVE 数据源Custom dataset允许在导出时用自定义数据覆盖 vendor 数据Snooze dataset用户定义的 CVE 及带截止日期的元数据用于修复自动化。详见vulndb help。可复用库cvss2、cvss3 与 wfncvss2CVSS v2 规范实现提供向量序列化/反序列化与评分计算cvss3CVSS v3 规范实现功能同上wfnCPE 2.3 WFN 处理包含Parse自动识别 URI/格式化字符串两种绑定、Attributes数据模型、WFNize规范化、NewAttributesWithNA/WithAny等工具函数以及matcher.go、matching.go、uri.go、fsb.go等文件中的匹配与序列化逻辑均配套有测试用例如 wfn_test.go、uri_test.go、fsb_test.go、matching_test.go。端到端管线从采集到报告server/vulnerabilities/nvd/tools/HOWTO.md 给出了更完整的生产视角。整个管线的设计思想是用 nvdtools 作为积木把数据采集与处理/报告解耦处理与报告的重活放到数据仓库中执行。最小可运行管线先同步漏洞数据库nvdsync -v1 -cve_feedcve-1.0.json.gz /tmp/nvd再构建 CPE 库存最简单的方式是直接用 rpm 包名rpm -qa | rpm2cpe -rpm1 -cpe2最后交给cpe2cve处理rpm -qa | \ rpm2cpe -rpm1 -cpe2 | \ cpe2cve -cpe2 -cve3 -cwe4 /tmp/nvd/*.json.gzNVD 中不少 CVE 影响的是“多个 CPE 的组合”如 A and B and not C因此按主机分组、整批处理效果更好set -o pipefail (hostname rpm -qa | rpm2cpe -rpm1 -cpe2 -e1 | sort -u | paste -s -d, | \ cpe2cve -cpe1 -cve2 -e1 /tmp/nvd/*.json.gz | paste -s -d,) | paste -s -d\t四类库存Collectors生产环境中建议区分以下库存类别Hosted software软件仓库源码与二进制、一方与三方中可供 fleet 使用的包Installed software机器或容器上实际安装的包最好来自受管仓库Running software机器/容器上正在执行的进程最好来自已知包Hardware可生成 CPE 的硬件清单如cpe:/h:dell:inspiron:8500。Hosted software 采集示例yum 仓库-e1擦除 jq 注入的 a 部分、-i1让 csv2cpe 把 CPE 放到输出第 1 列、-o$\t使用制表符输出Q({vendor:%{VENDOR},product:%{NAME},version:%{VERSION},update:%{RELEASE},target_hw:%{ARCH},metadata:{product_group:%{REPO},package_name:%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}.rpm,package_source:%{SOURCERPM}}}) set -o pipefail repoquery -C --all --queryformat ${Q[]} | \ jq -r [ a, .vendor, .product, .version // -, .update, .sw_edition, .target_sw, .target_hw, ( .metadata | tojson ) ] | csv | \ csv2cpe \ -cpe_part1 \ -cpe_vendor2 \ -cpe_product3 \ -cpe_version4 \ -cpe_update5 \ -cpe_swedition6 \ -cpe_targetsw7 \ -cpe_targethw8 \ -e1 \ -i1 \ -lower \ -o$\t输出为制表符分隔的列cpe, vendor, product, version, update, sw_edition, target_sw, target_hw, metadata_json该输出可直接追加mysqlimport写入 MySQL或写入消息队列。metadata字段保留原始包信息包名、来源等便于后续报告按用户熟悉的包名呈现而不必强迫用户学习 CPE 格式。Installed software 采集主要借助 osquery 定期对机器做快照并投递到数据仓库优势是用 SQL 式接口覆盖所有主流操作系统。macOS 版本与已装 App 的查询Q( SELECT o AS part, apple AS vendor, os.name AS product, os.version FROM os_version AS os ; SELECT a AS part, AS vendor, bundle_name AS product, bundle_version AS version FROM apps WHERE bundle_name IS NOT NULL AND bundle_name ; ) osqueryi --json ${Q[]}osquery 虽然支持--csv但 JSON 输出在处理 NULL 等场景更灵活用 jq 重新格式化为 CSV 后再交给 csv2cpeset -o pipefail osqueryi --json ${Q[]} | \ jq -r .[] | [.part, .vendor, .product, .version // -] | csv | \ csv2cpe \ -cpe_part1 \ -cpe_vendor2 \ -cpe_product3 \ -cpe_version4 \ -e1 \ -i1 \ -lower \ -o$\t把 NULL 版本转成-很重要它让处理器在匹配时把 dash 当作 Not Available 处理而不是把空串当作 Any。RPM 包信息更丰富可携带额外元数据用于与 hosted 库存交叉匹配含 os_version system_info rpm_packages 的复杂查询输出含 package_name、package_source、package_sha1、package_size 等元数据完整示例见 HOWTO.md。Running software 采集进程信息单独价值有限且采集、富化、传输成本很高需评估是否真的必要。osquery 可通过processes JOIN rpm_package_files JOIN rpm_packages报告可执行文件来源的 RPM 包及进程元数据process_name、parent、cwd、cmdline、pid、start_time 等完整查询见 HOWTO.mdosquery 也支持采集 docker 容器、网络与镜像信息。注意该查询在进程和包数量大时可能耗时数分钟。处理器cpe2cve与数据质量cpe2cve的输出始终是“每行一个 CVE”无论输入是单个 CPE 还是一组 CPE。需要强调的要点匹配质量完全取决于 CPE 库存与漏洞数据库的质量garbage in - garbage out为特定库存使用专门数据库如 nodejs 用 snyk可显著提升质量单独处理一个 CPE 可能漏报CVE 数据库用条件逻辑if A and B or C匹配 CPEinstalled/running 软件库存最好把全部 CPE 分组整批处理并附带一个操作系统 CPEcpe:/o处理 installed/running 库存开销大可先从“把 CPE 回配到 hosted 库存”开始在预处理/后处理阶段叠加 patch补丁报告等价于对处理器输出做grep -v、snooze一定时期或永久不报告、edits修正数据库缺失/错误信息来压制误报。cpe2cve 输入/输出默认分隔符与采集器输出一致制表符CPE 列表列默认逗号分隔各采集器示例都把 CPE 放在第 1 列因此处理器可直接消费cat inventory.csv | cpe2cve -cpe1 -cve1 /tmp/nvd/*.json.gzcpe2cve --help可查看输入输出分隔符、列表、缓存以及额外输出列CVSS 分数、CWE的全部选项。源码级原理匹配引擎如何工作数据源解析cvefeed/feed.go 的ParseJSON是入口先经setupReader嗅探 gzip/bzip2 压缩格式再按NVDCVEFeedJSON10schema 反序列化最后对每个带Configurations的 CVE 条目调用nvd.ToVuln。schema 定义见 cvefeed/nvd/schema/schema.go。CVE 到匹配器的构造server/vulnerabilities/nvd/tools/cvefeed/nvd/match_cve.go 的ToVuln遍历 CVE 的Configurations.Nodes为每个节点生成匹配器并合并为wfn.MatchAny。Vuln实现了cvefeed.Vuln接口提供ID()、CVEs()含从引用中提取 CVE 编号的正则CVE-[0-9]{4}-[0-9]{4,}、CWEs()取 en 语言的 problemtype 描述、CVSSv2/CVSSv3基础分数与向量等能力。节点与 CPE 匹配逻辑cvefeed/nvd/match_node.go 处理逻辑节点AND/ORcvefeed/nvd/match_cpe.go 实现单条 CPE 匹配规则支持Cpe23Uri优先与Cpe22Uri两种绑定解析支持versionStartIncluding/Excluding、versionEndIncluding/Excluding四个版本区间字段任一存在即标记hasVersionRangesmatch中若要求版本requireVersion且既无区间、版本又是*ANY则不匹配先做“除版本外的属性匹配”MatchWithoutVersion再处理版本精确匹配或区间比较区间比较使用SmartVerCmp见 smartvercmp.go它对带前导零等版本格式做了智能处理特殊的matchTargetSW应用类 CPEparta带 target_sw 属性时可推断出操作系统 CPEparto参与匹配从而提升对“仅声明 OS 级漏洞”的覆盖。版本区间与NA/ANY语义在 wfn/wfn.go 中逻辑值定义为Any 、NA -。空串ANY表示通配任意dashNA表示Not Applicable/Not Available。这一区别贯穿整个匹配引擎HOWTO 中特意建议把 NULL 版本转为-而非留空正是为了让 cpe2cve 将缺失版本当作 NA 处理而不是 ANY避免把无版本约束的漏洞误配到任意版本。与 Fleet 服务端漏洞处理流程的衔接该工具集在 Fleet 中并非孤立存在而是服务端漏洞处理链条的基础组件之一。Fleet 服务端在 server/vulnerabilities/nvd 下实现了一层基于此工具集的 CPE 翻译与 CVE 匹配逻辑server/vulnerabilities/nvd/cpe.go 与 server/vulnerabilities/nvd/cpe_matching_rule.go 定义了把 Fleet 软件条目映射为 CPE 的规则server/vulnerabilities/nvd/cpe_translations.json 存放翻译规则解决“Fleet 软件名 → 标准 CPE”映射不准确的问题server/vulnerabilities/nvd/sync 与 server/vulnerabilities/nvd/sync.go 负责同步 NVD 数据。其原理详见 server/vulnerabilities/nvd/README.md是每条规则含software按 name、bundle_identifier、source 匹配 Fleet 软件数组内 OR、属性间 AND与filter按 product、vendor、target_sw、part 查询本地 sqlite 中的已知 NVD CPEskip: true则直接跳过该软件。这样便能在“软件名不标准”的场景下提高 CPE 映射准确率从而改善最终 CVE 匹配质量。小结NVD Tools 提供了一条完整的“CPE 库存采集 → 漏洞数据同步/转换 → CVE 匹配 → 报告”技术路线csv2cpe/rpm2cpe负责把不同来源的资产信息规范化为 CPEnvdsync及各类*2nvd工具负责构建多厂商漏洞数据源cpe2cve完成核心匹配vulndb提供带 vendor/custom/snoozes 三层语义的 MySQL 数据管理wfn、cvss2、cvss3库则可在 Go 程序中直接复用。结合 Fleet 服务端在 server/vulnerabilities/nvd 的落地实践CPE 翻译规则与本地 CPE 库查询读者可以据此为自己的资产库存构建可扩展、可裁剪、数据质量可控的漏洞扫描与报告管线。/output_article /output_article【免费下载链接】fleetOpen device management项目地址: https://gitcode.com/GitHub_Trending/fl/fleet创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考