FutureVuls Blog

FutureVuls に登録する製品の CPE 名を、ちょっとだけ便利に検索する | FutureVuls Blog

作成者: 棚井龍之介|Jun 5, 2024 7:15:00 PM

はじめに

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)」により VendorProduct による検索も可能です。


FutureVuls には「CPE 検索」という VendorProduct から CPE 候補を検索する機能が備わっています。

本ブログでは、CPE 名を CPE のフォーマットを活用して検索する 手法として、go-cpe-dictionarypecosqlite3 を組み合わせた方法を説明します。
環境構築が完了すると、以下 GIF のようにアクティブな CPE 名の検索が可能となります。

動作環境

本ブログの内容は、Ubuntu 22.04 にて実施しました。


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 sqlitepeco をインストールして、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 をインストールします。


バージョンの確認コマンドが実行できれば、go-cpe-dictionary のインストールは完了です。
通常のコマンドと同様のため、$PATH 配下に配置する( mv または cp する)ことで、任意のディレクトリでコマンドを実行できるようになります。


go-cpe-dictionary で実行可能なオプションは --help により確認できます。
本ブログでは fetch を利用して、CPE 辞書を取得します。

  • go-cpe-dictionary --help

  • go-cpe-dictionary fetch --help

CPE 辞書をダウンロードする

go-cpe-dictionary を用いて、CPE 辞書をダウンロードする方法を説明します。

SQLite のフォーマットで出力する

go-cpe-dictionary はダウンロードした CPE 辞書を SQLite のフォーマットで出力します。
--dbpath--dbtype を指定すれば、PostgreSQLRedis への格納も可能です。


まず、以下コマンドを実行して、NVD・JVN が配信する CPE 辞書をダウンロードします。

  • go-cpe-dictionary fetch nvd

  • go-cpe-dictionary fetch jvn

本ブログ執筆時点では、NVD と JVN の CPE 辞書を合算すると、データサイズは 540MB となりました。


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 をインストールします。


sqlite3 により、go-cpe-dictionary が出力した cpe.sqlite3 への SQL 実行が可能です。


以上で、CPE 辞書のダウンロードと検索環境の構築は完了です。
CPE 辞書に対して、sqlite3 コマンド経由で任意の Query を実施できるようになりました。

CPE 辞書をインタラクティブに検索する

ここまでの環境構築により、NVD とJVN からCPE 辞書を取得する作業は完了しています。

CPE 名に目途がついている場合には、Query 検索時の Where 句で venderproduct の指定による絞り込みが可能です。


ここでは、CPE をインタラクティブに探す方法として「peco」を用いた手法を紹介します。

peco のインストール

Linux 環境の場合は、以下のコマンドにより peco をインストールします。


peco は標準入力でリストを受け取ります。
以下のコマンドにより peco の動きを確認してください。


peco による検索

sqlite3 で CPE 名を取得し、パイプラインで peco に渡すことで、CPE 名のインタラクティブな検索ができます。


検索したい文字列を >QUERY に入力すると、その文字列によりフィルタされたリストが表示されます。
例えば amazon で検索した場合には、以下のリストが表示されます。


peco の出力内容を確認しながら「検索文字」を変えることにより、文字列のフィルタが自動更新されて、CPE 名のインタラクティブな探索が可能となります。

おわりに

本ブログでは、以下の手法による「インタラクティブな CPE 名の検索方法」を紹介しました。

  • go-cpe-dictionary により、CPE 辞書をローカルにダウンロードする方法
  • peco + sqlite3 により、CPE 辞書をインタラクティブに検索する方法

参考、参照