devops-kung-fu/bomber
GitHub: devops-kung-fu/bomber
bomber 是一个用于扫描软件物料清单(SBOM)中安全漏洞与许可证风险的命令行工具。
Stars: 608 | Forks: 55

[](CONTRIBUTING.md)

[](https://goreportcard.com/report/github.com/devops-kung-fu/bomber)
[](https://bestpractices.coreinfrastructure.org/projects/6409)
[](https://codecov.io/gh/devops-kung-fu/bomber)
`bomber` is an application that scans SBOMs for security vulnerabilities.
## 概述
所以你向供应商询问某个闭源产品的软件物料清单(SBOM),他们提供了一个 JSON 文件……现在该怎么办?
首先,你需要查看 SBOM 中列出的组件是否存在安全漏洞,以及这些组件的许可证类型。这将帮助你识别使用该产品会带来何种风险。
查找 SBOM 中组件的安全漏洞和许可证信息正是 `bomber` 的用途。`bomber` 可以读取任何基于 JSON 或 XML 的 [CycloneDX](https://cyclonedx.org) 格式,或 JSON [SPDX](https://spdx.dev) 或 [Syft](https://github.com/anchore/syft) 格式的 SBOM,并快速告诉你是否存在漏洞。
## 目录
- [开源与闭源](#open-vs-closed-source)
- [用途](#purpose)
- [支持的 SBOM 格式](#supported-sbom-formats)
- [提供者](#providers)
- [提供者支持](#provider-support)
- [提供者文档](#provider-documentation)
- [安装](#installation)
- [Mac](#mac)
- [Linux](#linux)
- [使用 bomber](#using-bomber)
- [单个 SBOM 扫描](#single-sbom-scan)
- [整个文件夹扫描](#entire-folder-scan)
- [输出格式](#output-formats)
- [HTML 输出](#html-output)
- [JSON 输出](#json-output)
- [Markdown 输出](#markdown-output)
- [忽略漏洞](#ignoring-vulnerabilities)
- [过滤输出](#filtering-output)
- [数据丰富](#data-enrichment)
- [漏洞利用预测评分系统(EPSS)](#exploit-prediction-scoring-system-epss)
- [高级功能](#advanced-stuff)
- [从 STDIN 扫描 SBOM](#scanning-sboms-from-stdin)
- [环境变量](#environment-variables)
- [实验性功能](#experimental-features)
- [最高严重性返回代码(实验性)](#highest-severity-return-codes-experimental)
- [OpenAI AI 增强 HTML 报告输出](#openai-ai-enriched-html-report-output)
- [折腾一下](#messing-around)
- [说明](#notes)
- [贡献](#contributing)
- [软件物料清单](#software-bill-of-materials)
- [赞助商](#sponsors)
- [致谢](#credits)
### 开源与闭源
软件可以是开源或闭源。你可以在 GitHub 或任何公共源代码仓库查看第三方组件作为开源。技术上,你自己在公司内部创建的软件也是开源的——它不是公开的,但你的内部团队可以看到它。闭源软件也可能是内部的,但通常这是你从外部供应商购买的软件。
公司可以使用 GitHub、Sonatype、Snyk 等供应商提供的 SCA 工具来扫描任何类型的开源软件并提供漏洞数据——在某些情况下甚至可以生成 SBOM。他们无法(尚未……)扫描你无法访问的闭源软件。这就是 SBOM 和 `bomber` 发挥作用的地方。SBOM 提供你无法访问的软件组成,而 `bomber` 则会判断 SBOM 中的内容是否存在漏洞。
### 用途
我们创建 `bomber` 是为了扫描供应商在收到时提供的闭源 SBOM。它也可以扫描开源 SBOM,理论上你可以用 `bomber` 作为一个开源 SCA 工具。
### 支持的 SBOM 格式
目前有多种 SBOM 格式可用。`bomber` 支持以下格式:
- [SPDX](https://spdx.dev)
- [CycloneDX](https://cyclonedx.org)
- [Syft](https://github.com/anchore/syft)
## 提供者

`bomber` 支持多个漏洞信息来源。我们称之为 _提供者(Providers)_。目前,`bomber` 使用 [OSV](doc/providers/osv.md) 作为 _默认_ 提供者,但你也可以使用 [Github Advisory Database](docs/providers/github.md)、[Sonatype OSS Index](doc/providers/ossindex.md) 或 [Snyk](doc/providers/snyk.md)。
需要注意的是,[OSV](doc/providers/osv.md) 是免费的,使用时无需任何凭证;[Sonatype OSS Index](doc/providers/ossindex.md) 是免费的,但需要你注册并获取令牌;而 [Snyk](doc/providers/snyk.md) 支持需要 Snyk 许可证。
除了从提供者收集的数据,`bomber` 还会 [丰富(Enrich)](#data-enrichment) 漏洞数据,加入利用概率等额外信息。
### 提供者支持
请注意,_每个提供者支持不同的生态系统_,因此如果你在一种提供者下没有看到任何漏洞,可以尝试另一种。生态系统只是指包管理器或包类型,例如 rpm、npm、gems 等。需要理解的一点是,每个提供者可能会报告不同的漏洞。如果不确定,可以查看多个提供者的结果。
如果 `bomber` 没有找到任何漏洞,并不意味着不存在漏洞。这可能只是当前使用的提供者未检测到,或者不支持该生态系统。有些提供者返回的漏洞没有严重性信息。在这种情况下,严重性会显示为“UNDEFINED”。
### 提供者文档
`bomber` 的提供者文档如下:
- [OSV](doc/providers/osv.md)
- [GitHub Advisory Database](doc/providers/github.md)
- [OSSINDEX](doc/providers/ossindex.md)
- [Snyk](doc/providers/snyk.md)
## 安装
### Mac
你可以使用 [Homebrew](https://brew.sh) 安装 `bomber`,命令如下:
```
brew tap devops-kung-fu/homebrew-tap
brew install devops-kung-fu/homebrew-tap/bomber
```
如果你没有 Homebrew,仍然可以 [下载最新版本](https://github.com/devops-kung-fu/bomber/releases)(例如 `bomber_0.4.1_darwin_all.tar.gz`),解压后直接使用 `bomber` 二进制文件。
如果需要,可以将 `bomber` 二进制文件移动到 `/usr/local/bin` 或任何在 PATH 中的目录。
### Linux
要安装 `bomber`,[下载适用于你平台的最新版本](https://github.com/devops-kung-fu/bomber/releases) 并在本地安装。例如,在 Ubuntu 上安装 `bomber`:
```
dpkg -i bomber_0.5.0_linux_arm64.deb
```
## 使用 bomber
你可以扫描整个 SBOM 文件夹或单个 SBOM 文件,命令为 `bomber`。`bomber` 不关心你是否在一个文件夹中包含多种格式,它会自动帮你处理。
注意,默认情况下 `bomber` 的输出是打印到标准输出。HTML 或 JSON 格式的输出选项在本文档后面有说明。
### 单个 SBOM 扫描
```
# 使用默认提供程序 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 格式的增强报告,使用 `--output=json` 标志输出 JSON 格式。使用逗号分隔多个输出格式,例如 `--output=html,stdout,json`。
### HTML 输出
如果你希望生成包含详细漏洞信息的可读报告,可以使用 `--output` 标志将报告保存为 HTML 文件。
示例命令:
```
bomber scan bad-bom.json --output=html
```
这会在当前文件夹中生成一个名为“YYYY-MM-DD-HH-MM-SS-bomber-results.html”的文件。如果用浏览器打开该文件,你会看到类似以下的输出:

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

示例命令:
```
bomber scan bad-bom.json --output=json > filename.json
```
### Markdown 输出
`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-2022-31163
CVE-2022-23520
```
示例 `bomber.ignore` 文件 [在此](./_TESTDATA_/ignore/bomber.ignore)。
使用该 `bomber.ignore` 文件的语法如下:
```
bomber --ignore-file=bomber.ignore scan bom.json
```
## 过滤输出
你可以通过 `--severity` 标志设置严重性级别,以仅返回特定严重性的漏洞。例如,如果你设置 `--severity=moderate`,只会返回严重性为 `MODERATE` 或更高的漏洞。
例如,以下命令只会返回高危和严重漏洞:
```
bomber --severity=high scan bom.json
```
## 数据丰富
`bomber` 具备丰富漏洞数据的能力,可以从 [提供者](#providers) 获取的数据基础上进行增强。我们已实现的第一个增强功能是针对 [EPSS](https://www.first.org/epss/) 的。
**注意:** 从 `bomber 0.5.0` 开始,EPSS 评分不再默认为启用状态。要显示 EPSS 分数,请务必使用 `--enrich=epss` 标志。
### 漏洞利用预测评分系统(EPSS)
[EPSS](https://www.first.org/epss/) 代表漏洞利用预测评分系统,是一种预测漏洞被利用概率的框架。[EPSS](https://www.first.org/epss/) 常用于识别高风险漏洞并优先进行修复。
[EPSS](https://www.first.org/epss/) 使用百分比表示概率。因此,如果你看到 94,意味着该漏洞有 94% 的被利用概率。逻辑上,评分越高(如 94),越需要立即关注;评分较低(如 20),则可以降低优先级。
## 高级功能
如果你愿意,可以设置两个环境变量来存储凭证,而无需在命令行中输入。查看后面的 [环境变量](####Environment-Variables) 说明。
### 从 STDIN 扫描 SBOM
如果你在 CI/CD 流水线中使用 `bomber`,可以一次性完成生成和扫描 SBOM 的操作。方法如下:
```
# 确保在命令末尾包含 - 字符,这会触发 bomber 从 STDIN 读取
syft packages . -o cyclonedx-json | bomber scan --provider ossindex --output json -
```
该命令会创建一个 SBOM,将其通过管道传递给 `bomber`,并以 JSON 格式输出结果。
### 环境变量
如果你不想每次都输入凭证,可以将以下内容添加到 `.bashrc` 或 `.bash_profile`:
```
export BOMBER_PROVIDER_USERNAME={{your OSS Index user name}}
export BOMBER_PROVIDER_TOKEN={{your OSS Index API Token}}
```
## 实验性功能
### 最高严重性返回代码(实验性)
使用 `--exitcode` 标志时,`bomber` 会返回一个代表最高漏洞严重性的退出码。不使用该标志时,成功返回 `0`,遇到错误返回 `1`。
在不发生错误的情况下,`bomber` 在使用 `--exitcode` 时会返回以下值:
| 严重性 | 返回代码 |
| ------ | -------- |
| UNSPECIFIED(提供者返回异常或无信息) | 10 |
| LOW | 11 |
| MODERATE | 12 |
| HIGH | 13 |
| CRITICAL | 14 |
### OpenAI AI 增强 HTML 报告输出
`bomber` 现在包含一个实验性功能,可以在 `html` 输出中增强漏洞描述。该功能会将漏洞描述转换为更适合非技术人员理解的表述。
**注意:** 该功能目前处于早期 alpha 阶段,运行速度较慢,且输出格式不够完善。
要使用此功能,你需要提供 OpenAI API 密钥。可以通过以下方式之一传递密钥:
- 在 CLI 中使用 `--openai-api-key={{你的 OpenAI API 密钥}}`
- 或设置环境变量:
```
export OPENAI_API_KEY={{your OpenAI API Key}}
```
设置好 OpenAI API 密钥后,可以按如下方式设置输出标志:
```
bomber scan --output ai [sbom.json]
```
## 折腾一下
如果你想测试 `bomber`,可以在 [test](_TESTDATA_/sbom/) 文件夹中找到一些示例 SBOM 文件。
## 说明
- SBOM 中包含许可证信息的情况较为少见。大多数生成工具(如 Syft)需要添加类似 `--license` 的标志才能获取许可证信息。如果需要许可证信息,请确保在生成 SBOM 时请求该信息。
- OSV 很不错,但 API 行为也有些古怪。它们提供了批量查询端点,理论上可以加快查询速度,但目前尚未按预期工作。`bomber` 需要逐个 PURL 发送请求以获取漏洞信息,因此在大型 SBOM 中会花费一些时间。我们会持续关注这个问题。
## 贡献
如果你希望为 `bomber` 的开发做出贡献,请参考仓库中的 [CONTRIBUTING.md](CONTRIBUTING.md) 文件。在贡献前,请阅读 [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)。
## 软件物料清单
`bomber` 每次有开发者向本仓库提交代码时,都会使用 Syft 生成软件物料清单(前提是启用了 [Hookz](https://github.com/devops-kung-fu/hookz) 并已在工作目录中初始化)。更多关于 CycloneDX 的信息请参考[这里](https://cyclonedx.org)。
当前 `bomber` 的 CycloneDX SBOM 可在此处获取:[链接](./sbom/bomber.cyclonedx.json)。
## 赞助商
感谢 `bomber` 的赞助商和支持者

## 致谢
特别感谢我们的朋友 [ZERO](https://zero.health) 提供的 `bomber` 标志。
感谢 [Sonatype](https://sonatype.com) 提供像 [Sonatype OSS Index](https://ossindex.sonatype.org) 这样强大的工具。
非常感谢我们的朋友和同事 [Snyk](https://snyk.io) 创建了一个提供者并实现了从 STDIN 处理 SBOM 的功能。你们太棒了。
EPSS 描述来自 [Nucleus](https://nucleussec.com/blog/what-is-epss/) 团队。感谢你们!
标签:CycloneDX, DevSecOps, EVTX分析, Go语言, SBOM, SPDX, Syft, 上游代理, 云安全监控, 安全风险评估, 开源框架, 持续集成, 日志审计, 硬件无关, 程序破解, 组件分析, 许可证合规, 跌倒检测, 软件物料清单, 静态分析