Skip to main content
YAK

cve

cve 库提供本地 CVE(通用漏洞披露)数据库的下载、导入、查询与统计能力,便于把指纹识别结果关联到已知漏洞,支撑漏洞情报与版本比对。

典型使用场景:

  • 数据管理:cve.Download 下载 CVE 数据,cve.LoadCVE / cve.Import / cve.Export 加载导入导出,cve.AICompleteFields 用 AI 补全字段。
  • 查询:cve.GetCVE 按编号取单条,cve.Query / cve.QueryEx 按条件流式查询,配合 cve.product / cve.vendor / cve.cpe / cve.score / cve.severity / cve.after / cve.before 等选项过滤;cve.parseToCpe 解析 CPE 串。
  • 统计:cve.NewStatistics 生成统计视图。

与相邻库的关系:cvecwe(弱点分类)、sca(成分分析)、servicescan(指纹/版本识别)协同:识别出产品与版本后,用 cve 关联已知漏洞。

共 22 个函数

函数索引

函数参数返回值说明
cve.Exportfilename stringerrorExportCVE 将所有 CVE 条目导出为 JSONL 文件(导出名为 cve.Export)
cve.GetCVEcve string*cveresources.CVE按 CVE 编号查询单条 CVE 记录(导出名为 cve.GetCVE)
cve.Importfilename stringerrorImportCVE 从 JSONL 文件导入 CVE 条目(导出名为 cve.Import)
cve.NewStatisticssource string*Statistics创建一个 CVE 统计对象,用于汇总指定来源的漏洞统计信息(导出名为 cve.NewStatistics)
cve.aiConcurrentn intCVEAICompleteOptionWithCVEAIConcurrent 设置 AI 补全 CVE 字段时的并发数(导出名为 cve.aiConcurrent)
cve.parseToCpecpe string*CPE, error将 CPE 字符串解析为结构化的 CPE 对象(导出名为 cve.parseToCpe)
cve.testLimitn intCVEAICompleteOptionWithCVETestLimit 限制 AI 补全处理的 CVE 数量,常用于测试(导出名为 cve.testLimit)

可变参数函数索引

函数参数返回值说明
cve.AICompleteFieldsopts ...anyerror使用 AI 补全 CVE 缺失字段(如中文翻译,导出名为 cve.AICompleteFields)
cve.Downloaddir string, cached bool, years ...interror
cve.LoadCVEfileDir string, DbPath string, years ...int-从本地 CVE json 数据文件加载并构建 CVE 数据库(导出名为 cve.LoadCVE)
cve.Querydb *gorm.DB, opts ...CVEOptionchan *cveresources.CVEQueryCVEYields 在 CVE 数据库上按条件流式查询 CVE 记录(导出名为 cve.Query)
cve.QueryExi ...anychan *cveresources.CVE使用默认 CVE 数据库按可选项流式查询 CVE(导出名为 cve.QueryEx)

函数详情

Export

Export(filename string) error

ExportCVE 将所有 CVE 条目导出为 JSONL 文件(导出名为 cve.Export)

每行是一个表示 CVE 条目的 JSON 对象

参数

参数名类型说明
filenamestring导出目标文件路径

返回值

序号类型说明
r1error错误信息

示例

// 示意性示例,需要本地 CVE 数据库
err = cve.Export("/tmp/cve.jsonl")
if err != nil { die(err) }

GetCVE

GetCVE(cve string) *cveresources.CVE

按 CVE 编号查询单条 CVE 记录(导出名为 cve.GetCVE)

参数

参数名类型说明
cvestringCVE 编号,如 CVE-2021-44228

返回值

序号类型说明
r1*cveresources.CVE对应的 CVE 记录,未找到时为 nil

示例

// 示意性示例,需要本地 CVE 数据库
c = cve.GetCVE("CVE-2021-44228")
if c != nil { println(c.CVE) }

Import

Import(filename string) error

ImportCVE 从 JSONL 文件导入 CVE 条目(导出名为 cve.Import)

每行应为一个表示 CVE 条目的 JSON 对象

参数

参数名类型说明
filenamestring导入源文件路径

返回值

序号类型说明
r1error错误信息

示例

// 示意性示例,需要本地 CVE 数据库
err = cve.Import("/tmp/cve.jsonl")
if err != nil { die(err) }

NewStatistics

NewStatistics(source string) *Statistics

创建一个 CVE 统计对象,用于汇总指定来源的漏洞统计信息(导出名为 cve.NewStatistics)

参数

参数名类型说明
sourcestring统计数据来源标识

返回值

序号类型说明
r1*StatisticsCVE 统计对象

示例

// 示意性示例,需要本地 CVE 数据库
stat = cve.NewStatistics("my-scan")
dump(stat)

aiConcurrent

aiConcurrent(n int) CVEAICompleteOption

WithCVEAIConcurrent 设置 AI 补全 CVE 字段时的并发数(导出名为 cve.aiConcurrent)

参数

参数名类型说明
nint并发工作协程数

返回值

序号类型说明
r1CVEAICompleteOptionCVE AI 补全可选项

示例

// 示意性示例,需要 AI 配置与 CVE 数据库
err = cve.AICompleteFields(cve.aiConcurrent(5))

parseToCpe

parseToCpe(cpe string) (*CPE, error)

将 CPE 字符串解析为结构化的 CPE 对象(导出名为 cve.parseToCpe)

同时支持 CPE 2.2(cpe:/...)与 CPE 2.3(cpe:2.3:...)两种格式,解析出

part/vendor/product/version 等字段

参数

参数名类型说明
cpestringCPE 字符串,如 "cpe:/a:apache:http_server:2.4.49"

返回值

序号类型说明
r1*CPE解析得到的 CPE 对象,包含 Part/Vendor/Product/Version 等字段
r2error错误信息(输入不是合法 CPE 字符串时返回)

示例

cpe = cve.parseToCpe("cpe:/a:apache:http_server:2.4.49")~
println(cpe.Vendor + " " + cpe.Product + " " + cpe.Version)
assert cpe.Vendor == "apache", "vendor should be apache"
assert cpe.Product == "http_server", "product should be http_server"
assert cpe.Version == "2.4.49", "version should be 2.4.49"

testLimit

testLimit(n int) CVEAICompleteOption

WithCVETestLimit 限制 AI 补全处理的 CVE 数量,常用于测试(导出名为 cve.testLimit)

参数

参数名类型说明
nint最大处理数量,0 表示不限制

返回值

序号类型说明
r1CVEAICompleteOptionCVE AI 补全可选项

示例

// 示意性示例,需要 AI 配置与 CVE 数据库
err = cve.AICompleteFields(cve.testLimit(10))

可变参数函数详情

AICompleteFields

AICompleteFields(opts ...any) error

使用 AI 补全 CVE 缺失字段(如中文翻译,导出名为 cve.AICompleteFields)

可选参数

参数名类型说明
opts...any可选项,如 cve.aiConcurrent、cve.testLimit 或 ai.type 等 AI 配置

返回值

序号类型说明
r1error错误信息

示例

// 示意性示例,需要 AI 配置与 CVE 数据库
err = cve.AICompleteFields(cve.aiConcurrent(10), cve.testLimit(5))
if err != nil { die(err) }

Download

Download(dir string, cached bool, years ...int) error

暂无描述

必填参数

参数名类型说明
dirstring
cachedbool

可选参数

参数名类型说明
years...int

返回值

序号类型说明
r1error

LoadCVE

LoadCVE(fileDir string, DbPath string, years ...int)

从本地 CVE json 数据文件加载并构建 CVE 数据库(导出名为 cve.LoadCVE)

必填参数

参数名类型说明
fileDirstring存放 CVE json 数据文件的目录
DbPathstring构建出的数据库文件路径

可选参数

参数名类型说明
years...int可选的指定年份,缺省时加载全部

示例

// 示意性示例,需要本地 CVE json 数据
cve.LoadCVE("/tmp/cve-data", "/tmp/cve.db", 2021, 2022)

Query

Query(db *gorm.DB, opts ...CVEOption) chan *cveresources.CVE

QueryCVEYields 在 CVE 数据库上按条件流式查询 CVE 记录(导出名为 cve.Query)

需要本地 CVE 数据库,通过 cve.cve/cve.vendor/cve.product 等可选项组合过滤条件

必填参数

参数名类型说明
db*gorm.DBCVE 数据库连接

可选参数

可作为可变参数 opts ...CVEOption 传入选项;共 10 个可用选项,详见 CVEOption 选项列表

返回值

序号类型说明
r1chan *cveresources.CVECVE 记录的流式通道

示例

// 示意性示例,需要本地 CVE 数据库
db = cve.GetCVEDatabase()

for c in cve.Query(db, cve.vendor("apache"), cve.severity("high")) {
println(c.CVE)
}

QueryEx

QueryEx(i ...any) chan *cveresources.CVE

使用默认 CVE 数据库按可选项流式查询 CVE(导出名为 cve.QueryEx)

与 cve.Query 类似,但自动获取默认 CVE 数据库连接,无需手动传入

可选参数

参数名类型说明
i...any查询可选项,如 cve.vendor、cve.product 等

返回值

序号类型说明
r1chan *cveresources.CVECVE 记录的流式通道

示例

// 示意性示例,需要本地 CVE 数据库

for c in cve.QueryEx(cve.vendor("apache")) {
println(c.CVE)
}

可变参数选项列表

以下按选项类型汇总全部可变参数选项(原先重复在各主函数下的选项表已收拢到此处):

1. 类型:CVEOption

涉及到的函数有:cve.Query

选项函数参数返回值说明
cve.afteryear int, data ...intCVEOption过滤指定日期之后发布的 CVE
cve.beforeyear int, data ...intCVEOption过滤指定日期之前发布的 CVE
cve.cpec stringCVEOption按 CPE 字符串过滤 CVE,支持版本区间写法
cve.cveid stringCVEOption按 CVE 编号过滤查询
cve.cwecwe stringCVEOption按 CWE 编号过滤 CVE 查询
cve.productp string, v ...stringCVEOptionProductWithVersion 按产品名(可选版本)过滤 CVE
cve.scorescore float64CVEOption按最低利用评分(CVSS)过滤 CVE
cve.severitylevel stringCVEOption按危害等级过滤 CVE
cve.skipAnyVersionflag boolCVEOptionSkipUnboundedWildcard 设置是否跳过无边界通配的 CPE 匹配
cve.vendorv stringCVEOption按厂商名称过滤 CVE