stov3/fluescan

GitHub: stov3/fluescan

Fluescan 是一款漏洞优先级排序工具,通过融合 CVSS、EPSS、KEV 情报和漏洞利用代码可用性,为安全团队生成单一且可解释的优先修复评分。

Stars: 1 | Forks: 0

## Fluescan **Fluescan** *(名词)* /ˈfluː.skæn/ [![Python 3.7+](https://img.shields.io/badge/python-3.7%2B-blue)](https://www.python.org/) [![License: MIT](https://img.shields.io/badge/license-MIT-green)](LICENSE) [![Alpha](https://img.shields.io/badge/status-alpha-orange)]() ## 工作原理 每个 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 格式导出,用于分类和归属工作流。 ## 控制台输出 结果**按优先级排序**(最高分优先)并进行了颜色编码。 目前控制台输出仅显示优先级表格和完成行。 image - `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, 主机安全, 威胁情报, 开发者工具, 无后门, 漏洞管理, 逆向工具