CPEスキャン機能は、OSやプログラミング言語依存のライブラリ「以外」のソフトウェアの脆弱性をスキャンできます。具体的なスキャン対象例としては以下のようなものがあります。
CPEスキャンで使用する脆弱性データベースは、NVDやJVNとなります。 これらのデータベースに登録されている製品がスキャン対象となります。
CPE(Common Platform Enumeration)をFutureVulsに登録することでOSパッケージ以外の脆弱性も検知できます。
CPEについての説明はIPAによるCPE概説をご覧ください。
CPEには、以下の2種類が定義されています。
cpe:/a:microsoft:internet_explorer:8.0.6001:beta
)cpe:2.3:a:microsoft:internet_explorer:8.0.6001:beta:*:*:*:*:*:*
)URI形式はバージョン2.2、 FormattedString形式はバージョン2.3と呼ばれています。
表示できる情報量は変わらず、表示形式に差があるのみとなっています。
FutureVulsでは、URI形式、FormattedString形式どちらでも登録可能となっていますが、表示はURI形式に統一しています。
CPEを使用することでパッケージマネージャ以外のソフトウェアの脆弱性検知が可能です。例えば以下のような脆弱性を検知することが出来ます。
cpe:/o:cisco:ios:-
)以下も可能ですがCPEスキャン以外の方法をおすすめします。
NVDをメインの脆弱性DBとして利用します。
JVNにしか定義されていない和製ソフトウェアも検知可能ですが、誤検知の可能性があります。 詳細は和製ソフトウェアの脆弱性をJVNで検知するを参照してください。
パッケージマネージャ管理下のソフトウェアはCPEスキャンではなく、スキャナ経由のスキャンを推奨します。詳細はFAQ/CPEスキャンを参照してください。
CPEスキャンの検知処理の詳細を図示します。
CPEは サーバ
> ソフトウェア
> CPE追加
から登録できます。
現在、CPEの登録方法は6種類あります。
CPEを登録しただけでは脆弱性検知されません。CPEを紐づけたサーバがスキャンされたタイミングで検知処理が実行されます。
ネットワーク機器を CPE 登録する場合には、種別 {h=ハードウェア} ではなく {o=OS} に該当する情報を登録してください。
partやvendorなどをプルダウンで選択してCPEを登録します。
候補としてプルダウンに現れるCPEはNVDのデータベースから取得しています。
プルダウンから候補が見つからない場合、手入力での登録も可能です。
CPEの形式がわかっている場合は、CPE名称を貼り付けて登録できます。
OWASP Dependency Check を利用している場合、出力されたxmlを使用し、検知したライブラリを一括で登録できます。
信頼度が低いCPEはあらためて確認の上で登録してください。
登録したいCPEが複数ある場合、フリーテキストで貼り付けて登録できます。
REST APIで自作プログラムからCPEを登録可能です。詳細はドキュメントを参照してください。
ネットワーク機器で使われているソフトウェアのCPEを取得してから登録するまで、コマンドを用いて各ネットワークごとに一括で行うことができます。またcron等を用いて定期的に実行させることをおすすめします。
コマンドの詳細な使い方はREADMEも参考にしてください。
使用するコマンドは2つあります。
future-vuls discover
future-vuls add-cpe
順番に実行していくことでネットワーク単位でのCPE情報を管理できます。
releasesから future-vuls
と snmp2cpe
のバイナリをダウンロードします。
future-vuls
を実行する際は snmp2cpe
のバイナリと同じディレクトリの階層に配置してください。
future-vuls discover
#コマンドのヘルプ
./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
#コマンドのヘルプ
./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以外の更新は、プルダウンから選択またはCPENameで指定できます。
プルダウンは該当する値がなくても、手動で入力することにより登録できます。
cpe:/a:drupal:drupal:3.8
を登録する。あくまでCPEのバージョン以下をアップデートする作業であるため、Part・Vendor・Productは変更できません。
登録したCPEは詳細画面やソフトウェア一覧から削除できます。
CPEを削除すると、関連するタスクと脆弱性もすべて削除されます。
(削除したCPE以外にも紐付いているタスク、脆弱性は削除されません)
和製ソフトウェアは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」にすることをおすすめします。
信頼度
は1から100までの数値で表され、値が小さいと誤検知の可能性が高まります。信頼度
はタスク一覧や、タスク詳細画面から確認できます。
信頼度の低いタスクが誤検知かどうかを判断するためには、脆弱性詳細の一次情報やディストリビューションサポートページ、Referenceのリンクなどで詳細を確認してください。
もし影響ないことが確認できた場合は、タスクを非表示にしてステータスを「NOT_AFFECTED」に変更するなどで対応してください。