
ソフトウェア部品表(SBOM)をスキャンしてセキュリティ脆弱性を検出します

bomberは、SBOMをスキャンしてセキュリティ脆弱性を検出するアプリケーションです。
ベンダーにクローズドソース製品のソフトウェア部品表(SBOM)を依頼し、JSONファイルで提供されたとしましょう。さて、次は何をするのでしょうか?
まず最初にすべきことは、SBOMにリストされているコンポーネントにセキュリティ脆弱性がないか、そしてそれらのコンポーネントがどのようなライセンスを持っているかを確認することです。これにより、その製品を使用する際にどのようなリスクを負うことになるかを把握できます。
SBOMで特定されたコンポーネントのセキュリティ脆弱性とライセンス情報を見つけること、それがまさにbomberの目的です。bomberは、JSONまたはXMLベースのCycloneDX形式、またはJSON形式のSPDXやSyft形式のSBOMを読み取り、脆弱性の有無を迅速に通知します。
ソフトウェアは、オープンソースかクローズドソースのいずれかになります。GitHubやその他の公開ソースリポジトリで見つかるサードパーティコンポーネントはオープンソースと見なせます。厳密には、自社内で作成したソフトウェアもオープンソースです(公開はされていませんが、社内チームは閲覧可能です)。クローズドソースソフトウェアも内部利用できますが、通常は外部ベンダーから購入するソフトウェアのことです。
企業は、GitHub、Sonatype、Snykなどのベンダーが提供するSCAツールを使用して、あらゆる種類のオープンソースをスキャンし、脆弱性データを提供できます(場合によってはSBOMを生成することもできます)。しかし、現時点では可視性のないクローズドソースソフトウェアをスキャンすることはできません。ここでSBOMとbomberが役立ちます。SBOMはアクセスできないソフトウェアの構成を提供し、bomberはSBOM内に脆弱性があるかどうかを判断します。
bomberは、ベンダーから提供されたクローズドソースのSBOMをスキャンするために作成されました。オープンソースのSBOMもスキャンできます。技術的には、必要に応じてbomberをオープンソースのSCAツールとして使用することも可能です。
現在利用可能なSBOM形式は多数あります。bomberは以下の形式をサポートしています。

bomberは複数の脆弱性情報ソースをサポートしています。これらをプロバイダーと呼びます。現在、bomberはOSVをデフォルトのプロバイダーとして使用しますが、GitHub Advisory Database、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をスキャンできます。1つのフォルダに複数の形式があっても問題ありません。bomberが自動的に処理します。
デフォルトの出力は標準出力です。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はデータを3つの便利な形式で出力します。デフォルトでは、出力はコマンドラインに表示されます。より詳細なレポートが必要な場合は、--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」という形式のファイルが保存されます。このファイルをWebブラウザで開くと、以下のような出力が表示されます。

bomberは--outputフラグを使用してJSON形式で脆弱性データを出力できます。デフォルトの出力は標準出力です。JSON出力には、ターミナルに表示される情報よりもはるかに多くの情報が含まれています。パッケージの説明とその目的、脆弱性の名前、脆弱性の概要などが表示されます。

コマンド例:
bomber scan bad-bom.json --output=json > filename.json
bomberはMarkdown形式での出力もサポートしています。HTML出力と非常に似ていますが、スタイリングはGitHubなどのMarkdownレンダラーに任せます。出力は「YYYY-MM-DD-HH-MM-SS-bomber-results.md」という形式のファイルに保存されます。
コマンド例:
bomber scan bad-bom.json --output=md
必要に応じて、--ignore-fileフラグを使用して脆弱性出力で無視するCVEのリストを読み込むことができます。このリストは、以下のように無視する各CVEを1行ずつ記述する特定の形式である必要があります。
CVE-2022-31163
CVE-2022-23520
bomber.ignoreファイルの例はこちらにあります。
bomber.ignoreファイルを使用するには、以下の構文を使用します。