
bomber 是一款扫描 SBOM 以发现安全漏洞的应用程序。
你向某个供应商索要其一个闭源产品的软件物料清单(SBOM),他们给了你一个 JSON 文件……然后呢?
你首先要做的事情就是查看 SBOM 中列出的组件是否存在安全漏洞,以及这些组件拥有何种许可证。这将帮助你识别使用该产品可能承担的风险。
查找 SBOM 中标识的组件的安全漏洞和许可证信息,正是 bomber 的用途。bomber 可以读取任何基于 JSON 或 XML 的 CycloneDX 格式,或者 JSON 格式的 SPDX 或 Syft 格式的 SBOM,并能很快告诉你是否存在漏洞。
软件可以分为开源或闭源。你可以在 Github 或任何公共源代码仓库中找到的第三方组件视为开源软件。从技术上讲,你在自己公司内部开发的软件也是开源的——它不是公开的,但你的内部团队可以看到。闭源软件同样可以是内部的,但这通常是你从外部供应商处购买的软件。
公司可以使用供应商提供的 SCA 工具(如 Github、Sonatype、Snyk 等)来扫描任何类型的开源软件并提供漏洞数据,甚至在某些情况下生成 SBOM。但它们目前还无法扫描你无法查看的闭源软件。这正是 SBOM 和 bomber 发挥作用的地方。SBOM 提供了你无法访问的软件的组成信息,而 bomber 则判断 SBOM 中是否有组件存在漏洞。
我们创建 bomber 是为了扫描从供应商那里获得的闭源 SBOM。它也可以扫描开源 SBOM,从技术上讲,你也可以将 bomber 用作开源 SCA 工具。
目前有许多 SBOM 格式。bomber 支持以下格式:

bomber 支持多个漏洞信息来源。我们称之为 提供者。目前,bomber 默认使用 OSV,但你也可以使用 GitHub 安全公告数据库、Sonatype OSS Index 或 Snyk。
请注意,目前 OSV 是免费的,无需凭据即可使用;Sonatype OSS Index 免费但需要注册并获取令牌;而 Snyk 支持需要 Snyk 许可证。
除了从提供者收集的数据之外,bomber 还会用额外信息(如利用概率)对漏洞数据进行 增强。
请注意,每个提供者支持不同的生态系统,所以如果你在一个提供者中未发现漏洞,可以尝试另一个。生态系统简单地指包管理器或包的类型,例如 rpm、npm、gems 等。理解每个提供者可能报告不同的漏洞非常重要。如果不确定,可以多查几个。
如果 bomber 没有发现任何漏洞,这并不意味着没有漏洞。它只意味着所使用的提供者没有检测到,或者它不支持该生态系统。某些提供者返回的漏洞可能没有严重性信息。在这种情况下,严重性将被列为“UNDEFINED”。
bomber 的提供者文档位于:
你可以使用 Homebrew 安装 bomber:
brew tap devops-kung-fu/homebrew-tap
brew install devops-kung-fu/homebrew-tap/bomber
如果你没有 Homebrew,也可以下载最新版本(例如:bomber_0.4.1_darwin_all.tar.gz),解压文件后使用 bomber 二进制文件。
如果你愿意,可以将 bomber 二进制文件移动到 /usr/local/bin 目录或你路径中的任何位置。
要安装 bomber,请下载最新版本对应平台的包,然后本地安装。例如,在 Ubuntu 上安装 bomber:
dpkg -i bomber_0.5.0_linux_arm64.deb
你可以使用 bomber 扫描整个 SBOM 文件夹或单个 SBOM。bomber 不关心单个文件夹中是否有多种格式,它会自动处理。
注意,bomber 的默认输出是 STDOUT。以 HTML 或 JSON 格式输出的选项将在本文档后面描述。
# 使用 OSV(默认提供者),无需任何凭据
bomber scan cyclonedx.sbom.json
# 使用需要凭据的提供者(ossindex)
bomber scan --provider=xxx --username=xxx --token=xxx [sbom.json]
如果提供者发现漏洞,你将看到类似以下的输出:

如果提供者未返回任何漏洞,你会看到一条消息,表示未发现漏洞。
注意: 使用指定提供者未发现漏洞,并不意味着没有漏洞。请尝试 bomber 支持的其他提供者。
当你从供应商处收到同一产品的多个 SBOM 时,或者想了解整个组织中的漏洞情况时,这种方式很实用。文件夹扫描会查找所有组件、去重,然后扫描漏洞。
# 扫描一个 SBOM 文件夹(以下命令将扫描当前目录下名为 "sboms" 的文件夹)
bomber scan --provider=xxx --username=xxx --token=xxx ./sboms
你将看到与单个 SBOM 扫描类似的结果。
bomber 以三种有用的格式输出数据。默认情况下,输出到命令行。对于增强的报告,你可以使用 --output=html 标志输出到 HTML。要输出为 JSON,请使用 --output=json 标志。使用逗号分隔的输出规范可以同时获得多种格式的输出:--output=html,stdout,json。
如果你想生成一份包含详细漏洞信息的可读报告,可以使用 --output 标志将报告保存为 HTML 文件。
示例命令:
bomber scan bad-bom.json --output=html
这将在当前文件夹中保存一个名为 "YYYY-MM-DD-HH-MM-SS-bomber-results.html" 的文件。如果你在浏览器中打开此文件,将看到类似以下的输出:

bomber 可以使用 --output 标志以 JSON 格式输出漏洞数据。默认输出到 STDOUT。JSON 输出中包含的信息比终端显示的多得多。你可以看到包描述及其用途、漏洞名称、漏洞摘要等。

示例命令:
bomber scan bad-bom.json --output=json > filename.json
bomber 也支持 Markdown 格式的输出。这与 HTML 输出非常相似,但将样式职责交给了 Markdown 渲染器(例如 GitHub)。输出文件格式为 "YYYY-MM-DD-HH-MM-SS-bomber-results.md"。
示例命令:
bomber scan bad-bom.json --output=md
如果需要,你可以使用 --ignore-file 标志加载一个 CVE 列表,在漏洞输出中忽略这些 CVE。该列表需要采用特定格式,每个要忽略的 CVE 单独一行,如下所示:
CVE-2022-31163
CVE-2022-23520
这里 提供了一个示例 bomber.ignore 文件。
要使用 bomber.ignore 文件,请使用以下语法:
bomber --ignore-file=bomber.ignore scan bom.json
你可以使用 --severity 标志设置严重性级别,以返回特定严重性的漏洞。例如,如果设置 --severity=moderate,则只返回严重性为 MODERATE 及以上的漏洞。
例如,以下命令将只返回高和严重漏洞。
bomber --severity=high scan bom.json
bomber 能够增强从提供者获得的漏洞数据。我们已实现的第一个“增强器”用于 EPSS。
注意: 在 bomber 0.5.0 及以上版本 中,EPSS 评分不再是默认项。要显示 EPSS 分数,请确保使用 --enrich=epss 标志。
EPSS 代表漏洞利用预测评分系统,是一个预测漏洞被利用概率的框架。EPSS 通常用于帮助识别高风险漏洞,以确定修复优先级。
EPSS 使用百分比表示概率。因此,如果你看到 94,该分数意味着该漏洞有 94% 的利用概率。理所当然,像 94 这样高的分数值得立即关注,而像 20 这样的分数优先级较低。
如果你愿意,可以设置两个环境变量来存储凭据,从而无需在命令行中输入它们。请查看本 README 后面的环境变量信息。
如果你在 CI/CD 管道中使用 bomber,可以使用一条命令结合 Syft 生成并扫描 SBOM 以发现漏洞。可以执行类似以下命令:
# 确保在命令末尾包含 - 字符。这会触发 bomber 从 STDIN 读取
syft packages . -o cyclonedx-json | bomber scan --provider ossindex --output json -