CPEスキャン

CPEスキャンについて

CPEスキャン機能は、OSやプログラミング言語依存のライブラリ「以外」のソフトウェアの脆弱性をスキャンできます。具体的なスキャン対象例としては以下のようなものがあります。

  • Cisco、Fortinetなどのネットワーク機器
  • OracleやJP1などの商用データベースおよびその他の商用製品
  • ダウンロードしてセットアップしたTomcat
  • ソースコードをコンパイルしたApache

CPEスキャンで使用する脆弱性データベースは、NVDやJVNとなります。 これらのデータベースに登録されている製品がスキャン対象となります。

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形式どちらでも登録可能となっていますが、表示はURI形式に統一しています。

CPEの利用用途

CPEを使用することでパッケージマネージャ以外のソフトウェアの脆弱性検知が可能です。例えば以下のような脆弱性を検知することが出来ます。

  • ネットワーク機器のファームウェア (ex. cpe:/o:cisco:ios:- )
  • Oracle Database, Oracle WebLogicなどの商用ミドルウェア
  • 自分でソースからコンパイルしてインストールしたもの

以下も可能ですがCPEスキャン以外の方法をおすすめします。

CPEスキャンの脆弱性DB

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

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

パッケージマネージャ管理下のソフトウェアはCPEスキャンではなく、スキャナ経由のスキャンを推奨します。詳細はFAQ/CPEスキャンを参照してください。

CPEスキャンの処理詳細

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

image

CPEを登録する

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

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

image

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

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

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

image.png

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 のバイナリと同じディレクトリの階層に配置してください。

コマンドの説明と使用方法

  1. future-vuls discover
    CIDRレンジで指定したネットワーク内のホストを探査して応答があったホストに対してsnmp2cpeを実行しCPEを取得できたホストをtomlファイルにリストアップします。
    次回実行時には新しいホストを差分として追記します。
    この際、古いファイルはタイムスタンプをつけてリネームされます。
    snmp2cpeについてはREADMEを参照してください。
    このコマンドの実行にはCIDRレンジの指定が必須です。
    列挙されたホストの中で、CPE情報をFvulsに登録したいものの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
  1. future-vuls add-cpe
    fvuls_syncがtrueになっているホストをFvulsに擬似サーバとして登録しUUIDを取得します。
    擬似サーバの登録名はserver_nameを変更することで変えることができます。 登録されているサーバ名とserver_nameが異なる場合は、登録されているサーバ名が優先され、コマンド実行時に自動的に変更されます。
    その後tomlファイルのcpe_uriをFvulsの擬似サーバにCPEとして登録します。
    このコマンドの実行にはFutureVuls RESTAPIのトークンが必須です。
    トークンの取得方法については、こちらを参照してください。
#コマンドのヘルプ
./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を登録できます。

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以外にも紐付いているタスク、脆弱性は削除されません)

和製ソフトウェアの脆弱性を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」にすることをおすすめします。

信頼度の低い脆弱性への対応方法

信頼度 は1から100までの数値で表され、値が小さいと誤検知の可能性が高まります。信頼度 はタスク一覧や、タスク詳細画面から確認できます。

信頼度の低いタスクが誤検知かどうかを判断するためには、脆弱性詳細の一次情報やディストリビューションサポートページ、Referenceのリンクなどで詳細を確認してください。

もし影響ないことが確認できた場合は、タスクを非表示にしてステータスを「NOT_AFFECTED」に変更するなどで対応してください。

信頼度の表示箇所

不明点はFAQを参照してください