
ソフトウェア部品表(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ファイルを使用するには、以下の構文を使用します。
bomber --ignore-file=bomber.ignore scan bom.json
--severityフラグを使用して深刻度レベルを設定し、特定の脆弱性の深刻度だけを返すことができます。例えば、--severity=moderateを設定すると、深刻度がMODERATE以上の脆弱性のみが返されます。
以下のコマンドは、高および致命的な脆弱性のみを返します。
bomber --severity=high scan bom.json
bomberはプロバイダーから取得した脆弱性データをエンリッチメントできます。最初に実装された「エンリッチャー」はEPSS用です。
注: EPSSスコアリングはbomber 0.5.0以上ではデフォルトではなくなりました。 EPSSスコアを表示するには、--enrich=epssフラグを使用してください。
EPSS(Exploit Prediction Scoring System)は、脆弱性が悪用される確率を予測するフレームワークです。EPSSは、優先的に対処すべき高リスクの脆弱性を特定するためによく使用されます。
EPSSは確率をパーセンテージで表します。そのため、94というスコアは、その脆弱性が94%の確率で悪用されることを示しています。当然ながら、スコア94のような脆弱性は即座に対処すべきであり、スコア20のような脆弱性は優先度を低くしても構わないということになります。
必要に応じて、2つの環境変数を設定して認証情報を保存し、コマンドラインで入力する手間を省くことができます。詳細については、このREADMEの後半にある環境変数の情報を参照してください。
CI/CDパイプラインでbomberを使用している場合、Syftと組み合わせてSBOMを生成し、脆弱性スキャンを1つのコマンドで実行できます。これを行うには、以下のようなコマンドを使用します。
# コマンドの末尾に - 文字を含めることを忘れないでください。これにより、bomberは標準入力から読み取るようになります。
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フラグを使用すると、見つかった脆弱性の最高深刻度を表す終了コードが返されます。このフラグがない場合、成功時は終了コード0、エラー発生時は1が返されます。
エラーがない場合、--exitcodeを使用すると、bomberは以下の値を返します。
| 深刻度 | リターンコード |
|---|---|
| UNSPECIFIED (プロバイダーが異常な情報、または情報を提供しないステータス) | 10 |
| LOW | 11 |
| MODERATE | 12 |
| HIGH | 13 |
| CRITICAL |
bomberには、html出力の脆弱性の説明を強化する実験的機能が含まれています。この機能は脆弱性を取得し、非技術ユーザーにとって理解しやすい説明に変更します。
注: この機能は現時点ではアルファ段階です。非常に遅く、出力の書式も整っていません。
この機能を使用するには、OpenAI APIキーを提供する必要があります。CLIで--openai-api-key={{your OpenAI API Key}}を使用してキーを渡すか、環境変数を追加します。
export OPENAI_API_KEY={{your OpenAI API Key}}
OpenAI APIキーを設定した後、以下のように出力フラグを設定できます。
bomber scan --output ai [sbom.json]
bomberを試してみたい場合は、テストフォルダにテスト用のSBOMが用意されています。
--licenseのようなフラグが必要です。ライセンス情報が必要な場合は、SBOMと一緒にリクエストするようにしてください。bomberは脆弱性情報を取得するために1つのPURLを一度に送信する必要があるため、大きなSBOMでは時間がかかります。今後も注視していきます。bomberの開発に貢献したい場合は、このリポジトリのCONTRIBUTING.mdファイルを参照してください。コントリビューションの前にCODE_OF_CONDUCT.mdファイルをお読みください。
bomberは、開発者がこのリポジトリにコードをコミットするたびに(Hookzが使用され、作業ディレクトリで初期化されている場合)、Syftを使用してソフトウェア部品表を生成します。CycloneDXの詳細については、こちらを参照してください。
現在のbomberのCycloneDX SBOMはこちらから入手できます。
bomberのスポンサーとサポーターの皆様に感謝します。

bomberのロゴを提供してくれたZEROの友人たちに大きな感謝を。
Sonatype OSS Indexのような素晴らしいツールを提供してくれたSonatypeに感謝します。
プロバイダーを作成し、標準入力からのSBOM処理をコーディングしてくれたSnykの友人たちと、bomberの共同貢献者に多大なる感謝を。皆さんは最高です。
EPSSの説明は、Nucleusのチームから提供されました。ありがとうございます。
| 14 |