CPEスキャン#
CPE(Common Platform Enumeration)をFutureVulsに登録することでOSパッケージ以外の脆弱性も検知できます。 CPEについての説明は「IPAによるCPE概説」を参照してください。
CPEには、以下の2種類が定義されています。
- URI形式 (例:
cpe:/a:microsoft:internet_explorer:8.0.6001:beta
) - Formatted String形式 (例:
cpe:2.3:a:microsoft:internet_explorer:8.0.6001:beta:*:*:*:*:*:*
)
URI形式はバージョン2.2、 FormattedString形式はバージョン2.3と呼ばれています。
表示できる情報量は変わらず、表示形式に差があるのみとなっています。
FutureVulsでは、URI 形式 / FormattedString 形式どちらでも登録可能となっていますが、表示は FormattedString 形式に統一しています。
CPEスキャン機能は、OSやプログラミング言語依存のライブラリ「以外」のソフトウェアの脆弱性をスキャンできます。具体的なスキャン対象例としては以下のようなものがあります。
- Cisco、Fortinetなどのネットワーク機器のファームウェア (ex.
cpe:/o:cisco:ios:-
) - OracleやJP1などの商用データベースおよびその他の商用製品ミドルウェア
- ダウンロードしてセットアップしたもの(Tomcatなど)
- 自分でソースからコンパイルしてインストールしたもの(Apacheなど)
CPEスキャンで使用する脆弱性データベースは、NVDやJVNとなります。 これらのデータベースに登録されている製品がスキャン対象となります。
CPEスキャンの利用が非推奨な場合
以下も可能ですがCPEスキャン以外の方法をおすすめします。
- プログラミング言語ライブラリは「アプリケーションスキャン」の利用が楽です
- OSの脆弱性のCPEスキャンは誤検知が発生するため、スキャナ経由によるスキャンを推奨します。詳細は「OSパッケージのCPE登録」のマニュアルを参照してください。
Deprecated な CPE
CPEには、非推奨とされた(Deprecated)バージョンが存在します。 DeprecatedなCPEの詳細は「Understanding Vulnerability Detail Pages」をご覧ください。 登録されているCPEがNVD上で非推奨とされた場合、ソフトウェア詳細画面で注意喚起されます。
DeprecatedなCPEの脆弱性は今後検知されません。 Deprecatedと判定される前に検知された脆弱性は、引き続き保持されますが、新たな検知は行いません。 正しいCPEをNVDで確認し、「CPEを更新する」より更新してください。
CPEスキャンの脆弱性DB#
NVDをメインの脆弱性DBとして利用します。
JVNにしか定義されていない和製ソフトウェアも検知可能ですが、誤検知の可能性があります。 詳細は「和製ソフトウェアの脆弱性をJVNで検知する」を参照してください。
CPEスキャンの処理詳細#
CPEスキャンの検知処理の詳細を図示します。
CPEを登録する#
CPEは サーバ
> ソフトウェア
> CPE追加
から登録できます。
現在、CPEの登録方法は6種類あります。
CPEを登録しただけでは脆弱性検知されません。CPEを紐づけたサーバがスキャンされたタイミングで検知処理が実行されます。
ネットワーク機器を CPE 登録する場合には、種別 {h=ハードウェア} ではなく {o=OS} に該当する情報を登録してください。
1. プルダウンで選択して登録する#
part や vendor などをプルダウンで選択して CPE を登録します。
候補としてプルダウンに現れる CPE は NVD と JVN のデータベースから取得しています。 プルダウンから候補が見つからない場合、手入力での登録も可能です。
登録したい CPE が検索結果に出てこない場合
deprecatedなCPEはCPE検索では取得されません。
登録したいCPEやバージョン情報が検索しても出てこない場合は、次のFAQも参考にしてください。 登録したいCPEが検索しても出てこないのはなぜですか
なお、「脆弱性をJVNで検知する」のチェックボックスを押下すると、NVDのCPE検索ページへのリンクが表示されます。
リンクを押下することで、NVDに該当のCPEが存在するかを、バージョン情報込みで確認することが出来ます。
2. URI形式、またはFormattedString形式で登録する#
CPEの形式がわかっている場合は、CPE名称を貼り付けて登録できます。
3. OWASP Dependency Checkのxmlから複数登録する#
「OWASP Dependency Check」を利用している場合、出力されたxmlを使用し、検知したライブラリを一括で登録できます。
信頼度が低いCPEはあらためて確認の上で登録してください。
4. フリーテキストで複数登録する#
登録したいCPEが複数ある場合、フリーテキストで貼り付けて登録できます。
5. REST APIで登録する#
REST APIで自作プログラムからCPEを登録可能です。詳細は「ドキュメント」を参照してください。
6. ネットワーク機器をコマンドで登録する#
ネットワーク機器で使われているソフトウェアのCPEを取得してから登録するまで、コマンドを用いて各ネットワークごとに一括で行うことができます。またcron等を用いて定期的に実行させることをおすすめします。 コマンドの詳細な使い方は「README」も参考にしてください。
使用するコマンドは2つあります。
-
future-vuls discover
-
future-vuls add-cpe
順番に実行していくことでネットワーク単位でのCPE情報を管理できます。
コマンドのインストール手順#
「releases」から future-vuls
と snmp2cpe
のバイナリをダウンロードします。
future-vuls
を実行する際は snmp2cpe
のバイナリと同じディレクトリの階層に配置してください。
コマンドの説明と使用方法#
future-vuls discover
#
CIDRレンジで指定したネットワーク内のホストを探査して応答があったホストに対してsnmp2cpeを実行しCPEを取得できたホストをtomlファイルにリストアップします。
次回実行時には新しいホストを差分として追記します。
この際、古いファイルはタイムスタンプをつけてリネームされます。
snmp2cpe
については「README」を参照してください。
このコマンドの実行にはCIDRレンジの指定が必須です。 列挙されたホストの中で、CPE情報を FutureVuls に登録したいもののfvuls_syncの値をtrueに書き換えます。
#コマンドのヘルプ
./future-vuls discover -h
discover hosts with CIDR range. Run snmp2cpe on active host to get CPE. Default outputFile is ./discover_list.toml
Usage:
future-vuls discover --cidr <CIDR_RANGE> --output <OUTPUT_FILE> [flags]
Examples:
future-vuls discover --cidr 192.168.0.0/24 --output discover_list.toml
Flags:
--cidr string cidr range
--community string snmp community name. default: public
-h, --help help for discover
--output string output file
--snmp-version string snmp version v1,v2c and v3. default: v2c
#使用例
./future-vuls discover --cidr 192.168.0.1/24
Discovering 192.168.0.1/24...
192.168.0.1: Execute snmp2cpe...
failed to execute snmp2cpe. err: failed to execute snmp2cpe. err: exit status 1
192.168.0.2: Execute snmp2cpe...
failed to execute snmp2cpe. err: failed to execute snmp2cpe. err: exit status 1
192.168.0.4: Execute snmp2cpe...
failed to execute snmp2cpe. err: failed to execute snmp2cpe. err: exit status 1
192.168.0.6: Execute snmp2cpe...
New network device found 192.168.0.6
wrote to discover_list.toml
#生成されるtomlファイルの例
["192.168.0.6"]
ip = "192.168.0.10"
server_name = "192.168.0.6"
uuid = ""
cpe_uri = ["cpe:2.3:h:fortinet:fortigate-50e:-:*:*:*:*:*:*:*","cpe:2.3:o:fortinet:fortios:5.4.6:*:*:*:*:*:*:*"]
fvuls_sync = false
future-vuls add-cpe
#
fvuls_syncがtrueになっているホストを FutureVuls に擬似サーバとして登録し、 UUID を取得します。 擬似サーバの登録名は server_name を変更することで変えることができます。 登録されているサーバ名と server_name が異なる場合は、登録されているサーバ名が優先され、コマンド実行時に自動的に変更されます。 その後tomlファイルのcpe_uriを FutureVuls の擬似サーバに CPE として登録します。 このコマンドの実行には FutureVuls RESTAPI のトークンが必須です。 トークンの取得方法については「FutureVuls API」を参照してください。
#コマンドのヘルプ
./future-vuls add-cpe -h
Create a pseudo server in Fvuls and register CPE. Default outputFile is ./discover_list.toml
Usage:
future-vuls add-cpe --token <VULS_TOKEN> --output <OUTPUT_FILE> [flags]
Examples:
future-vuls add-cpe --token <VULS_TOKEN>
Flags:
-h, --help help for add-cpe
--http-proxy string proxy url
--output string output file
-t, --token string future vuls token ENV: VULS_TOKEN
#使用例
$ ./future-vuls add-cpe --token xxxx-xxxxxx-xxxx-xxxx-xxxx-xxxxxx
Creating 1 pseudo server...
192.168.0.6: Created FutureVuls pseudo server ce024b45-1c59-5b86-1a67-e78a40dfec01
wrote to discover_list.toml
Uploading 1 server's CPE...
192.168.0.6: Uploaded CPE cpe:2.3:h:fortinet:fortigate-50e:-:*:*:*:*:*:*:*
192.168.0.6: Uploaded CPE cpe:2.3:o:fortinet:fortios:5.4.6:*:*:*:*:*:*:*
# 生成されるtomlファイルの例
["192.168.0.6"]
ip = "192.168.0.6"
server_name = "192.168.0.6"
uuid = "ce024b45-1c59-5b86-1a67-e78a40dfec01"
cpe_uri = ["cpe:2.3:h:fortinet:fortigate-50e:-:*:*:*:*:*:*:*", "cpe:2.3:o:fortinet:fortios:5.4.6:*:*:*:*:*:*:*"]
fvuls_sync = true
擬似サーバ#
たとえば、ネットワーク機器のファームウェアをCPEスキャンしたい場合、実体のない空のサーバとして 擬似サーバ
を追加し、CPEを登録できます。
擬似サーバはサーバ一覧の サーバ追加
から作成できます。作成後は通常のサーバ同様にソフトウェアからCPEを登録できます。
擬似サーバもスキャンサーバと同様に1つのサーバとして料金計算されますのでご了承ください。
CPE登録後画面上からスキャンを実行し脆弱性を確認できます。 擬似サーバは日次で自動スキャンされる他、手動でスキャンできます。
CPEスキャンのタイミング#
CPEスキャンのタイミングは擬似サーバとそれ以外で異なります。
通常サーバの場合は以下のタイミングで、通常サーバに紐付けたCPEの脆弱性が検知されます。
- 画面上で手動スキャンを実行する
- スキャナからのアップロードのタイミング
擬似サーバの場合は以下です。
- 画面上で手動スキャンを実行する
- 日次の自動スキャンのタイミング
スキャンした時刻は「グループ設定>スキャン履歴」に記載されています。
CPEを更新する#
一度登録したCPEは画面から更新できます。
CPEを更新する事で、通常のパッケージ管理同様にタスクのステータスを管理できます。
CPE以外の更新は、プルダウンから選択またはCPENameで指定できます。 プルダウンは該当する値がなくても、手動で入力することにより登録できます。
運用例
- Drupal 3.8をFutureVulsで管理するために、
cpe:/a:drupal:drupal:3.8
を登録する。 - 手動スキャンを実行し脆弱性を確認する。
- 対応が必要な脆弱性に対して、タスクの担当者、対応予定、優先度等を設定する。
- 実機のdrupalのバージョンを4.0にアップデートする。
- FutureVulsのCPE (cpe:/a:drupal:drupal:3.8) を選択し、アップデートボタンをクリックし、バージョンを4.0に変更する。
- 再度手動スキャンを実行し、脆弱性が解消されているかを確認する。
あくまでCPEのバージョン以下をアップデートする作業であるため、Part・Vendor・Productは変更できません。
CPEを削除する#
登録したCPEは詳細画面やソフトウェア一覧から削除できます。
CPEを削除すると、関連するタスクと脆弱性もすべて削除されます。 (削除したCPE以外にも紐付いているタスク、脆弱性は削除されません)
CPEを割り当てる#
「Windows」かつ「実スキャナで登録されたサーバ」でのみ、CPEを割り当てることができます。
詳細は「割り当て方法」を参照してください。
和製ソフトウェアの脆弱性をJVNで検知する#
和製ソフトウェアはCPE登録・変更時に、「和製ソフトウェアの脆弱性をJVNで検知する」チェック(※以下、JVNチェックと記載) を選択してください。 日本向けの製品のような、「NVDに含まれないがJVNには脆弱性情報が登録されている和製ソフトウェア」の脆弱性を検知できるようになります。
JVNの検知処理はバージョン情報のレンジ比較が出来ないため、定義されたCPEの Part
, Vendor
, Product
に該当する全件が検知されることに注意してください。
つまりJVNでの検知は、バージョン情報を考慮しないため誤検知する可能性があります。
JVNチェックの、ON/OFFのときのスキャンの流れについて、cpe:/a:apache:tomcat:9.0.8
を例に説明します。
「JVNチェックOFF」の場合はNVDのみを参照します。
「NVD: CVE-2021-1745」をみるとtomcatは対象ではないので検知されません。一方「JVNチェックON」の場合はNVDに加えて「JVNの情報」も参照します。
JVNのページにはtomcatが影響すると記載されています。
JVNでの検知はバージョン情報が記載されていないので cpe:/a:apache:tomcat
の部分のみで判断され CVE-2020-1745
を検知します。
詳細は「CPEスキャンのフローチャート」も参照してください。
バージョンを考慮せずに検知するため、「JVNチェックをON」にすると誤検知する可能性が高くなります。 よってCPE登録前にNVDとJVNを確認し、NVDに存在しない、かつJVNに存在する和製ソフトウェアの場合のみ「JVNチェックをON」にすることをおすすめします(参考)。
なお、信頼度の詳細な説明や、信頼度の低い脆弱性への対応方法については、「信頼度」を参照してください。