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安全, 威胁情报, 安全防御评估, 容器化, 密码管理, 开发者工具, 数字签名, 数据保护, 无后门, 无线安全, 漏洞优先级评估, 漏洞管理, 网络安全, 网络调试, 自动化, 蓝队分析, 请求拦截, 逆向工具, 配置审计, 隐私保护