vsnvamsikrishnapalaparty/VulnSight

GitHub: vsnvamsikrishnapalaparty/VulnSight

一款基于 Syft 和 Grype 的容器与主机漏洞扫描器,通过多源威胁情报增强和自定义风险评分,将海量 CVE 转化为可操作的优先级修复建议。

Stars: 0 | Forks: 0

# VulnSight 一款容器和主机漏洞扫描器,内置自定义风险评分引擎和威胁情报增强功能。 VulnSight 封装了 [Syft](https://github.com/anchore/syft) 和 [Grype](https://github.com/anchore/grype) 来生成 SBOM 并检测 CVE,在此基础上增加了: - 自定义风险评分方法,将影响最大的 100 个 CVE 汇总为 0-100 的标准化评分 - 来自 NVD(CVSS、描述、CWE)、FIRST.org(EPSS 利用概率)和 CISA KEV(已知在野利用)的威胁情报增强 - 容器和主机上下文分析——以 root 运行、危险工具、SUID 二进制文件、基础镜像 EOL - HTML 和 PDF 报告 ## 示例 扫描 CentOS 6 容器: ``` vulnsight -i php:7.4-apache INFO: Docker mode selected. Resolving image: php:7.4-apache INFO: Using image digest: sha256:c9d7e608f73832673479770d66aacc8100011ec751d1905ff63fae3fe2e0ca6d INFO: Running Syft on filesystem: container_fs/php_7.4-apache Generating SBOM: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:05<00:00, 5.33s/step] INFO: Deterministic SBOM written to: artifacts/php_7.4-apache_e0ca6d/sbom.json INFO: Running Grype on SBOM: artifacts/php_7.4-apache_e0ca6d/sbom.json Running Grype: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:09<00:00, 9.34s/step] INFO: Grype results written to: artifacts/php_7.4-apache_e0ca6d/grype.json INFO: Enriching threat intel for 479 CVEs Enriching CVEs: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 479/479 [00:00<00:00, 538.89cve/s] INFO: Threat intel written to: artifacts/php_7.4-apache_e0ca6d/threat_intel.json INFO: Metadata written to: artifacts/php_7.4-apache_e0ca6d/metadata.json [+] Loading input files... INFO: PDF report written to: artifacts/php_7.4-apache_e0ca6d/report.pdf (71.1 KB) INFO: HTML report written to: artifacts/php_7.4-apache_e0ca6d/report.html INFO: === Timing Summary === INFO: sbom_seconds: 5.3345s INFO: grype_seconds: 9.3392s INFO: threat_intel_seconds: 0.8892s INFO: Total Scan Time: 15.9286s ══════════════════════════════════════════════════════════════════════════════════════════════════════════════ VULNSIGHT SCAN REPORT ══════════════════════════════════════════════════════════════════════════════════════════════════════════════ ─── SCAN SUMMARY ───────────────────────────────────────────────────────────────────────────────────────────── Image php:7.4-apache Digest sha256:c9d7e608f73…e0ca6d Scanned 2026-05-18 at 03:07:30 UTC Duration 15.93s ─── RISK POSTURE ───────────────────────────────────────────────────────────────────────────────────────────── VulnSight Risk Score 71.25 CRITICAL Unique CVEs 479 Max CVSS 9.8 Avg CVSS 6.2 CISA KEV listed 3 actively exploited Fixable 218 / 479 Severity breakdown Critical 30 High 116 Medium 129 Low 24 Negligible 173 Unknown 7 ``` 完整的 HTML 和 PDF 报告会保存在 `artifacts/_/` 目录中。 ![php:7.4-apache 的终端扫描摘要](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/a37ba21cf2005821.png) ![浏览器中渲染的交互式 HTML 报告](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/fc414c94df005821.png) ![PDF 报告封面页](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/a782307e53005822.png) 📄 **[下载完整 PDF 报告](./docs/VulnSight_php7.4-apache_report.pdf)** 查看完整的多页输出。 ## 为什么开发这个工具 **在 Zscaler 工作期间,我负责对 AWS、GCP 和 Azure 上的云实例和容器镜像进行漏洞扫描,使用的是 Trivy 和 Grype。我反复遇到的问题是:这两个工具只是输出一大堆 CVE 就算完成任务了。那时我才意识到,难点不在于发现漏洞——而在于判断对于给定工作负载来说哪些漏洞才真正重要。VulnSight 是我对后半部分的尝试:将 Grype 的输出转化为一个经过优先级排序的、有据可查的答案,回答"我到底应该先修复什么?"** ## 快速开始 ### 环境要求 - Python 3.10+ - Docker(用于 `--image` 模式) - [Syft](https://github.com/anchore/syft#installation) 和 [Grype](https://github.com/anchore/grype#installation) 在 `$PATH` 中 - PDF 生成需要 Pango(仅限 Linux): Debian/Ubuntu:sudo apt install libpango-1.0-0 libpangoft2-1.0-0 Fedora/RHEL:sudo dnf install pango Alpine:apk add pango ### 安装 ``` git clone https://github.com/vsnvamsikrishnapalaparty/vulnsight.git cd vulnsight python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt cp .env.example .env # 添加您的 NVD API 密钥(免费申请:https://nvd.nist.gov/developers/request-an-api-key) ``` ### 运行 ``` # 扫描 Docker 镜像 vulnsight -i php:7.4-apache # 扫描 tarball vulnsight -i ./myimage.tar # 扫描主机文件系统(例如 EC2 实例、本地服务器) vulnsight --root-path / ``` ## 风险评分方法 VulnSight 评分(0-100)汇总了扫描中风险最高的 100 个 CVE。每个 CVE 贡献一个加权和,包含以下因素: | 因素 | 来源 | 衡量内容 | |------------------|--------------------|-----------------------------------------------------------| | CVSS 基础分 | NVD | 基准严重程度(行业标准) | | EPSS | FIRST.org | 预测未来 30 天内被利用的概率 | | KEV 列表 | CISA | 是否正在被在野利用 | | 存在时间 | NVD 发布日期 | 未修补情况下随时间累积的风险 | | 严重等级 | Grype | 发行版特定的分类 | | CWE 类别 | NVD | 弱点类型,按可利用性加权 | | 修复可用性 | Grype | 上游是否存在修复(可操作的工作项) | 容器/主机上下文会进一步调整评分:以 root 运行、生命周期终止的基础镜像、SUID 二进制文件和暴露的 shell 都会提高最终分数。 风险等级:**0-19 低危**,**20-39 中危**,**40-69 高危**,**70+ 严重**。 - **我选择汇总前 100 个而非对所有 CVE 取平均值,是因为否则在 centos:6 这样拥有 1000+ CVE 的大型镜像中,异常值会被稀释。** ## 架构 流水线阶段,按顺序依次为: 1. **镜像解析**——拉取 Docker 镜像、提取 rootfs,或读取 tarball / 主机路径 2. **SBOM 生成**——通过 Syft 3. **漏洞检测**——通过 Grype 对 SBOM 进行检测 4. **威胁情报增强**——NVD、EPSS、CISA KEV(带磁盘缓存结果、并行 NVD 获取、EPSS 批量批处理) 5. **风险评分**——汇总每个 CVE 的贡献,纳入容器/主机上下文因素 6. **报告生成**——HTML(交互式,内嵌 PDF)和 PDF(打印优化) 7. **CLI 摘要**——每次扫描结束时打印格式化的终端报告 ``` vulnsight/ ├── assets │   └── logo │   ├── LOGO.md │   ├── vulnsight-favicon.svg │   ├── vulnsight-logo-dark.svg │   ├── vulnsight-logo-light.svg │   └── vulnsight-logomark.svg ├── container_context.py ├── filesystem_provider.py ├── grype.py ├── image_resolver.py ├── metadata.py ├── report_generator │   ├── __init__.py │   └── report_pipeline.py ├── risk_engine │   ├── risk_config.json │   └── risk_engine.py ├── sbom_generator.py ├── scan_engine.py ├── scanner.py ├── threat_intel │   ├── benchmark_threat_intel.py │   ├── cache.py │   ├── cve_info.py │   ├── diagnose_threat_intel.py │   ├── epss.py │   ├── __init__.py │   ├── kev.py │   ├── nvd.py │   ├── test_threat_intel.py │   └── threat_sources.py └── utils ├── cli_summary.py ├── dependency_checker.py ├── __init__.py └── summary.py ``` ## 缓存 威胁情报响应(NVD、EPSS、KEV)缓存在磁盘的 `cache/` 目录下,以避免每次扫描都请求上游 API。缓存 TTL: | 来源 | TTL | 原因 | |-----|-----|-----------------------------------------------------------| | KEV | 24h | CISA 每日更新目录 | | EPSS | 24h | FIRST.org 每日刷新分数 | | NVD | 12h | CVE 描述和 CVSS 分数一旦发布后很少变化 | 大型镜像(1000+ CVE)的冷缓存首次扫描需要 5-10 分钟,因为 NVD 对认证请求的速率限制约为 1.85/秒。同一镜像的后续扫描在 1 秒以内完成;跨镜像扫描在 CVE 重叠时共享缓存命中。 ## 已知限制 - **高 CVE 数量镜像的冷缓存扫描速度较慢。** 拥有约 1000 个 CVE 的镜像首次扫描需要 5-10 分钟,原因是 NVD 的速率限制(即使使用 API 密钥也约为 1.85 次请求/秒)。建议的解决方法是对常用基础镜像进行缓存预热。 - **STIG / SCAP 配置审计尚未实现。** 漏洞检测(基于 CVE)和配置合规(如 DISA STIG)是两个不同的领域;VulnSight 目前覆盖前者。 ## 路线图 - **本地 NVD 源缓存**,通过 [Fraunhofer FKIE 社区源重建](https://github.com/fkie-cad/nvd-json-data-feeds) 消除每个 CVE 的 API 速率限制,每 2 小时刷新一次 - **STIG / SCAP 合规扫描**,通过 OpenSCAP 集成实现,与 CVE 发现并列 - **跨基础层的 CVE 去重**——检测子镜像何时从基础镜像继承 CVE 并相应地对发现进行分组 ## 许可证 MIT。详见 [LICENSE](./LICENSE)。 ## 作者 Venkata Sai Nataraja Vamsi Krishna Palaparty - 东北大学网络安全硕士 - 曾就职于 Zscaler - LinkedIn:https://www.linkedin.com/in/vsnvamsikrishnapalaparty/ - 邮箱:vsnvamsikrishna.palaparty@gmail.com
标签:AES-256, Angular, CI/CD安全, CISA KEV, CVE, CVSS, DevSecOps, EOL检测, EPSS, GPT, Grype, HTML报告, Llama, LLM防护, meg, NVD, PDF报告, root权限检测, SBOM, SUID检测, Syft, WebSocket, Web截图, 上游代理, 主机漏洞检测, 依赖分析, 信息安全, 反取证, 多模态安全, 威胁情报, 威胁情报富集, 安全合规, 安全评估, 安全风险量化, 容器安全, 容器安全扫描, 开发者工具, 开源漏洞, 数字签名, 漏洞管理, 漏洞评估, 硬件无关, 网络代理, 网络安全, 请求拦截, 资产安全, 逆向工具, 隐私保护, 风险评分, 风险评分引擎