denimoll/CVE-PaaS
GitHub: denimoll/CVE-PaaS
基于多维威胁情报(CVSS/EPSS/KEV/POC/Nuclei 模板)自动判定 CVE 优先级并以 REST API 服务形式暴露的漏洞分级工具。
Stars: 1 | Forks: 1
# CVE-Prioritizer-as-a-Service
## 主要信息
用于漏洞优先级排序的 API 服务。
它结合了:
- [FastAPI](https://fastapi.tiangolo.com/) (API 网关)
- [vulnx](https://github.com/projectdiscovery/vulnx) (用于获取更多漏洞信息的工具)
- [CVE_Prioritizer](https://github.com/TURROKS/CVE_Prioritizer) (分类理念)
### 阈值
- Critical (存在 POC、Nuclei 模板,或漏洞在 [KEV](https://www.cisa.gov/known-exploited-vulnerabilities-catalog) 中)
- High (CVSS > 6.0, EPSS > 0.2)
- Medium (CVSS > 6.0, EPSS <= 0.2)
- Low (CVSS <= 6.0, EPSS > 0.2)
- Info (其他所有情况)
- Undefined (漏洞的 CVSS 和 EPSS 分数存在某些问题)
## 启动
### 通过 ghcr.io (推荐)
```
docker run -d -p 8000:8000 --env PDCP_API_KEY= --name cve-paas ghcr.io/denimoll/cve-paas:latest
```
### 从源码启动
你需要自行安装 docker,然后执行以下命令:
```
# git clone https://github.com/denimoll/CVE-PaaS.git
# cd CVE-PaaS
# bash start.sh
```
首次启动时,你必须填入来自 [ProjectDiscovery](https://cloud.projectdiscovery.io/) 的 API key (你需要完成注册)。
## 配置
环境变量 (通过 `docker run --env` 传递):
**必需**
| Variable | Description |
| -------- | ----------- |
| `PDCP_API_KEY` | 来自 [ProjectDiscovery Cloud Platform](https://cloud.projectdiscovery.io/) 的 API key — vulnx 获取 CVE 数据所需 |
**可选**
| Variable | Default | Description |
| -------- | ------- | ----------- |
| `CVSS_THRESHOLD` | `6.0` | 用于 High/Medium/Low 划分的 CVSS 分数界限 |
| `EPSS_THRESHOLD` | `0.2` | 用于 High/Low 划分的 EPSS 分数界限 |
| `ALLOW_ORIGINS` | `*` | 逗号分隔的允许 CORS 源 |
| `CACHE_TTL_HOURS` | `0` | 缓存结果过期并重新获取的小时数 (0 = 永不过期) |
| `CVE_PAAS_API_KEY` | _(未设置)_ | 如果设置,所有 `/v1/` 请求必须包含 `X-API-Key: ` 头 — 否则返回 401 |
| `RATE_LIMIT` | `0` | 每个客户端 IP 在所有端点上每分钟的最大请求数 (0 = 禁用) — 超出时返回 429 |
| `DB_PATH` | `cve_cache.db` | 容器内 SQLite 缓存文件的路径 |
### 数据持久化
SQLite 缓存存储在由 `DB_PATH` 定义的路径中 (默认为 `/app/cve_cache.db`)。如果不挂载卷,缓存将在容器重启时丢失。要持久化它:
```
docker run -d -p 8000:8000 \
--env PDCP_API_KEY= \
-v /path/on/host/cve_cache.db:/app/cve_cache.db \
--name cve-paas ghcr.io/denimoll/cve-paas:latest
```
## 使用方法
所有 API 端点均在 [localhost:8000/docs](localhost:8000/docs) 中有说明:
- *GET /* - 主页 / 健康检查
- *GET /v1/get_info/{cve_id}* - 主要功能:返回来自 vulnx (旧版 cvemap) 的信息并确定优先级
- *POST /v1/cve* - 批量查询:接受 `{"cve_ids": ["CVE-YYYY-NNNNN", ...]}` (1-50 个 ID),返回 CVE ID -> 优先级结果的映射
- *GET /v1/reget_info/{cve_id}* - 强制刷新:使缓存失效并从 vulnx 重新获取
- *GET /v1/all_results* - 返回带有完整原始信息 (无优先级) 的缓存结果;支持 `?offset=0&limit=100` (最大 1000)
- *DELETE /v1/results* - 移除所有缓存结果 (在结果过时时使用)
## 使用场景
### 1. 检查单个 CVE
最常见的场景 — 从扫描器报告中粘贴一个 CVE ID,即可获得即时的优先级判定。
```
curl http://localhost:8000/v1/get_info/CVE-2021-44228
```
```
{
"Priority": "Critical",
"Details": {
"CVSS": 10.0,
"EPSS": 0.97527,
"is_template": true,
"is_exploited": true,
"is_poc": true,
"Links": {
"POC": "https://github.com/...",
"Nuclei templates": "https://github.com/projectdiscovery/nuclei-templates/...",
"KEV": "https://www.cisa.gov/..."
}
}
}
```
如果满足以下任一条件,优先级为 **Critical**:存在 POC、存在 Nuclei 模板、漏洞在 CISA KEV 中。
否则,将根据 CVSS + EPSS 阈值进行评分。
### 2. 从扫描器报告进行批量检查
从 Trivy、Nessus 或任何其他扫描器获得了 CVE 列表?一次性将它们全部发送 — 每次请求最多 50 个,支持缓存。
```
curl -X POST http://localhost:8000/v1/cve \
-H "Content-Type: application/json" \
-d '{
"cve_ids": [
"CVE-2021-44228",
"CVE-2023-44487",
"CVE-2024-1337"
]
}'
```
```
{
"CVE-2021-44228": { "Priority": "Critical", "Details": { ... } },
"CVE-2023-44487": { "Priority": "High", "Details": { ... } },
"CVE-2024-1337": { "Priority": "Medium", "Details": { ... } }
}
```
只有未缓存的 CVE 才会触发 vulnx 调用 — 其余的将直接从 SQLite 中快速返回。
### 3. 强制刷新过期数据
当 CVE 状态发生变化时 (例如,在初次查询后发布了 POC),无需清除整个缓存即可刷新它。
```
curl http://localhost:8000/v1/reget_info/CVE-2024-1337
```
此操作将一步删除缓存条目并从 vulnx 重新获取。
### 4. 查看缓存中的所有内容
浏览所有累积的结果 — 适用于审计或通过管道传递给其他工具。
```
# 首页
curl "http://localhost:8000/v1/all_results?limit=50&offset=0"
# 下一页
curl "http://localhost:8000/v1/all_results?limit=50&offset=50"
```
```
{
"total": 142,
"offset": 0,
"limit": 50,
"results": {
"CVE-2021-44228": { ... },
"CVE-2023-44487": { ... }
}
}
```
### 5. 受保护的部署 (团队 / 自托管)
使用 API key 锁定服务,以便只有经过授权的客户端才能使用你的 vulnx 配额。
```
# 启用 auth 启动
docker run -d -p 8000:8000 \
--env PDCP_API_KEY= \
--env CVE_PAAS_API_KEY=mysecrettoken \
--env RATE_LIMIT=120 \
--name cve-paas ghcr.io/denimoll/cve-paas:latest
# 使用 key 进行查询
curl -H "X-API-Key: mysecrettoken" \
http://localhost:8000/v1/get_info/CVE-2021-44228
```
没有有效 `X-API-Key` 头的请求将返回 `401`。速率限制 (此处为:每个 IP 每分钟 120 个请求) 超出时将返回 `429`。
### 6. 使缓存失效
强制所有客户端在下一次请求时重新获取最新数据 — 这在长时间间隔或已知数据过期一段时间后非常有用。
```
curl -X DELETE http://localhost:8000/v1/results
```
```
{ "Status": "OK", "Endpoint": "remove_results" }
```
## 路线图
### 已完成
- [x] *新流程*:发布至 ghcr.io,更新启动说明
- [x] *端点*:重新设计端点列表 (DELETE /results,适当的 HTTP 状态码)
- [x] *注解*:为所有端点的参数添加注解
- [x] *设置*:通过环境变量配置 CVSS/EPSS 阈值
- [x] *优化*:SQLite 缓存 (aiosqlite),FastAPI 生命周期初始化
- [x] *安全*:可配置的 ALLOW_ORIGINS,非 root Docker 用户,固定 vulnx 版本
- [x] *测试*:带有 CI 工作流的 Pytest 套件
### 计划中
- [x] *缓存 TTL*:在可配置的时间段后自动使缓存结果过期 (CACHE_TTL_HOURS)
- [x] *批量端点*:带有 CVE ID 数组的 POST /v1/cve 用于批量处理 (1-50 个 ID,支持缓存)
- [x] *API 认证*:可选的 X-API-Key 头 (CVE_PAAS_API_KEY 环境变量) 以保护配额
- [x] *速率限制*:每客户端请求节流 (RATE_LIMIT 请求数/分钟,滑动窗口)
- [x] *API 版本控制*:/v1/ 前缀,为消费者提供稳定的契约
- [x] *Pydantic 响应模型*:用于 OpenAPI 代码生成的类型化响应模式
标签:API网关, AV绕过, CORS, CVE, CVSS, Docker, EPSS, FastAPI, Google, GPT, KEV, NIDS, Nuclei, POC, ProjectDiscovery, Python, Web安全, 威胁情报, 安全防御评估, 容器化, 密码管理, 开发者工具, 数字签名, 数据保护, 无后门, 无线安全, 漏洞优先级评估, 漏洞管理, 网络安全, 网络调试, 自动化, 蓝队分析, 请求拦截, 逆向工具, 配置审计, 隐私保护