离线单二进制 Web 应用,可导入 CycloneDX、SPDX 和 syft SBOM,运行 CVE 扫描器集成,使用 EPSS、CISA-KEV 和 nuclei 丰富发现结果,并导出 SARIF、CSAF 和 PDF。
一个单二进制、离线的 Web 应用程序,用于调查 SBOM(软件物料清单)文件。上传一个 SBOM 或导入一个包含它们的文件夹,使用一组独立工具对每个进行分析,在一个本地 UI 中查看规范化后的发现结果,并以八种格式导出结果。无需安装,无需网络访问,无遥测。
NOASSERTION 与单纯缺失的字段。主页(/)列出每个已存储的 SBOM,并随着语料库增长而保持可用:
log4j 或 openssl 之类的查询会找到每个包含该组件的 SBOM。查询有长度上限,并以宽松方式解析。/components 一次性在整个语料库中回答反过来的问题——我的哪些 SBOM 声明了这个组件——按组件名称或精确包 URL。它读取在摄取时构建的专用组件索引,与仪表板的全文索引分开。
由于过期的索引会使一个确实受影响的 SBOM 被读作“未受影响”,该页面会说明有多少 SBOM 尚未建立索引,并提供重建索引,它会为恰好这些 SBOM 重新解析保留的字节。只有当该警告消失时,搜索才算完整。
“已索引”意味着索引已构建,这与“产生了行”并不相同:仅含元数据的 SBOM 不声明任何组件,因此它不贡献任何行,但仍完全已索引。存储按 SBOM 记录索引这一事实(schema v8,components_indexed_at),而不是从行的存在推断——推断意味着一个无组件的 SBOM 永远无法离开“尚未索引”集合,因此该警告在每次重建后仍然存在,而按钮永远将相同的 SBOM 报告为新近索引。升级会自动迁移,并回填任何已有行的内容;一次重建即可解决其余部分。
每个工具在运行时都是可选的,并在 PATH 上检测(用 SBA_TOOL_<NAME>_BIN 覆盖二进制文件)。发现结果从不依赖于任何单一工具。在每次扫描之前,工具会以其版本参数启动一次:没有二进制文件意味着 skip(not found on PATH),而无法启动的二进制文件,或在 15 秒内没有给出应答的二进制文件,意味着 fail 并附带该原因。
| 工具 | 角色 | 验证版本 |
|---|---|---|
| syft | SBOM 规范化器 / CycloneDX 1.6 转换器 | 1.52.0 |
| grype | CVE 匹配器 | 0.119.0 |
| trivy | 漏洞扫描器 | 0.74.0 |
| osv-scanner | OSV 数据库查询 | 2.4.0, 2.6.0 |
| bomber | 独立组合匹配器 | 0.5.1 |
| bomdrift | 供应链漂移 / 域名抢注(SARIF) | 0.9.9 |
| inspektr | SBOM 漏洞扫描器(JSON) | 0.1.9 |
| shieldbom | 离线嵌入式/IoT CVE 扫描器(SARIF) | 0.3.0 |
| provenant | 许可证 / 版权 / 来源(ScanCode) | 1.0.10 |
“验证版本”是每次调用实际使用过的版本,既不是下限也不是固定版本:工具在运行时于 PATH 上解析,任何兼容版本都可以工作。osv-scanner 列出两个版本,是因为在 2.x 系列更改其日志记录后重新验证了 2.6.0——文档中记载的 scan --lockfile <input> --format json 形式未变,并且在发现结果时仍以非零状态退出,因此无需更改代码。
前八个工具贡献 CVE 形态的漏洞发现结果;provenant 不同——它报告许可证、版权、持有者和作者来源信息,审计器将其存储并显示为其自己的发现结果形态(每次运行一个“许可证与来源”部分,包含在 Markdown 导出中),而不是将其丢弃。
扫描器无法直接读取每种格式:bomber 仅消费 CycloneDX ≤ 1.6,并且没有任何扫描器读取 SPDX 3.0 JSON-LD。在这两种情况下,审计器会先通过 syft convert 将输入规范化为 CycloneDX,并在 syft 不可用时以有记录的原因跳过,而不是让工具报告零个包。grype 的漏洞数据库每次运行刷新一次(带外),因此例行的过期会变成一次全新扫描,而不是一次失败的扫描。
分析之后,每个 CVE 形态的发现结果都会用从 vulnlookup 服务(默认 https://vulnlookup.ndaal.eu)拉取的三个真实信号进行富化:
每个发现结果都会显示其 KEV、Nuclei、EPSS 和 Source 值,其中 Source 链接回 vulnlookup 记录,并且发现结果按最紧急优先排序:已知被利用(KEV)条目领先,然后是那些具有更高 EPSS 百分位的;没有富化的发现结果保持分析器产生它们的顺序。富化会进入每种导出格式——SARIF 2.1 / 2.2、Markdown、ODT、DOCX、PDF 和 CSAF 2.1 / 2.2,其中 CSAF 将 EPSS 作为原生指标携带,并将 CISA-KEV 和 nuclei 记录为注释——并且导出表单现在默认勾选每种格式。
在设置 → 漏洞富化下配置它:一个开/关切换(默认启用)以及最多三个 vulnlookup 源,每个都有基础 URL、TCP 端口和 QUIC 端口(空白端口视为 443)。源 1 和源 2 默认使用公共的 https://vulnlookup.ndaal.eu 端口 443;源 3 默认使用回环地址 https://127.0.0.1,位于本机自己的 8680(TCP)/ 8681(QUIC)端口上,因此同址部署的 vulnlookup 开箱即是一个可用的回退。这些源按顺序尝试——第一个是主源,其他是回退。
这些查询由审计器的服务器进程发起,而不是由浏览器发起,因此它运行所在的主机本身必须通过 HTTPS 访问该源:客户端仅使用 TLS 1.3,并信任操作系统的 CA 捆绑包。如果无法做到,每个发现结果都会保持 Not enriched,而分析仍会完成,服务器日志会显示 post-analysis enrichment finished,并带有非零的 failed= 计数(或者当客户端完全无法启动时显示 post-analysis enrichment failed)。富化在每个分析器都完成后运行一次,因此各列会在运行完成后不久填充。
阅读结果时,请检查每个发现结果所匹配到的包。一个没有包的发现结果上的 KEV 徽章——例如 affects fedora @ 40——来自与操作系统发行版的匹配,而不是已安装的包,通常并不适用。针对 Go 标准库报告的 CVE-2020-0601 是同类不匹配:它是一个 Windows CryptoAPI 缺陷,Go 在 1.13.6 中修复了它。
要在一个发现结果上看到全部三个信号,请分析来自 ndaal_public_sbom_examples 仓库的 jenkins:2.60.3 镜像 SBOM(example/anchore-sbom-examples/results/docker.io_library_jenkins:2.60.3/sbom/):Spring4Shell(CVE-2022-22965)和一个 Jenkins Stapler RCE(CVE-2018-1000861)各自都带有一个 KEV 徽章、一个严重 nuclei 模板以及高于 0.98 的 EPSS。
GitLab 工作项 #2 添加了一个创建 CSAF 文档操作:一个 SBOM 的审计发现结果会变成一个草稿 CSAF 2.1 公告(状态 draft,版本 0.1.0,跟踪 id ndaal-sba-draft- 加上该 SBOM 的 SHA-256 的前 16 个十六进制数字),并提交给 csaf-crud 服务,例如 csaf.ndaal.eu。此构建包含草稿生成器和设置 → CSAF 上传卡片:三个端点,按顺序尝试(csaf.ndaal.eu 两次,然后是位于 https://localhost:8180 的本机 csaf-crud),以及一个仅对回环端点信任自签名证书的选项。SBOM 页面上的按钮、草稿下载和 --export-csaf 命令行选项将在后续阶段推出。
#![forbid(unsafe_code)];lint 策略在生产代码中拒绝会 panic 的快捷方式、未检查的算术和未检查的索引。--encryption-key-file)。fail 并附带该原因,而不是一个读取为 not found on PATH 的 skip。--tls-key 拒绝 PKCS#1 RSA 密钥(no-RSA 策略),并且在 Unix 上拒绝组可读或全局可读的密钥文件。GET /export/download 仅提供具有可识别的导出或校验和附属文件扩展名的名称,因此配置错误的导出目录无法交出系统文件。cargo audit 干净。从 crates.io 安装已发布的版本——cargo install 从源代码构建它,cargo binstall 从 GitLab 发布获取预构建的二进制文件:
cargo install sbom-auditor # build from source
cargo binstall sbom-auditor # prebuilt GitLab-release binary
或者直接构建此检出(需要较新的稳定版 Rust 工具链):
cargo build --release
./target/release/sbom-auditor