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


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

本ブログでは、CPE 名を CPE のフォーマットを活用して検索する 手法として、go-cpe-dictionary と peco と sqlite3 を組み合わせた方法を説明します。
環境構築が完了すると、以下 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 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 をインストールします。

 


バージョンの確認コマンドが実行できれば、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 を指定すれば、PostgreSQL や Redis への格納も可能です。


まず、以下コマンドを実行して、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 句で vender や product の指定による絞り込みが可能です。

 

 

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

peco のインストール

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

 


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


peco による検索

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

 

 

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

 

 

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

おわりに

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

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

参考、参照