![]()
はじめに
FutureVuls では、 vuls によるサーバスキャンや trivy によるコンテナイメージスキャンはもちろんのこと、Amazon Inspector( EC2 / ECR / Lambda )や SBOM の取り込みにも対応しています。より詳細な対応状況は、こちらの「スキャン方法の選択肢と特徴 と 対応環境」をご確認ください!
特定のソフトウェアや、ネットワーク機器を含めたハードウェアの脆弱性を管理する手法としては、 CPE(Common Platform Enumeration) を用いた CPE スキャン という機能を提供しています。
「CPE スキャン」の利用にあたり、登録したいソフトウェア・ハードウェアの「CPE 名」を特定する必要があります。
CPE 名の一覧は、NVD の「Official Common Platform Enumeration (CPE) Dictionary」で配信されています。同サイトの「Search Common Platform Enumerations (CPE)」により Vendor や Product による検索も可能です。
FutureVuls には「CPE 検索」という Vendor、Product から CPE 候補を検索する機能が備わっています。
本ブログでは、CPE 名を CPE のフォーマットを活用して検索する 手法として、go-cpe-dictionary と peco と sqlite3 を組み合わせた方法を説明します。
環境構築が完了すると、以下 GIF のようにアクティブな CPE 名の検索が可能となります。

動作環境
本ブログの内容は、Ubuntu 22.04 にて実施しました。
1 |
$ cat /etc/os-release |
CPE 辞書のダウンロードと検索には、以下のツールを利用します。
| 利用ツール | バージョン |
|---|---|
| go-cpe-dictionary | 0.6.0 |
| peco | 0.5.10 |
| sqlite3 | 3.37.2 |
全体像

本ブログの大まかな流れを、以下の表に整理しました。
| 操作順番 | 一言で表すと | 作業内容 |
|---|---|---|
| ① | execute | go-cpe-dictionary をインストールする |
| ② | fetch | go-cpe-dictionary により CPE 辞書をダウンロードする |
| ③ | insert | ダウンロードした CPE 辞書を、データベースに格納する |
| ④ | select | データベースから CPE 辞書を取得する |
| ⑤ | search | sqlite と peco をインストールして、CPE 辞書をアクティブに検索する |
CPE 辞書の取得
CPE 検索のために、まずは NVD・JVN から CPE 辞書をダウンロードします。
CPE 辞書の保存先として、go-cpe-dictionary は以下の DB が利用可能です。
- SQLite(デフォルト)
- MySQL
- PostgreSQL
- Redis
本ブログでは、SQLite を用いて CPE 辞書を検索する方法を扱います。
go-cpe-dictionary のインストール
まず、CPE 辞書の「ダウンロード」に利用する go-cpe-dictionary をインストールします。
以降は、ブログ執筆時点で最新の「v0.6.0」を対象としたインストールコマンドを記載します。
以下のコマンドにより go-cpe-dictionary をインストールします。
1 |
# 作業ディレクトリを作成する |
バージョンの確認コマンドが実行できれば、go-cpe-dictionary のインストールは完了です。
通常のコマンドと同様のため、$PATH 配下に配置する( mv または cp する)ことで、任意のディレクトリでコマンドを実行できるようになります。
1 |
# $PATH が設定済みのディレクトリ一覧を確認する |
go-cpe-dictionary で実行可能なオプションは --help により確認できます。
本ブログでは fetch を利用して、CPE 辞書を取得します。
go-cpe-dictionary --help
1 |
$ go-cpe-dictionary --help |
go-cpe-dictionary fetch --help
1 |
$ go-cpe-dictionary fetch --help |
CPE 辞書をダウンロードする
go-cpe-dictionary を用いて、CPE 辞書をダウンロードする方法を説明します。
SQLite のフォーマットで出力する
go-cpe-dictionary はダウンロードした CPE 辞書を SQLite のフォーマットで出力します。
※ --dbpath、--dbtype を指定すれば、PostgreSQL や Redis への格納も可能です。
まず、以下コマンドを実行して、NVD・JVN が配信する CPE 辞書をダウンロードします。
go-cpe-dictionary fetch nvd
1 |
# 作業ディレクトリを作成して移動する |
go-cpe-dictionary fetch jvn
1 |
# JVN から CPE 辞書を取得する |
本ブログ執筆時点では、NVD と JVN の CPE 辞書を合算すると、データサイズは 540MB となりました。
1 |
# データサイズを確認する |
CPE 辞書のデータは、以下のテーブル定義で格納されています。
categorized_cpesのスキーマ
| Column Name | Type |
|---|---|
| id | integer |
| fetch_type | varchar(3) |
| title | text |
| cpe_uri | varchar(255) |
| cpe_fs | varchar(255) |
| part | varchar(255) |
| vendor | varchar(255) |
| product | varchar(255) |
| version | varchar(255) |
| update | varchar(255) |
| edition | varchar(255) |
| language | varchar(255) |
| software_edition | varchar(255) |
| target_software | varchar(255) |
| target_hardware | varchar(255) |
| other | varchar(255) |
| deprecated | numeric |
sqlite3 コマンドを使うことで、Query による検索が可能です。
Linux環境であれば、以下コマンドにより sqlite3 をインストールします。
1 |
# RedHat 系 |
sqlite3 により、go-cpe-dictionary が出力した cpe.sqlite3 への SQL 実行が可能です。
1 |
# 取得した CPE 名の総数を集計する |
以上で、CPE 辞書のダウンロードと検索環境の構築は完了です。
CPE 辞書に対して、sqlite3 コマンド経由で任意の Query を実施できるようになりました。
CPE 辞書をインタラクティブに検索する
ここまでの環境構築により、NVD とJVN からCPE 辞書を取得する作業は完了しています。
CPE 名に目途がついている場合には、Query 検索時の Where 句で vender や product の指定による絞り込みが可能です。
1 |
# "vendoer" 名が "amazon" に完全一致するレコードの検索例 |
ここでは、CPE をインタラクティブに探す方法として「peco」を用いた手法を紹介します。
peco のインストール
Linux 環境の場合は、以下のコマンドにより peco をインストールします。
1 |
# RedHat 系 |
peco は標準入力でリストを受け取ります。
以下のコマンドにより peco の動きを確認してください。
1 |
# コマンド実行履歴を peco に渡す |
peco による検索
sqlite3 で CPE 名を取得し、パイプラインで peco に渡すことで、CPE 名のインタラクティブな検索ができます。
1 |
$ sqlite3 ./cpe.sqlite3 'select cpe_uri from categorized_cpes' | peco |
検索したい文字列を >QUERY に入力すると、その文字列によりフィルタされたリストが表示されます。
例えば amazon で検索した場合には、以下のリストが表示されます。
1 |
QUERY> amazon IgnoreCase [8864 (1/329)] |
peco の出力内容を確認しながら「検索文字」を変えることにより、文字列のフィルタが自動更新されて、CPE 名のインタラクティブな探索が可能となります。
おわりに
本ブログでは、以下の手法による「インタラクティブな CPE 名の検索方法」を紹介しました。
go-cpe-dictionaryにより、CPE 辞書をローカルにダウンロードする方法peco+sqlite3により、CPE 辞書をインタラクティブに検索する方法