mimecast/sbom-graph

GitHub: mimecast/sbom-graph

一款组织级 SBOM 图谱分析工具,通过构建全局依赖关系网络实现漏洞影响分析、供应链信任评分和许可证合规管理。

Stars: 8 | Forks: 0

![SBOM-Graph](https://static.pigsec.cn/wp-content/uploads/repos/cas/86/8619431d40ee7b57f6d619ea92afcbdf68bbf0fe6cb618e0a5fcf56fcc83a209.jpg) ## 工具概述与功能 该工具处理从软件物料清单(SBOM)文件生成的依赖图,并提供预配置的报告和可视化功能,以提供可操作的洞察。其主要功能包括: 漏洞影响分析:识别受漏洞影响的项目,并根据相互依赖关系确定修复优先级(例如,确定必须先更新哪些项目以避免连锁反应)。 检测不良实践: - 版本锁定错误,如果执行不当可能会导致运行时错误。 - 循环依赖。 - 非语义化版本控制(Non-SemVer)。 - 在生产版本中使用 SNAPSHOT 版本。 从 AppSec、架构和工程的角度来看,这些报告有助于发现设计缺陷、不良实践和错误。该工具在零日漏洞场景中特别有价值,能够快速识别所有受影响的项目和依赖项。 战略潜力与未来增强 该工具还具有进一步增强的潜力,即通过额外的数据点来丰富图谱。例如,通过纳入诸如库的安全性和质量评级等指标,我们可以实现高级的依赖威胁建模。这将允许您通过用更健壮的替代方案替换安全性较低的库,来主动识别和降低风险。 该项目由 5 部分组成: 1. **sbom-graph-model** -- 一个用于处理 CycloneDX 和 SPDX 文件并将其存储在 GraphDB 中的 Python 库 2. **sbom-graph-api** -- 一个 Flask 应用程序,用于可视化图数据、通过经过身份验证的 API 摄取 SBOM(CycloneDX 和 SPDX),并提供有关依赖关系、漏洞、许可证、策略合规性和供应链信任分数的报告 3. **sbom-graph-enrichment** -- 一个基于 Celery 的异步富化流水线,查询外部 API(OSV、ClearlyDefined、OpenSSF Scorecard、Sonatype OSS Index、deps.dev、endoflife.date)以丰富包元数据并计算信任分数 4. **sonatype-lifecycle-release-listener** -- 用于 SCA 扫描的发布监听器,用于检索 CycloneDX 文件并进行处理 5. **sbom-graph-cli** -- 用于摄取、查询、策略注释和报告导出(脚本和 CI/CD)的命令行界面 有关详细的架构文档,请参阅 [SPECIFICATION.md](SPECIFICATION.md)。 有关完整的部署演练(前置条件、TLS 设置、Helm 配置、本地和远程 Kubernetes),请参阅 [GETTING_STARTED.md](GETTING_STARTED.md)。 ### 功能 - **多格式 SBOM 摄取**:通过 REST API 上传 CycloneDX 和 SPDX 2.3 SBOM(`POST /ingest/cyclonedx`、`POST /ingest/spdx`、`POST /ingest/sbom` 用于自动检测);响应中使用 `record_id` 跟踪 SBOM 来源;所有入站 payload 均根据 JSON Schema (Draft-07) 进行验证 - **漏洞富化**:持续从 OSV.dev 和 Sonatype OSS Index 进行富化,在摄取后发现新的 CVE - **许可证跟踪和合规性**:从 SBOM 中提取许可证并通过 ClearlyDefined 进行富化,按风险类别(Copyleft、Weak Copyleft、Permissive)分组,并进行冲突检测 - **VEX 支持**:摄取 OpenVEX 文档以传达漏洞是否实际影响产品,并提供覆盖率统计 - **补丁规划和爆炸半径**:针对漏洞的前沿级补丁规划,以及针对受损包的爆炸半径分析 - **策略注释**:将包标记为批准/拒绝/保留(certifyBad/certifyGood),并提供用于二进制授权的 CI/CD 门控 endpoint - **源代码仓库跟踪**:将包链接到其源代码仓库,用于来源检查和记分卡查找 - **供应链信任分数**:来自 OpenSSF Scorecard、OSV、Sonatype OSS Index 和 deps.dev 的综合信任分数,具有继承的风险传播和下降警报功能(请参阅[下方的专属章节](#supply-chain-trust-score)) - **可视化**: - 具有颜色编码分区级别的 K-Partite 依赖可视化 - 项目版本及其直接依赖项的 Bi-Partite 图 - 依赖图(完整的反向依赖树) - 具有多种布局(spring、radial、shell、BFS、circular)和循环检测的依赖图 - 交互式布局切换器和循环边缘高亮显示 - 信任分数热力图、风险传播图、应用程序风险仪表板、风险路径探索器、风险异常值和假设模拟器 - **报告**:提供 HTML 表格、Excel 导出和 JSON 导出,用于: - 带有版本的所有项目 - 具有最新版本过滤的应用程序清单 - SNAPSHOT 依赖项 - 自依赖检测 - 多版本依赖源跟踪(菱形依赖分析) - Non-SemVer 版本检测 - 传递依赖(某个版本所依赖的内容) - 具有分区级别和路径的依赖项 - 按严重程度排序的所有漏洞 - 漏洞依赖项(影响分析) - 中心性指标(inDegree/outDegree) - 许可证清单和每个项目的许可证摘要 - 漏洞新鲜度(富化时长) - 策略违规(仍在使用的被禁包) - VEX 覆盖率统计 - 许可证冲突(同一依赖树中不兼容的许可证) - 源代码仓库清单 - 富化覆盖率(最近、过期与从未扫描的包) - 许可证仪表板(按风险类别汇总) - 信任分数差距(没有信任分数的包) - 事件响应(每个漏洞的爆炸半径和补丁计划) - 源影响(受受损源代码仓库影响的应用程序) - SBOM 清单(已摄取的 SBOM 记录) - SBOM 覆盖率(每个应用程序的来源覆盖率) - **编程 API (v1)**:用于 CI/CD 流水线的仅限 JSON 的 endpoint,带有 `{data, pagination?, meta}` 包装格式。包括包元数据、依赖/依赖项树、关键依赖项、风险摘要、OpenAPI 规范、漏洞查找、策略检查、信任分数门控和富化触发器 - **CLI 工具**:`sbom-graph` CLI,用于摄取、查询(vulns、deps、dependants、patch-plan)、策略注释和报告导出,支持使用 `--output json` 用于流水线 - **交互式 UI 功能**: - 所有报告和可视化中的仅内部切换开关 - 遵守当前过滤状态的动态下载链接 - 带有可测试所有 endpoint 的表单的交互式 API 文档 - 可滚动数据表的冻结表头 ## 项目结构 ``` sbom-graph/ ├── sbom-graph-model/ # Python library for CycloneDX/SPDX → FalkorDB ├── sbom-graph-api/ # Flask API, reports, and visualizations ├── sbom-graph-enrichment/ # Celery enrichment pipeline (OSV, Scorecard, etc.) ├── sonatype-lifecycle-release-listener/ # SCA scan release listener ├── sbom-graph-cli/ # CLI for ingest, query, policy, export ├── helm/ │ └── sbom-graph/ # Umbrella Helm chart for all components ├── build-images.sh # Docker build script ├── release.sh # Build, tag, push images + update Helm values ├── deploy.sh # Helm upgrade/install preserving volumes ├── sync-helm-tags.sh # Sync pyproject.toml versions to Helm tags └── SPECIFICATION.md # Detailed architecture documentation ``` ## 供应链信任分数 信任分数通过聚合来自四个外部来源的数据,为依赖图中的每个包提供一个单一的、基于证据的评分 (0--10): | 来源 | 提供的内容 | |--------|-----------------| | [OpenSSF Scorecard](https://scorecard.dev) | 18+ 项安全实践检查(分支保护、代码审查、SAST、模糊测试等) | | [OSV 数据库](https://osv.dev) | 漏洞数量、严重程度分布、平均修复时间 | | [Sonatype OSS Index](https://ossindex.sonatype.org) | 专有漏洞情报和修复指南 | | [deps.dev](https://deps.dev) | 项目健康状况、公告数量、记分卡数据和活动信号 | ### 评分类别 综合分数是通过四个加权类别计算的,每个类别都标准化为 0--10: | 类别 | 默认权重 | 衡量内容 | |----------|---------------|-----------------| | 安全实践 | 30% | 分支保护、代码审查、SAST、模糊测试、危险工作流 | | 漏洞概况 | 35% | 开放的 CVE 数量/严重程度、修复率、平均补救时间 | | 维护状况 | 20% | 近期活动、贡献者数量、维护信号 | | 供应链健康度 | 15% | 固定依赖、签名发布、CI 测试、打包 | 当某个数据源不适用于某个类别时,将按比例对其余来源重新计算权重。每个分数旁边都会报告一个**置信水平** (0--1)。 ### 继承的风险传播 一个包的*直接分数*只能说明部分情况。一个评分为 9/10 的库如果依赖于评分为 2/10 的库,其风险远比其自身分数显示的要高。信任分数系统计算出一个**有效分数**,该分数反映了整个传递依赖树中的总体风险: ``` effective_score(v) = α × direct_score(v) + (1 − α) × inherited_score(v) ``` - **α**(默认为 0.4)控制自身分数与继承风险之间的平衡 - **深度衰减**(衰减因子 δ = 0.8)降低了每个依赖级别的影响力:直接 = 1.0,深度 2 = 0.8,深度 5 ≈ 0.41 - **最小路径分数**跟踪从应用程序到叶节点的任何路径上最糟糕的单个组件(“最薄弱的环节”) - 分数通过反向拓扑顺序**自下而上**进行计算;当依赖项升级时,改进会自动传播 ### 信任分数下降警报 当一个包的有效分数低于 `TRUST_SCORE_ALERT_THRESHOLD`(默认值为 4.0)时,富化流水线将发出 WARNING 级别的日志警报,列出前 20 个处于风险中的包。可以通过 Helm values 中的 `trustScore.alertThreshold` 或 `TRUST_SCORE_ALERT_THRESHOLD` 环境变量来配置阈值。 ### API Endpoint | Endpoint | 描述 | |----------|-------------| | `GET /api/v1/package/{purl}/trust-score` | 完整的信任分数细分:直接分数、有效分数、继承分数、各类别分数、置信度 | | `GET /api/v1/package/{purl}/trust-score/risk-path` | 导致分数下降的主要依赖链 | | `GET /api/v1/application/{purl}/supply-chain-risk` | 应用程序级别的总体风险,包括最薄弱环节和主要贡献者 | | `GET /api/v1/analysis/trust-score-distribution` | 所有包的有效分数直方图 | | `GET /api/v1/analysis/remediation-priorities` | 按修复杠杆作用(每次升级改善的应用程序)排名的包 | | `GET /api/v1/package/{purl}/trust-check` | CI/CD 门控:对照最低有效分数阈值进行通过/失败判定 | ### CI/CD 门控 trust-check endpoint 专为流水线集成而设计: ``` curl -s -H "Authorization: Bearer $TOKEN" \ "$API_URL/api/v1/package/pkg:maven%2Fcom.example%2Fmy-lib@1.0.0/trust-check?min_score=5.0" ``` 返回 `pass` 或 `fail` 判定结果,以及包的有效分数、置信度和各类别细分。该门控检查的是**有效分数**(不仅仅是直接分数),从而能捕捉到包本身看起来正常但具有风险依赖项的情况。 ### 配置 评分参数可通过环境变量或 Helm values 进行配置: | 参数 | 默认值 | 描述 | |-----------|---------|-------------| | `trustScore.enabled` | `true` | 启用/禁用信任分数计算 | | `trustScore.weights.securityPractices` | `0.30` | 安全实践类别的权重 | | `trustScore.weights.vulnerabilityProfile` | `0.35` | 漏洞概况类别的权重 | | `trustScore.weights.maintenanceHealth` | `0.20` | 维护状况类别的权重 | | `trustScore.weights.supplyChainHygiene` | `0.15` | 供应链健康度类别的权重 | | `trustScore.propagation.alpha` | `0.4` | 自身分数与继承分数之间的平衡 | | `trustScore.propagation.decay` | `0.8` | 每深一层的衰减因子 | | `trustScore.propagation.maxDepth` | `20` | 最大遍历深度 | | `trustScore.alertThreshold` | `4.0` | 低于该有效分数将发出 WARNING 级别的警报 | ## 富化流水线 `sbom-graph-enrichment` 组件是一个基于 Celery 的异步 worker,在 SBOM 摄取后不断富化包元数据。它运行以下富化任务: - **漏洞富化**:查询 OSV.dev 和 Sonatype OSS Index 以获取已知漏洞,在图中创建 `Vulnerability` 节点和 `HAS_VULNERABILITY` 边 - **许可证富化**:查询 ClearlyDefined 以获取许可证元数据,按风险(Copyleft、Weak Copyleft、Permissive)对许可证进行分类 - **EOL 富化**:查询 endoflife.date API 以获取产品生命周期信息(生命周期结束日期) - **源代码仓库富化**:查询 deps.dev 以获取源代码仓库 URL,带有用于缓解 SSRF 的主机允许列表 - **信任分数计算**:查询 OpenSSF Scorecard、OSV、Sonatype 和 deps.dev 以计算综合信任分数,并通过依赖图传播继承的风险 富化任务可以通过 API(`POST /api/v1/enrich/vulnerabilities`)按需触发,或按可配置的计划运行。该流水线被设计为幂等的:重新运行富化会更新现有节点,而不是创建重复节点。 ## 部署 ### 推荐:`release.sh` + `deploy.sh` 构建镜像(限发生更改的镜像)、更新 Helm 标签并部署: ``` ./release.sh # Build changed images, update helm/charts/sbom-graph/values.yaml ./deploy.sh # helm upgrade --install, preserving volumes and secrets ``` 对于 minikube,将镜像直接加载到虚拟机中: ``` ./release.sh --load-minikube ./deploy.sh ``` 对于远程镜像仓库: ``` ./release.sh --registry ghcr.io/myorg --push ./deploy.sh --namespace production ``` 使用 `--force-build` 从头开始重建所有镜像(向 Docker 传递 `--no-cache`),并使用 `--dry-run` 进行预览而不执行: ``` ./release.sh --force-build --dry-run ``` 运行 `./release.sh --help` 或 `./deploy.sh --help` 获取完整选项列表。 ### 手动 Helm 安装 使用总括 Helm chart 直接部署所有组件: ``` helm install sbom-graph ./helm/charts/sbom-graph ``` ## Docker 构建 ### 使用 `release.sh`(推荐) `release.sh` 脚本从每个子项目的 `pyproject.toml` 中读取版本,仅构建本地尚不存在对应标签的镜像,并自动更新 Helm values: ``` ./release.sh # Build changed images ./release.sh --force-build # Clean rebuild of all images ./release.sh --registry ghcr.io/myorg --push # Build, tag with registry prefix, push ./release.sh --load-minikube # Build and load into minikube ``` ### 直接使用 `build-images.sh` 从**仓库根目录**(例如 `./build-images.sh`)运行脚本。每个镜像都是使用**该子项目文件夹作为 Docker 上下文**构建的(与 CI 相同),而不是 monorepo 根目录。该脚本处理构建顺序和依赖关系。 #### 构建所有镜像 ``` ./build-images.sh ``` 这将: 1. 构建 `sbom-graph-model` wheel(`sonatype-lifecycle-release-listener` 所需) 2. 构建 `sbom-graph-api` Docker 镜像 3. 构建 `sonatype-lifecycle-release-listener` Docker 镜像 4. 构建 `sbom-graph-enrichment` Docker 镜像 除非您传递 `--adv-tag`、`--rl-tag` 或 `--enr-tag`,否则每个镜像都会被打上标签 `:` 和 `:latest`,其中 **safe-version** 是该子项目的 `pyproject.toml` 中的 `[project].version`,并将 `+` 替换为 `-`(符合 OCI 安全规范)。安装时使用的 `--build-arg PYTHON_PACKAGE_VERSION` 仍然保持原始的 PEP 440 版本字符串。 #### 构建单个目标 ``` ./build-images.sh model # Wheel only ./build-images.sh sbom-graph-api # sbom-graph-api image only ./build-images.sh sonatype-lifecycle-release-listener # release listener image only ./build-images.sh sbom-graph-enrichment # enrichment image only ``` #### 自定义镜像标签 ``` ./build-images.sh --adv-tag myrepo/adv:v2 --rl-tag myrepo/rl:v2 ``` #### 不使用缓存重建 ``` ./build-images.sh --no-cache ``` 运行 `./build-images.sh --help` 获取完整选项列表。 ## 许可证 本项目是开源软件,基于 **MIT** 许可证。 ### 基础设施依赖:FalkorDB (SSPLv1) 本项目依赖 [FalkorDB](https://www.falkordb.com/) 作为其图数据库。FalkorDB 基于 **Server Side Public License v1 (SSPLv1)** 授权,这对如何部署完整的软件栈具有一定的影响: | 部署场景 | SSPLv1 义务 | |---------------------|-------------------| | **内部使用**(不作为服务提供给第三方) | 无限制。自由使用。如果需要,可以使用企业支持包或 FalkorDB 托管解决方案 | | **作为服务提供给外部用户**(例如 SaaS、托管 API) | 您必须在 SSPLv1 下开源**整个服务栈**——或者从 FalkorDB 获得[商业许可](https://www.falkordb.com/)。 | | **分发此源代码**(不含 FalkorDB 二进制文件) | 无 SSPL 义务。MIT 许可证适用于此代码。 | SSPLv1 仅适用于 FalkorDB **服务器二进制文件**。本项目使用的 FalkorDB Python 客户端库基于 MIT 许可证授权。本项目的 MIT 许可证与 SSPL 不冲突,因为 FalkorDB 作为单独的网络服务被使用,而不是被链接或嵌入的。 **如果您的组织无法接受 SSPLv1 条款**,您将需要获取 FalkorDB 的商业许可,或者调整持久层以使用基于其他授权的图数据库。 ### 其他依赖项 所有 Python 库依赖项均使用宽松的许可证(MIT、BSD-3、Apache-2.0),但有两个例外:**ldap3**(LGPL-3,弱 copyleft)和 **certifi**(MPL-2.0,弱 copyleft)。certifi 提供 Mozilla CA 证书包,被普遍接受用于 TLS 证书验证。有关完整的许可证评估,请参阅 [threat-model.md](threat-model.md)。 ## 贡献 请联系 Brett Crawley 获取贡献指南。
标签:GPT, Mutation, Python, WebSocket, 依赖分析, 可视化, 子域名突变, 无后门, 漏洞管理, 网络测绘, 请求拦截, 跌倒检测, 软件物料清单, 逆向工具