コンテンツにスキップ

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の脆弱性は今後検知されません。 Deprecatedと判定される前に検知された脆弱性は、引き続き保持されますが、新たな検知は行いません。 正しいCPEをNVDで確認し、「CPEを更新する」より更新してください。

CPEスキャンの脆弱性DB#

NVDをメインの脆弱性DBとして利用します。

JVNにしか定義されていない和製ソフトウェアも検知可能ですが、誤検知の可能性があります。 詳細は「和製ソフトウェアの脆弱性をJVNで検知する」を参照してください。

CPEスキャンの処理詳細#

CPEスキャンの検知処理の詳細を図示します。

image

CPEを登録する#

CPEは サーバ > ソフトウェア > CPE追加 から登録できます。

現在、CPEの登録方法は6種類あります。

image

CPEを登録しただけでは脆弱性検知されません。CPEを紐づけたサーバがスキャンされたタイミングで検知処理が実行されます。

ネットワーク機器を CPE 登録する場合には、種別 {h=ハードウェア} ではなく {o=OS} に該当する情報を登録してください。

CPE登録したネットワーク機器の脆弱性が検知されない

1. プルダウンで選択して登録する#

part や vendor などをプルダウンで選択して CPE を登録します。

候補としてプルダウンに現れる CPE は NVD と JVN のデータベースから取得しています。 プルダウンから候補が見つからない場合、手入力での登録も可能です。

cpe_version

登録したい CPE が検索結果に出てこない場合

deprecatedなCPEはCPE検索では取得されません。

登録したいCPEやバージョン情報が検索しても出てこない場合は、次のFAQも参考にしてください。 登録したいCPEが検索しても出てこないのはなぜですか

なお、「脆弱性をJVNで検知する」のチェックボックスを押下すると、NVDのCPE検索ページへのリンクが表示されます。

CPE追加ダイアログ

リンクを押下することで、NVDに該当のCPEが存在するかを、バージョン情報込みで確認することが出来ます。

NVDのCPE検索ページ

2. URI形式、またはFormattedString形式で登録する#

CPEの形式がわかっている場合は、CPE名称を貼り付けて登録できます。

image.png

3. OWASP Dependency Checkのxmlから複数登録する#

OWASP Dependency Check」を利用している場合、出力されたxmlを使用し、検知したライブラリを一括で登録できます。

信頼度が低いCPEはあらためて確認の上で登録してください。

image.png

4. フリーテキストで複数登録する#

登録したいCPEが複数ある場合、フリーテキストで貼り付けて登録できます。

image.png

5. REST APIで登録する#

REST APIで自作プログラムからCPEを登録可能です。詳細は「ドキュメント」を参照してください。

6. ネットワーク機器をコマンドで登録する#

ネットワーク機器で使われているソフトウェアのCPEを取得してから登録するまで、コマンドを用いて各ネットワークごとに一括で行うことができます。またcron等を用いて定期的に実行させることをおすすめします。 コマンドの詳細な使い方は「README」も参考にしてください。

使用するコマンドは2つあります。

  1. future-vuls discover

  2. future-vuls add-cpe

順番に実行していくことでネットワーク単位でのCPE情報を管理できます。

コマンドのインストール手順#

releases」から future-vulssnmp2cpe のバイナリをダウンロードします。 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登録後画面上からスキャンを実行し脆弱性を確認できます。 擬似サーバは日次で自動スキャンされる他、手動でスキャンできます。

image

CPEスキャンのタイミング#

CPEスキャンのタイミングは擬似サーバとそれ以外で異なります。

通常サーバの場合は以下のタイミングで、通常サーバに紐付けたCPEの脆弱性が検知されます。

  • 画面上で手動スキャンを実行する
  • スキャナからのアップロードのタイミング

擬似サーバの場合は以下です。

  • 画面上で手動スキャンを実行する
  • 日次の自動スキャンのタイミング

スキャンした時刻は「グループ設定>スキャン履歴」に記載されています。

CPEを更新する#

一度登録したCPEは画面から更新できます。

CPEを更新する事で、通常のパッケージ管理同様にタスクのステータスを管理できます。

image

CPE以外の更新は、プルダウンから選択またはCPENameで指定できます。 プルダウンは該当する値がなくても、手動で入力することにより登録できます。

image

運用例

  • 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は詳細画面やソフトウェア一覧から削除できます。

image

CPEを削除すると、関連するタスクと脆弱性もすべて削除されます。 (削除したCPE以外にも紐付いているタスク、脆弱性は削除されません)

CPEを割り当てる#

image

「Windows」かつ「実スキャナで登録されたサーバ」でのみ、CPEを割り当てることができます。

詳細は「割り当て方法」を参照してください。

和製ソフトウェアの脆弱性をJVNで検知する#

和製ソフトウェアはCPE登録・変更時に、「和製ソフトウェアの脆弱性をJVNで検知する」チェック(※以下、JVNチェックと記載) を選択してください。 日本向けの製品のような、「NVDに含まれないがJVNには脆弱性情報が登録されている和製ソフトウェア」の脆弱性を検知できるようになります。

image

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」にすることをおすすめします(参考)。

なお、信頼度の詳細な説明や、信頼度の低い脆弱性への対応方法については、「信頼度」を参照してください。