stov3/fluescan
GitHub: stov3/fluescan
Fluescan 是一款漏洞优先级排序工具,通过融合 CVSS、EPSS、KEV 情报和漏洞利用代码可用性,为安全团队生成单一且可解释的优先修复评分。
Stars: 1 | Forks: 0
## Fluescan
**Fluescan** *(名词)* /ˈfluː.skæn/
[](https://www.python.org/)
[](LICENSE)
[]()
## 工作原理
每个 CVE 的评分均通过从以下来源提取实时数据得出:
| 来源 | 提供方 | 说明的信息 |
|--------|----------|------------------|
| **CVSS v3.1** | NVD | 基础严重程度 (0–10) |
| **EPSS** | FIRST | 在野利用的概率 |
| **KEV (Confirmed)** | CISA | 已确认的活跃利用 |
| **KEV (Early signal)** | VulnCheck | CISA 收录前的早期利用证据 |
| **GitHub PoCs** | GitHub API | 存在公开的 PoC(概念验证)代码 |
| **ExploitDB / MSF** | ExploitDB CSV + Metasploit Framework | 存在可用的 exploit / Metasploit 模块 |
| **OSV fallback** | OSV.dev | NVD 缺失或延迟时的元数据/CVSS 备选 |
评分结合了加权风险混合模型(包含 KEV 信号权重和 CISA 确认利用的加权提升),并归一化至 0–100 区间。
## 安装说明
```
git clone https://github.com/stov3/fluescan.git
cd fluescan
pip install -r requirements.txt
```
## 快速入门
```
# 单个 CVE
python3 fluescan.py CVE-2024-1234
# 多个 CVE — 按优先级排序,最高风险优先
python3 fluescan.py CVE-2024-1234 CVE-2023-44487 CVE-2022-0847
# 多个 CVE(也支持逗号分隔)
python3 fluescan.py CVE-2024-1234, CVE-2023-44487, CVE-2022-0847
# 来自文件(每行一个 CVE,# = 注释)
python3 fluescan.py --cves-file examples/sample_cves.txt
# 导出报告
python3 fluescan.py --cves-file my_cves.txt \
--output-json report.json \
--output-csv report.csv
# 无控制台表格(适用于脚本编写 / 管道操作)
python3 fluescan.py CVE-2024-1234 --no-table
# 简洁的每个 CVE 评分说明
python3 fluescan.py --cves-file examples/sample_cves.txt --explain
# 交互式引导菜单(无参数)
python3 fluescan.py
# 诊断
python3 fluescan.py --check-apis # test all API connections
python3 fluescan.py --setup # configure API keys interactively
```
`--explain` 会为每个 CVE 打印出简明的确定性解释,包含 `affected:` 组件行以及一段关于评分逻辑的说明段落。
## 评分算法
优先级评分使用了**具有有界上下文乘数的加权风险混合模型**,以保持评分的实用性、可解释性,并贴近真实的分类处理行为。
### 评分公式
```
raw_score = (0.30 × cvss_norm)
+ (0.40 × epss_norm)
+ (0.20 × kev_strength)
+ (0.10 × exploit_norm)
priority_score = raw_score × 100 × evidence_factor × exposure_weight
× cwe_weight × cisa_alert_weight
if cisa_kev_confirmed:
priority_score = priority_score × 1.15 # proportional urgency boost, capped at 100
priority_score = min(priority_score, 100)
```
### 归一化规则
- **kev_strength**:
- `1.0` = 在 CISA KEV 中(已确认的利用)
- `0.4` = 仅有 VulnCheck KEV 的早期信号(降低的置信度权重)
- `0.0` = 无 KEV 信号
- **exploit_norm**:
- `0.0` = 无 exploit 信号
- `0.5` = 仅有 GitHub PoC
- `1.0` = 存在 Metasploit 模块(有无 PoC 均可)
- **exposure_weight**(源自 CVSS `AV:` 攻击者可达性信号):
- `1.10` = `AV:N`(网络可达 — 可大规模远程利用)
- `1.00` = `AV:A`(相邻网络 — 需处于同一局域网,中性)
- `0.80` = `AV:L`(本地 — 需已存在的据点或需要用户协助执行)
- `0.70` = `AV:P`(物理 — 需现场访问权限)
- `1.00` = 未知/不可用
- **cwe_weight**(源自 NVD CWE 分类):
- `1.05` = 高影响弱点类别(例如,命令注入 / 不安全的反序列化类别)
- `1.02` = 中等影响弱点类别
- `1.00` = 通用/未知 CWE
- **cisa_alert_weight**(源自 CISA KEV 时效性上下文):
- `1.05` = 最近 30 天内加入 KEV
- `1.03` = 最近 90 天内加入 KEV
- `1.01` = 在 KEV 中但时间较早
- `1.00` = 不在 CISA KEV 中
### 证据因子
证据较少(或较弱)会降低评分。每个 CVE 的证据置信度(见下文)会转化为一个平滑的乘数:
```
evidence_factor = min(1.0, confidence / 85)
```
实际表现为:
- 置信度 ≥ 85 时达到完全信任(乘数为 1.0) — 记录详尽的 CVE 不会受惩罚
- 低于该值,惩罚会按比例增加(例如,置信度 57 → ×0.67)
- 来源于 OSV fallback 的 CVSS、缺失的 EPSS 或失败的 API 查询都会降低该乘数
- CISA 确认的利用会施加 ×1.15 的紧急性提升 — 由于是按比例计算的,因此可达性和严重程度依然能区分不同的 KEV 条目,而不会将它们固定在某个死板的分数上
- CWE 和 CISA 告警上下文权重被特意设定了上限,因此它们只用于微调优先级,而不会掩盖核心的 CVSS/EPSS/KEV/exploit 信号
### 为什么选择这些变量(人工分诊逻辑)
这反映了一个漏洞管理团队在面临修复压力时的实际思考方式:
- **基础技术风险 (CVSS)**:“如果被利用,影响会有多严重?”
- **观察到的利用可能性 (EPSS)**:“在不久的将来,其在野被利用的可能性有多大?”
- **已知的活跃利用 (CISA KEV / VulnCheck 早期 KEV)**:“这是否已经正被真实攻击者利用?”
- **Exploit 可用性 (PoC / Metasploit)**:“目前攻击者需要付出多少精力?”
- **可达性 (AV)**:“能否被远程触发,还是需要据点/物理接触?”
- **弱点类别 (CWE)**:“这种缺陷模式在历史上是否通常会导致高影响的入侵路径?”
- **告警时效性 (CISA dateAdded)**:“这在防御者/攻击者的工作流中目前是否是热点?”
- **证据质量 (confidence -> evidence_factor)**:“考虑到来源的覆盖范围和一致性,我们应该在多大程度上信任这个排名?”
简而言之:仅凭严重程度不够,仅凭可利用性不够,仅凭威胁上下文也不够。评分结合了这三者,然后根据证据质量进行缩放。
### 计算示例
```
CVE-2023-44487 (HTTP/2 Rapid Reset DoS):
Input:
CVSS = 7.5
EPSS = 1.00
CISA KEV = YES
VulnCheck KEV = YES
PoC = YES
Metasploit = YES
Normalize:
cvss_norm = 7.5 / 10 = 0.75
epss_norm = 1.00
kev_strength = 1.0
exploit_norm = 1.0
Evidence:
evidence_factor = 1.0 # confidence ≥ 85, full trust
score = 0.925 × 100 × 1.0 × 1.10 = 101.75 → capped at 100
KEV urgency boost (CISA-confirmed only):
score = min(100 × 1.15, 100) = 100
```
### 风险级别说明
| 评分范围 | 风险级别 | 说明 |
| 0–29 | **极低** | 风险非常低;严重程度低且无被利用的证据 |
### 设计理念
- 线性混合模型易于审计,也易于向操作人员解释。
- 有界乘数(AV/CWE/CISA 告警)增加了运营上下文,同时不会破坏基线风险的稳定性。
- EPSS 包含可选的 7 天增量富集,以实现感知趋势的分类。
- 缺失的数据通过证据因子透明地处理,而不是使用人造的先验概率。
### 置信度与证据评分
Fluescan 会输出一个**单一的优先级评分** — 可利用性信号(KEV、EPSS、PoC、Metasploit)已经被融合在其中。每个 CVE 的**证据置信度 (0–100%)** 根据数据源的权威性和健康度计算得出,然后通过 `evidence_factor` 折算到评分中:证据越少或越弱,得分越低。
```
confidence = (28 × cvss_quality) + (24 × epss_quality)
+ (20 × kev_quality) + (28 × exploit_intel_quality)
± agreement adjustment
```
- **来源质量**区分了权威性:NVD CVSS (0.92) > OSV fallback (0.75) > 缺失 (0.30);已验证的“不在 EPSS 中” (0.45) 是比失败的查询 (0.25) 更好的证据。
- **错误 ≠ 缺失**:API 检查失败比经过验证的否定结果降低的置信度更大。
- **一致性调整**:当 ≥3 个独立来源证实存在利用时 +4;当信号冲突时(例如 CVSS 严重程度极高但利用证据非常弱)−5。
- 级别:`HIGH` ≥ 85,`MEDIUM` 65–84,`LOW` < 65(需手动验证)。
- 每个 CVE 的 `--explain` 输出包含 `affected:` 和 `cwe:` 定向行,以及一段涵盖评分驱动因素(KEV、EPSS、exploit 制品、CVSS)、攻击向量暴露程度、KEV 紧急性提升和证据衰减的简明段落。
- `affected_component`、`cwe_ids`、`cwe_category`、`cwe_weight`、`cisa_alert_status`、`cisa_alert_days`、`cisa_alert_weight` 和 `explain_summary` 可以 JSON/CSV 格式导出,用于分类和归属工作流。
## 控制台输出
结果**按优先级排序**(最高分优先)并进行了颜色编码。
目前控制台输出仅显示优先级表格和完成行。
- `KEV` 值是明确的:`YES`(CISA 已确认),`EARLY`(仅有 VulnCheck),`NO`(无 KEV 信号)。
- `AV` 和 `ExpW` 显示 CVSS 攻击向量以及评分时使用的软性暴露权重。
| 颜色 | 评分 | 操作 |
|--------|-------|--------|
| 🟣 亮紫色 | ≥ 80 | 立即修补 |
| 🔴 红色 | ≥ 60 | 尽快修补 |
| 🟠 琥珀色 | ≥ 40 | 本月内修补 |
| 🟡 黄色 | ≥ 20 | 尽可能修补 |
| 🟢 绿色 | < 20 | 低优先级 |
## 速率限制
所有数据源均以**并行批次**获取(EPSS 和 KEV 数据源为单次批量下载;针对每个 CVE 的查询在各个数据源内并发执行),因此总获取时间受限于最慢的数据源,而非所有数据源时间的总和。
该工具会自动执行针对各 API 的速率限制。达到限制时,它会显示原地倒计时并在恢复过程中确保数据不丢失。本地结果缓存(24 小时 TTL)意味着重新运行最近分析过的 CVE 将消耗**零**次 API 调用。
| API | 未认证 | 带有密钥/令牌 | 本地缓存 |
|-----|----------------|----------------|-------------|
| NVD (CVSS) | 5 请求/分钟 | 5 请求/秒 (×60) | 每 CVE 结果缓存 24h |
| EPSS (+ trend) | 30 请求/分钟 (批量) | — | — |
| CISA KEV | 单次请求 (使用 `If-Modified-Since` 缓存) | — | 条件缓存 |
| VulnCheck KEV | — | 60 请求/分钟 (令牌) | 6h 缓存 |
| OSV fallback | 60 请求/分钟 | — | — |
| GitHub Search | 10 请求/分钟 (1 次查询/CVE) | 30 请求/分钟 (1 次查询/CVE) | 每 CVE 结果缓存 24h + ETag |
| ExploitDB CSV | 单次下载 (ETag 缓存,重新运行时免费) | — | ETag 缓存 |
## 可选的 API 密钥
没有这些密钥也可以运行,但对于大批量处理,它们能显著提升速度。
### NVD API 密钥 — CVSS 查询速度提升 60 倍
```
# 获取免费密钥:https://nvd.nist.gov/developers/request-an-api-key
export NVD_API_KEY=your_key_here
# 或添加到 .env(参见 .env.example)
```
### GitHub Token — 增加 3 倍的 GitHub 搜索次数及 MSF 模块检测
```
# 在 https://github.com/settings/tokens 创建
# 访问公开数据无需 scopes
export GITHUB_TOKEN=ghp_your_token_here
```
### VulnCheck Token — 早期 KEV 信号覆盖
```
# 免费社区注册
export VULNCHECK_API_TOKEN=your_token_here
```
此 token 是可选的。如果未配置,工具仍会使用 CISA KEV 和其他来源正常运行。
配置了 GitHub token 后,工具还会搜索官方的
[`rapid7/metasploit-framework`](https://github.com/rapid7/metasploit-framework)
代码库,查找引用了该 CVE 的模块 — 这是获取 MSF 覆盖情况最准确的来源。
### 交互式设置
```
python3 fluescan.py --setup
```
密钥将保存到 `.env` 文件中(已包含在 `.gitignore` 里)。
## 项目结构
```
fluescan/
├── fluescan.py # Entry point & orchestration
├── src/
│ ├── config.py # API key management
│ ├── console.py # Terminal UI, colours, progress
│ ├── rate_limiter.py # Per-API rate enforcement & countdown
│ ├── api_checker.py # Connectivity diagnostics
│ └── fetchers/
│ ├── cvss_fetcher.py # NVD — CVSS v3.1
│ ├── epss_fetcher.py # FIRST — EPSS (batched)
│ ├── kev_fetcher.py # CISA — KEV (cached)
│ ├── vulncheck_kev_fetcher.py # VulnCheck KEV (early signal)
│ ├── osv_fetcher.py # OSV.dev fallback metadata
│ ├── github_poc_fetcher.py # GitHub Search — PoCs
│ └── metasploit_fetcher.py # ExploitDB CSV + MSF GitHub
├── examples/
│ └── sample_cves.txt # Ready-to-run example list
├── requirements.txt
├── .env.example # API key template
└── LICENSE
```
## 输出文件
| 文件 | 格式 | 内容 |
|------|--------|----------|
| `fluescan_report.json` | JSON | 每个 CVE 的所有报告字段,包含组件、CWE、CISA 告警上下文和解释字段 |
| `fluescan_report.csv` | CSV | 适合表格软件的导出文件,包含组件、CWE、CISA 告警上下文和解释字段 |
自定义路径:`--output-json path.json --output-csv path.csv`
## 故障排除
| 症状 | 可能原因 | 修复方法 |
|---------|-------------|-----|
| `CVE not found` | 太新或尚未被 NVD 收录 | 等待并重试;检查 nvd.nist.gov |
| EPSS 总是显示 `N/A` | 极新或极旧的 CVE | 预期行为;评分仍会根据基于证据的衰减进行计算 |
| NVD 中缺失 CVSS | NVD 对新 CVE 的更新延迟 | 会自动尝试 OSV fallback |
| VulnCheck KEV 不可用 | Token 缺失/无效 | 在 `.env` 中设置 `VULNCHECK_API_TOKEN` |
| GitHub 返回 403 | 未认证触达速率限制 | 在 `.env` 中添加 `GITHUB_TOKEN` |
| 出现倒计时 | 达到了 API 速率 | 请等待;工具会自动恢复 |
| 评分为 0.0 | 未能从任何来源获取数据 | CVE 可能不存在或 API 已宕机 |
## 参考
- [CVSS v3.1 规范](https://www.first.org/cvss/v3.1/specification-document)
- [EPSS 评分](https://www.first.org/epss/)
- [CISA KEV 目录](https://www.cisa.gov/known-exploited-vulnerabilities-catalog)
- [VulnCheck KEV](https://vulncheck.com/kev)
- [NVD API 文档](https://nvd.nist.gov/developers/vulnerabilities)
- [OSV.dev API](https://google.github.io/osv.dev/api/)
- [GitHub REST API — 速率限制](https://docs.github.com/en/rest/using-the-rest-api/rate-limits-for-the-rest-api)
- [ExploitDB](https://www.exploit-db.com/)
- [Metasploit Framework](https://github.com/rapid7/metasploit-framework)
## ⚠️ 免责声明
本工具提供的漏洞优先级排序**仅作指导之用**。结果取决于上游数据源的准确性和可用性,在做出修复决策前,应始终**进行独立验证**。
本软件仅供**合法的安全研究和防御目的**使用。严禁使用此工具为未经授权的系统访问提供便利。完整条款请参见 [LICENSE](LICENSE)。
- `KEV` 值是明确的:`YES`(CISA 已确认),`EARLY`(仅有 VulnCheck),`NO`(无 KEV 信号)。
- `AV` 和 `ExpW` 显示 CVSS 攻击向量以及评分时使用的软性暴露权重。
| 颜色 | 评分 | 操作 |
|--------|-------|--------|
| 🟣 亮紫色 | ≥ 80 | 立即修补 |
| 🔴 红色 | ≥ 60 | 尽快修补 |
| 🟠 琥珀色 | ≥ 40 | 本月内修补 |
| 🟡 黄色 | ≥ 20 | 尽可能修补 |
| 🟢 绿色 | < 20 | 低优先级 |
## 速率限制
所有数据源均以**并行批次**获取(EPSS 和 KEV 数据源为单次批量下载;针对每个 CVE 的查询在各个数据源内并发执行),因此总获取时间受限于最慢的数据源,而非所有数据源时间的总和。
该工具会自动执行针对各 API 的速率限制。达到限制时,它会显示原地倒计时并在恢复过程中确保数据不丢失。本地结果缓存(24 小时 TTL)意味着重新运行最近分析过的 CVE 将消耗**零**次 API 调用。
| API | 未认证 | 带有密钥/令牌 | 本地缓存 |
|-----|----------------|----------------|-------------|
| NVD (CVSS) | 5 请求/分钟 | 5 请求/秒 (×60) | 每 CVE 结果缓存 24h |
| EPSS (+ trend) | 30 请求/分钟 (批量) | — | — |
| CISA KEV | 单次请求 (使用 `If-Modified-Since` 缓存) | — | 条件缓存 |
| VulnCheck KEV | — | 60 请求/分钟 (令牌) | 6h 缓存 |
| OSV fallback | 60 请求/分钟 | — | — |
| GitHub Search | 10 请求/分钟 (1 次查询/CVE) | 30 请求/分钟 (1 次查询/CVE) | 每 CVE 结果缓存 24h + ETag |
| ExploitDB CSV | 单次下载 (ETag 缓存,重新运行时免费) | — | ETag 缓存 |
## 可选的 API 密钥
没有这些密钥也可以运行,但对于大批量处理,它们能显著提升速度。
### NVD API 密钥 — CVSS 查询速度提升 60 倍
```
# 获取免费密钥:https://nvd.nist.gov/developers/request-an-api-key
export NVD_API_KEY=your_key_here
# 或添加到 .env(参见 .env.example)
```
### GitHub Token — 增加 3 倍的 GitHub 搜索次数及 MSF 模块检测
```
# 在 https://github.com/settings/tokens 创建
# 访问公开数据无需 scopes
export GITHUB_TOKEN=ghp_your_token_here
```
### VulnCheck Token — 早期 KEV 信号覆盖
```
# 免费社区注册
export VULNCHECK_API_TOKEN=your_token_here
```
此 token 是可选的。如果未配置,工具仍会使用 CISA KEV 和其他来源正常运行。
配置了 GitHub token 后,工具还会搜索官方的
[`rapid7/metasploit-framework`](https://github.com/rapid7/metasploit-framework)
代码库,查找引用了该 CVE 的模块 — 这是获取 MSF 覆盖情况最准确的来源。
### 交互式设置
```
python3 fluescan.py --setup
```
密钥将保存到 `.env` 文件中(已包含在 `.gitignore` 里)。
## 项目结构
```
fluescan/
├── fluescan.py # Entry point & orchestration
├── src/
│ ├── config.py # API key management
│ ├── console.py # Terminal UI, colours, progress
│ ├── rate_limiter.py # Per-API rate enforcement & countdown
│ ├── api_checker.py # Connectivity diagnostics
│ └── fetchers/
│ ├── cvss_fetcher.py # NVD — CVSS v3.1
│ ├── epss_fetcher.py # FIRST — EPSS (batched)
│ ├── kev_fetcher.py # CISA — KEV (cached)
│ ├── vulncheck_kev_fetcher.py # VulnCheck KEV (early signal)
│ ├── osv_fetcher.py # OSV.dev fallback metadata
│ ├── github_poc_fetcher.py # GitHub Search — PoCs
│ └── metasploit_fetcher.py # ExploitDB CSV + MSF GitHub
├── examples/
│ └── sample_cves.txt # Ready-to-run example list
├── requirements.txt
├── .env.example # API key template
└── LICENSE
```
## 输出文件
| 文件 | 格式 | 内容 |
|------|--------|----------|
| `fluescan_report.json` | JSON | 每个 CVE 的所有报告字段,包含组件、CWE、CISA 告警上下文和解释字段 |
| `fluescan_report.csv` | CSV | 适合表格软件的导出文件,包含组件、CWE、CISA 告警上下文和解释字段 |
自定义路径:`--output-json path.json --output-csv path.csv`
## 故障排除
| 症状 | 可能原因 | 修复方法 |
|---------|-------------|-----|
| `CVE not found` | 太新或尚未被 NVD 收录 | 等待并重试;检查 nvd.nist.gov |
| EPSS 总是显示 `N/A` | 极新或极旧的 CVE | 预期行为;评分仍会根据基于证据的衰减进行计算 |
| NVD 中缺失 CVSS | NVD 对新 CVE 的更新延迟 | 会自动尝试 OSV fallback |
| VulnCheck KEV 不可用 | Token 缺失/无效 | 在 `.env` 中设置 `VULNCHECK_API_TOKEN` |
| GitHub 返回 403 | 未认证触达速率限制 | 在 `.env` 中添加 `GITHUB_TOKEN` |
| 出现倒计时 | 达到了 API 速率 | 请等待;工具会自动恢复 |
| 评分为 0.0 | 未能从任何来源获取数据 | CVE 可能不存在或 API 已宕机 |
## 参考
- [CVSS v3.1 规范](https://www.first.org/cvss/v3.1/specification-document)
- [EPSS 评分](https://www.first.org/epss/)
- [CISA KEV 目录](https://www.cisa.gov/known-exploited-vulnerabilities-catalog)
- [VulnCheck KEV](https://vulncheck.com/kev)
- [NVD API 文档](https://nvd.nist.gov/developers/vulnerabilities)
- [OSV.dev API](https://google.github.io/osv.dev/api/)
- [GitHub REST API — 速率限制](https://docs.github.com/en/rest/using-the-rest-api/rate-limits-for-the-rest-api)
- [ExploitDB](https://www.exploit-db.com/)
- [Metasploit Framework](https://github.com/rapid7/metasploit-framework)
## ⚠️ 免责声明
本工具提供的漏洞优先级排序**仅作指导之用**。结果取决于上游数据源的准确性和可用性,在做出修复决策前,应始终**进行独立验证**。
本软件仅供**合法的安全研究和防御目的**使用。严禁使用此工具为未经授权的系统访问提供便利。完整条款请参见 [LICENSE](LICENSE)。标签:GPT, Python, 主机安全, 威胁情报, 开发者工具, 无后门, 漏洞管理, 逆向工具