shift/vulnz
GitHub: shift/vulnz
这是一个用 Go 编写的漏洞数据聚合器,整合了 28 个来源的安全数据,并针对欧盟网络弹性法案(CRA)的合规性要求进行了专门优化。
Stars: 0 | Forks: 0
# vulnz
vulnz 从 28 个提供方(NVD、操作系统发行版、欧盟监管机构、漏洞利用数据库)收集、转换并存储漏洞数据到统一的 JSON schema 中,重点关注欧盟网络弹性法案(EU Cyber Resilience Act)合规性。
## Vunnel vs vulnz (灵感来自 Vunnel)
| | Vunnel (Python) | vulnz |
|---|---|---|
| 语言 | Python 3.10+ | Go 1.25 |
| 分发方式 | pip 包 + Python 运行时 | 单个静态二进制文件 |
| 提供方数量 | 27 | 28 |
| 存储 | 仅 SQLite | 平面文件 和 SQLite |
| 并发模型 | 基于进程 | 基于 Goroutine |
| HTTP 客户端 | requests | 每主机速率限制、带退避的重试、连接池 |
| Schema 验证 | Python 类 | JSON Schema (编程式) |
| EU CRA 支持 | 部分 | 完整 (KEV, EUVD, BSI CERT-Bund, CERT-FR, CISA ICS-CERT) |
## 安装
```
git clone https://github.com/shift/vulnz.git
cd vulnz
go build -o vulnz ./cmd/vulnz
```
或使用 Make:
```
make build
```
## 快速开始
```
./vulnz list
./vulnz run kev
./vulnz run --all
./vulnz run --all --parallel 8
```
## CLI 参考
### 全局标志
| 标志 | 简写 | 默认值 | 描述 |
|---|---|---|---|
| `--config` | `-c` | `~/.vulnz.yaml` | 配置文件路径 |
| `--log-level` | `-l` | `info` | 日志级别 |
| `--verbose` | `-v` | `false` | 详细输出 |
| `--output` | `-o` | `text` | 输出格式 |
### 命令
```
vulnz run [provider] Run one or more providers
vulnz list List registered providers
vulnz status [provider] Show provider status and data freshness
vulnz clear [provider] Clear provider workspace data
vulnz config show Display current configuration
vulnz config validate Validate configuration file
vulnz version Show version, commit, and build info
```
### Run 标志
| 标志 | 简写 | 默认值 | 描述 |
|---|---|---|---|
| `--all` | `-a` | `false` | 运行所有已注册的提供方 |
| `--provider` | `-p` | | 特定提供方,逗号分隔 |
| `--workspace` | `-w` | `./data` | 工作空间根目录 |
| `--parallel` | | `4` | 最大并发提供方执行数 |
| `--since` | | | 仅获取晚于时间戳 的数据 |
## 提供方
| 提供方 | 描述 | 数据源 |
|---|---|---|
| `kev` | 已知被利用漏洞 | EUVD 统一 KEV dump |
| `euvd` | 欧盟漏洞数据库 | ENISA 被利用漏洞 API |
| `euvd-mapping` | CVE-EUVD ID 映射 | ENISA 映射 CSV |
| `nvd` | 国家漏洞数据库 | NVD CVE API 2.0 |
| `rhel` | Red Hat Enterprise Linux | CSAF 2.0 公告 |
| `ubuntu` | Ubuntu Security | CVE tracker git repo |
| `debian` | Debian Security | JSON + DSA text |
| `alpine` | Alpine Linux | secdb JSON |
| `amazon` | Amazon Linux | RSS XML + HTML |
| `oracle` | Oracle Linux | OVAL XML |
| `sles` | SUSE Linux Enterprise | OVAL XML |
| `mariner` | Azure Linux Mariner | OVAL XML |
| `rocky` | Rocky Linux | OSV API |
| `alma` | AlmaLinux | OSV git repo |
| `fedora` | Fedora | Bodhi REST API |
| `arch` | Arch Linux | JSON + ASA |
| `wolfi` | Wolfi OS | secdb JSON |
| `chainguard` | Chainguard | secdb JSON |
| `chainguard-libraries` | Chainguard Libraries | OpenVEX JSON |
| `minimos` | Minimos | secdb JSON |
| `bitnami` | Bitnami | vulndb git repo |
| `bsi-cert-bund` | BSI CERT-Bund | CSAF 2.0 JSON |
| `cisa-ics-cert` | CISA ICS-CERT | CSAF 2.0 + GitHub API |
| `cert-fr` | CERT-FR (ANSSI) | RSS XML + HTML |
| `epss` | 漏洞利用预测评分 | EPSS CSV |
| `eol` | 生命周期结束日期 | endoflife.date API |
| `photon` | Photon OS | CVE JSON + wiki |
| `secureos` | SecureOS | secdb gzip + SHA256 |
## 架构
```
cmd/vulnz/ CLI entry point
internal/
cli/ Cobra command definitions
provider/ Provider framework (registry, executor, interfaces)
providers/ Blank imports for provider registration
storage/ Flat-file and SQLite storage backends
workspace/ Workspace management (locks, checksums, state)
http/ HTTP client with rate limiting, retry, backoff
schema/ JSON Schema validation
utils/
oval/ OVAL XML parser
csaf/ CSAF 2.0 parser
rpm/ RPM version comparison
vulnerability/ Vulnerability type definitions
archive/ Archive extraction utilities
date/ Date parsing helpers
```
每个提供方都实现 `Provider` 接口,通过 `init()` 注册自己,并在运行时通过提供方注册表被发现。执行器以可配置的并行度和每个提供方的超时设置并发运行提供方。
## 配置
配置文件:`~/.vulnz.yaml`(或 `--config` 标志)。示例配置可在 [`config.example.yaml`](config.example.yaml) 中找到。
配置优先级:CLI 标志 > 环境变量(`VULNZ_` 前缀)> 配置文件。
关键设置:
```
log:
level: info
root: ./data
executor:
max_concurrent: 4
timeout: 30m
providers:
nvd:
runtime:
result_store: sqlite
existing_results: delete-before-write
api_key: "${NVD_API_KEY}"
```
建议使用环境变量 `NVD_API_KEY` 以绕过 NVD API 速率限制。
## 输出
提供方将结果存储在 `//storage/` 下。每个漏洞都是一个遵循标准化输出 schema 的 JSON 文件。
## EU CRA 合规性
vulnz 专门专注于欧盟网络弹性法案(EU Cyber Resilience Act)合规性。多个提供方携带 EU CRA 所需的数据:
- **KEV** -- 带有来源归因的 `exploited_in_wild` 标志
- **EUVD** -- 来自 ENISA 的 `exploitedSince` 日期
- **BSI CERT-Bund** -- 德国严重性映射,TR-03116 合规字段
- **CERT-FR** -- ANSSI 漏洞跟踪
- **CISA ICS-CERT** -- ICS 公告数据
所有面向欧盟的提供方都标记为 `eu-cra`,并以标准化的 Vunnel 漏洞 schema 生成数据。
## 开发
```
make test Run tests with coverage
make lint Run linters (go vet, go fmt, golangci-lint)
make clean Remove build artifacts
make deps Download and tidy dependencies
```
### 添加提供方
1. 创建 `internal/provider//` 目录,包含 `provider.go` 和 `manager.go`
2. 实现 `Provider` 接口
3. 通过在 `internal/providers/register.go` 中进行空白导入 来注册
4. 在 `_suite_test.go` 文件中添加测试(使用 Ginkgo/Gomega)
## 已知限制
### 处理大型 JSON Payload 时的内存使用
某些提供方(特别是 `nvd`、`ubuntu`、`alpine`)目前在解析前会将整个 JSON 响应加载到内存中。在处理多 GB 数据集时,这可能会导致高内存使用或在较小的机器上出现内存不足(OOM)崩溃。
**变通方法:**
- 单独运行内存密集型提供方:`./vulnz run nvd`
- 确保足够的 RAM(完整 `--all` 运行建议 8GB+)
- 使用 `--parallel 1` 标志以减少并发内存压力
**跟踪:** 这是一个已知问题,将通过迁移到流式 JSON 解析 (`json.NewDecoder`) 来解决。请参阅 [GitHub Issue #1](https://github.com/shift/vulnz/issues/1)。
### 孤立的 SQLite WAL 文件
如果进程被强制终止 (SIGKILL),临时 SQLite 数据库文件(`.db`、`.wal`、`.shm`)可能会遗留在工作空间目录中。这些文件可以安全地手动删除。
**跟踪:** 计划在启动时自动清理。请参阅 [GitHub Issue #2](https://github.com/shift/vulnz/issues/2)。
## 许可证
AGPL-3.0 -- 参见 [LICENSE](LICENSE)。
## 致谢
由 [shift](https://github.com/shift) 创建,灵感来自 Anchore, Inc. 的 [Vunnel](https://github.com/anchore/vunnel)。
标签:BSI, CERT-Bund, CERT-FR, DNS解析, EU CRA, EVTX分析, Exploit数据库, Goroutine, Go语言, GPT, ICS-CERT, JSON Schema, KEV, NVD, SQLite, 命令控制, 威胁情报, 安全合规, 开发者工具, 开源项目, 操作系统漏洞, 数据采集, 日志审计, 欧盟法规, 漏洞管理, 漏洞聚合, 程序破解, 网络代理, 网络安全, 网络安全韧性法案, 隐私保护, 静态二进制