mez-0/vulnify
GitHub: mez-0/vulnify
整合多源漏洞情报的 CVE 摄取与富化流水线,提供标准化 SQLite 数据库、Streamlit 浏览器及 MCP 服务器,便于 AI Agent 和安全团队高效查询漏洞数据。
Stars: 19 | Forks: 0
# vulnify
一个 CVE 摄取与富化流水线,它基于 CVEProject、NVD、CISA KEV、EPSS 和 OSV 构建并整合出一个单一的、标准化的 SQLite 数据库 —— 此外还提供了一个用于查看结果的 Streamlit 浏览器。
每次发布时都会提供一个完全填充的 SQLite 数据库,因此您无需为初始摄取等待数小时。
## 包含内容
- 来自上游 CVEProject `cvelistV5` zip 包的**完整 CVE 语料库**
- 用于 CVSS 指标、CPE 配置、漏洞状态和参考的 **NVD 批量合并**
- **CISA 已知被利用漏洞**,包含 `date_added`、`due_date`、勒索软件标志和所需行动
- 批量处理的 **EPSS** 利用概率 + 百分位
- 每个 CVE 的 **OSV** 包映射
- **Streamlit 浏览器**,提供约 70 个预构建的数据视图
- **支持恢复的流水线状态** —— 中断后会从上次停止的地方继续
当前快照(2026 年 5 月发布):
| | 数量 |
|--|--:|
| CVE | 347,248 |
| 供应商 | 21,183 |
| 产品 | 70,266 |
| KEV 条目 | 1,586 |
| 表 | 20 |
## 文档
更深入的参考资料位于 [`docs/`](docs/):
- **[数据源](docs/DATASOURCES.md)** — 每个上游数据源、端点和许可证。
- **[流水线](docs/PIPELINE.md)** — 摄取 → 富化、水位线/恢复、级联+修复模型、三态原则。
- **[Schema](docs/SCHEMA.md)** — 20 张表的布局及查询注意事项。
- **[MCP server](docs/MCP.md)** — 7 个工具、各 Agent 设置、故障排除。
- **[浏览器](docs/EXPLORE.md)** — Streamlit 仪表板,逐个选项卡介绍。
## 快速开始(使用预构建的数据库)
如果您只想查询数据而不想运行流水线:
```
# 1. Clone 并选择你需要的 extras
git clone https://github.com/mez-0/vulnify.git
cd vulnify
uv sync --extra mcp # for agents / MCP server
# 或者: uv sync --extra explore # 用于 Streamlit dashboard
# 或者: uv sync --all-extras # 用于所有内容
# 2. 获取最新的 release DB
gh release download -R mez-0/vulnify --pattern vulnify.db.zst
zstd -d vulnify.db.zst -o vulnify.db
# 3. 将 .env 指向该 DB
cat > .env < 免费获取一个 key,并在 `.env` 中设置 `VULNIFY_NVD_API_KEY`。
### 跳过阶段
`vulnify-gather` 暴露了多个标志,允许您重新运行单个富化阶段,而无需重新摄取:
```
vulnify-gather --skip-ingestion # don't re-download the CVEProject zip
vulnify-gather --skip-nvd # skip NVD bulk merge
vulnify-gather --skip-kev # skip CISA KEV
vulnify-gather --skip-epss # skip EPSS batch
vulnify-gather --skip-osv # skip OSV per-CVE lookups
vulnify-gather --skip-nuclei # skip Nuclei exploit-template ingest
vulnify-gather --skip-exploitdb # skip Exploit-DB artefact ingest
vulnify-gather --skip-metasploit # skip Metasploit module-metadata ingest
```
流水线会将阶段水位线写入 `pipeline_run` 表,因此重新运行是幂等的 —— NVD 仅获取自上次水位线以来的更改,KEV 进行完全重新同步,EPSS 仅更新过期的分数。
利用阶段(Nuclei / Exploit-DB / Metasploit)会在 `~/.vulnify/cache` 下获取并缓存其语料库,并根据语料库版本(commit SHA / 内容哈希)设置水位线。只要此次收集运行了 cvelistV5 摄取,它们就会重新解析 —— 摄取过程会级联删除已更改 CVE 的相关产出物,因此它们会在下一次运行时被修复 —— 否则会自动跳过未更改的语料库。显式指定的 `--skip-*` 始终具有最高优先级。三态的 `exploit.public_poc` / `exploit.metasploit` 汇总布尔值会从产出物中物化而来:在关联的源运行完成之前为 `null`,之后为 `true`/`false`。
## 配置
所有配置都位于项目根目录的 `.env` 中(由 `vulnify.settings` 加载)。
| 变量 | 必需 | 默认值 | 用途 |
|--|:-:|--|--|
| `VULNIFY_SQLITE_PATH` | 是 | `vulnify.db` | SQLite 数据库的存放位置。留空或未设置会将 CVEProject 摄取切换为仅打印模式。 |
| `VULNIFY_SCHEMA_SQL_PATH` | 是 | `vulnify/db/schema.sql` | 用于引导新数据库的 DDL。 |
| `VULNIFY_KEV_JSON_PATH` | 否 | `known_exploited_vulnerabilities.json` | CISA KEV 目录的本地副本。如果未设置且默认文件不存在,提供程序将进行获取。 |
| `VULNIFY_NVD_API_KEY` | 否 | — | NVD API key。如果没有它,您的速率限制约为 5 次请求 / 30 秒。 |
| `VULNIFY_CACHE_DIR` | 否 | `~/.vulnify/cache` | exploit 语料库(Nuclei / Exploit-DB / Metasploit)的缓存位置。 |
相对路径将基于项目根目录进行解析。
## 架构
```
┌───────────────────┐
│ gather.py (CLI) │
└─────────┬─────────┘
│
▼
┌─────────────────────────────┐
│ providers/cveproject.py │ bulk download + parse
└──────────────┬──────────────┘
│
▼
┌─────────────────────────────┐
│ db/sqlite_store.py │ upsert into normalised tables
└──────────────┬──────────────┘
│
▼
┌───────────────────┴────────────────────┐
│ providers/enrichment.py │
│ ├── cisa_kev (CISA KEV catalog) │
│ ├── nvd (CVSS, CPE, status) │
│ ├── epss (probability scores) │
│ ├── osv (package mappings) │
│ └── exploit_ingest (Nuclei/EDB/MSF) │
└────────────────────┬───────────────────┘
│
▼
┌────────────────────┴────────────────────┐
▼ ▼
┌───────────────────────────────┐ ┌───────────────────────────────┐
│ explore/app.py (Streamlit) │ │ vulnify/mcp.py (FastMCP) │
└───────────────────────────────┘ └───────────────────────────────┘
```
### 源码布局
```
vulnify/
├── vulnify/
│ ├── gather.py # `vulnify-gather` CLI (ingestion + enrichment)
│ ├── mcp.py # `vulnify-mcp` FastMCP server (stdio)
│ ├── settings.py # .env loader + path resolvers
│ ├── constants.py # Severity, SourceTrust, ExploitMaturity enums
│ ├── cvss_severity.py # CVSS-base -> severity bucketing
│ ├── http.py # shared httpx client + file/zip download helpers
│ ├── models/ # dataclass models (CVE, Vendor, Product, CVSS, …)
│ ├── providers/
│ │ ├── cveproject.py # CVEProject bulk parser
│ │ ├── nvd.py # NVD 2.0 API client + per-CVE merge
│ │ ├── cisa_kev.py # KEV catalog ingest
│ │ ├── epss.py # FIRST EPSS batch enrichment
│ │ ├── osv.py # OSV per-CVE package lookup
│ │ ├── exploit_ingest.py # Nuclei/Exploit-DB/Metasploit artefact ingest
│ │ ├── vendor_advisories.py
│ │ ├── enrichment.py # phase orchestrator
│ │ └── enrichment_resume.py
│ └── db/
│ ├── schema.sql # 20-table normalised schema + FTS5 index
│ ├── sqlite_store.py # connection + upsert API
│ ├── readonly.py # shared read-only sqlite3 helper
│ ├── cve_upsert.py # CVE/vendor/product writes
│ ├── migrate.py # idempotent migrations + FTS5 backfill
│ ├── pipeline_state.py # phase watermarks
│ └── sql_conversion.py # model <-> row helpers
├── explore/
│ ├── app.py # Streamlit dashboard
│ ├── data.py # overview queries
│ └── data_views.py # per-chart queries
└── tests/ # pytest suite (no network, no real DB)
```
## Schema 概览
20 张表,全部标准化,并启用了外键。包含顶层 CVE 表,以及为高基数数据(CPE 匹配、参考、CVSS 指标、exploit 信号 + 产出物、KEV 列表、情报)建立的独立表,以便您能够干净地进行 join 查询。
```
cve — primary CVE record
vendor — deduped vendors (case/whitespace-normalised)
product — products owned by a vendor
cve_vendor — many-to-many with `role` (assigner, affected, source, …)
affected_product — CVE <-> product affected/not-affected with notes
version_range — per affected_product version constraints
cwe / cve_cwe — weakness taxonomy
cvss — every CVSS vector from any source, deduped on (source, version, vector)
cpe_match — NVD configuration leaf matches
exploit — exploit availability + maturity (tri-state summary bools)
exploit_artefact — per-CVE exploit evidence (Nuclei/Exploit-DB/Metasploit)
kev — CISA KEV listing fields per CVE
intel — generic threat-intel rows (kind/value/source)
intel_string_list — backing list values for intel rows
reference — URL references with trust + source
reference_tag — many-to-many for ref tag vocabulary
tag / cve_tag — CVE-level tags
pipeline_run — per-phase watermarks for resume
```
完整的 DDL 位于 [`vulnify/db/schema.sql`](vulnify/db/schema.sql);包含查询注意事项的详细说明位于 [docs/SCHEMA.md](docs/SCHEMA.md)。
## MCP server (`vulnify-mcp`)
`vulnify.mcp` 通过 [Model Context Protocol](https://modelcontextprotocol.io) 将 SQLite 数据库暴露给 AI Agent。它是一个使用 stdio 通信的 FastMCP server,因此像 Claude Code、Claude Desktop 和 Cursor 这样的 Agent 可以在需要时将其作为子进程启动。
### 第 1 步 — 设置项目
```
git clone https://github.com/mez-0/vulnify.git
cd vulnify
uv sync --extra mcp
```
### 第 2 步 — 获取 SQLite 数据库
有两种选择:
**选项 A — 预构建(推荐)。** 下载发布资产并解压:
```
gh release download -R mez-0/vulnify --pattern vulnify.db.zst
zstd -d vulnify.db.zst -o vulnify.db
```
**选项 B — 从源码构建。** 需要数小时;请参阅[从头构建数据库](#building-the-db-from-scratch)。
### 第 3 步 — 将服务器指向数据库
在项目根目录下创建 `.env` 文件,并指定绝对路径:
```
echo "VULNIFY_SQLITE_PATH=$(pwd)/vulnify.db" > .env
echo "VULNIFY_SCHEMA_SQL_PATH=vulnify/db/schema.sql" >> .env
```
### 第 4 步 — 冒烟测试
确认服务器能正常启动并干净地关闭。它使用 stdio 通信,因此只需发送 `Ctrl-D` (EOF) 即可退出:
```
uv run vulnify-mcp
标签:AI代理, CVE, GPT, Kubernetes, MCP, SQLite, 威胁情报, 开发者工具, 数字签名, 数据流水线, 漏洞管理, 运行时操纵, 逆向工具