
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 -
此命令创建 SBOM,通过管道传递给 bomber,并以 JSON 格式生成结果。
如果你不想每次都输入凭据,可以将以下内容添加到 .bashrc 或 .bash_profile:
export BOMBER_PROVIDER_USERNAME={{你的 OSS Index 用户名}}
export BOMBER_PROVIDER_TOKEN={{你的 OSS Index API 令牌}}
使用 --exitcode 标志,将以一个代表找到的最高漏洞严重性的退出码返回。如果不使用此标志,成功时退出码为 0,遇到错误时为 1。
假设没有错误,当使用 --exitcode 时,bomber 将返回以下值:
| 严重性 | 返回码 |
|---|---|
| UNSPECIFIED(当提供者返回不明确或没有信息时的状态) | 10 |
| LOW | 11 |
| MODERATE | 12 |
| HIGH | 13 |
| CRITICAL | 14 |
bomber 现在包含一个实验性功能,可在 html 输出中增强漏洞描述。该功能会获取漏洞并将其描述转换为对非技术用户更易于理解的内容。
注意: 该功能目前处于主要 alpha 阶段。速度非常慢,且输出格式不佳。
要使用此功能,你需要提供 OpenAI API 密钥。你可以通过 --openai-api-key={{你的 OpenAI API 密钥}} 在 CLI 中传递该密钥,或添加环境变量:
export OPENAI_API_KEY={{你的 OpenAI API 密钥}}
设置 OpenAI API 密钥后,你可以如下设置输出标志:
bomber scan --output ai [sbom.json]
如果你想要试用 bomber,可以在 test 文件夹中找到一些测试 SBOM。
--license 这样的标志。如果你需要许可证信息,请确保在获取 SBOM 时要求提供。bomber 需要每次发送一个 PURL 来获取漏洞信息,因此在大型 SBOM 中会花费一些时间。我们会持续关注。如果你愿意为 bomber 的开发做出贡献,请参考本仓库中的 CONTRIBUTING.md 文件。贡献前请阅读 CODE_OF_CONDUCT.md 文件。
bomber 使用 Syft 在每次开发者向此仓库提交代码时生成软件物料清单(前提是使用了 [Hookz](https://github.com/devops-kung-fu/hookz)且已在工作目录中初始化)。有关 CycloneDX 的更多信息,请访问这里。
bomber 当前的 CycloneDX SBOM 可在这里获取。
感谢 bomber 的赞助商和支持者

非常感谢我们的朋友 ZERO 为 bomber 设计了标志。
感谢 Sonatype 提供了像 Sonatype OSS Index 这样强大的工具。
非常感谢我们的朋友和 bomber 贡献者 Snyk 创建了一个提供者,并编写了从 STDIN 处理 SBOM 的代码。你们太棒了。
EPSS 的描述来自 Nucleus 团队。谢谢!