この記事は、LIFULL Advent Calendar 2017の5日目の記事です。
こんにちは。
株式会社 LIFULL セキュリティグループの福沢です。
この記事の要約
- 脆弱性の報告が多い製品について調べたよ
- Vulsというツールを使ってみたよ
- 調べた方法と結果をまとめたよ
です
背景
自部署では、脆弱性情報の収集と評価をするために、
脆弱性情報データーベースの NVD や JVN などから、
その日に報告された脆弱性を確認しています。
脆弱性は日々報告されており、
大体の感覚でいうと1日 50件〜200件 くらい
報告されているのかなという印象です。
脆弱性の情報を毎日見ていて、気づいたことがありました。
それは、
####「あれ?この製品の脆弱性がまた出ている。前にもよくみたぞ。」
ということでした。
そこで脆弱性の報告が多い製品ってどういうものなんだろう?
と思ったので、調べてみました。
サービス開発の際に、一つの参考になれば幸いです。
※ なお、脆弱性の報告が多い製品が危険で、
少ない製品が一概に安全という訳ではありません。
よく利用されている有名な製品ほど報告件数は、多くなります。
ので、あしからず
ちなみに 既に脆弱性の多い製品の一覧を出してくれている
以下のようなサイト⬇︎もあります。
CVE Deitals
ただ、特定の期間で絞り込んだり、
cvss(脆弱性の脅威スコア)で絞り込みたい
などの複数の条件で調べたかったので、
今回は、「Vuls」 というツールを使って調査しました。
Vulsについては次に記載します。
Vulsについて
VulsはGolang製で、エージェントレスな脆弱性検知ツールです。
GitHub: https://github.com/future-architect/vuls
vulsの大まかな流れは、以下です。
① 脆弱性情報の収集
② 対象のサーバへスキャン
この「① 脆弱性情報の収集」で収集した情報は、
Vulsサーバ内のsqliteなどのDBに格納されます。
今回は、このDBを利用し、脆弱性の多い製品リストを取得します。
調査方法
【前提】
Vulsをインストールしていること
(インストール方法は、こちらをご覧ください)
Vulsのインストールが終わると、
cve.sqlite3 というファイルができていると思います。
まずは、cve.sqlite3に入ります。
$ sqlite3 cve.sqlite3
以下のようなテーブルがあります。
テーブル名 | 概要 |
---|---|
nvds | NVDの情報テーブル |
jvns | JVN情報テーブル |
cpes | cpe※情報テーブル |
※ cpeは、製品(ハードウェア、ソフトウェア、アプリケーションなど)の識別子 |
それぞれの構成情報
sqlite> .schema nvds
CREATE TABLE "nvds" ("id" integer primary key autoincrement,"created_at" datetime,"updated_at" datetime,"deleted_at" datetime,"cve_detail_id" integer,"cve_id" varchar(255),"summary" varchar(4096),"score" real,"access_vector" varchar(255),"access_complexity" varchar(255),"authentication" varchar(255),"confidentiality_impact" varchar(255),"integrity_impact" varchar(255),"availability_impact" varchar(255),"cwe_id" varchar(255),"published_date" datetime,"last_modified_date" datetime );
CREATE INDEX idx_nvds_deleted_at ON "nvds"(deleted_at) ;
sqlite> .schema jvns
CREATE TABLE "jvns" ("id" integer primary key autoincrement,"created_at" datetime,"updated_at" datetime,"deleted_at" datetime,"cve_detail_id" integer,"cve_id" varchar(255),"title" varchar(255),"summary" varchar(8192),"jvn_link" varchar(255),"jvn_id" varchar(255),"score" real,"severity" varchar(255),"vector" varchar(255),"published_date" datetime,"last_modified_date" datetime );
sqlite> .schema cpes
CREATE TABLE "cpes" ("id" integer primary key autoincrement,"created_at" datetime,"updated_at" datetime,"deleted_at" datetime,"jvn_id" integer,"nvd_id" integer,"cpe_name" varchar(255),"part" varchar(255),"vendor" varchar(255),"product" varchar(255),"version" varchar(255),"vendor_update" varchar(255),"edition" varchar(255),"language" varchar(255) );
CREATE INDEX idx_cpes_deleted_at ON "cpes"(deleted_at) ;
クエリと結果
SELECT
*
FROM
(
SELECT
product,
COUNT(1) as hits
FROM
nvds
INNER JOIN
cpes
ON nvds.id = cpes.id
WHERE
published_date >= "2017-11-01 00:00:00:00-00:00"
AND published_date <= "2017-11-30 00:00:00-00:00"
GROUP BY
product
ORDER BY
hits DESC
)
LIMIT 10
;
2017.11月の脆弱性が多い製品top10
hits | product |
---|---|
188 | linux_kernel |
91 | php |
57 | imagemagick |
45 | oracle9i |
40 | vbulletin |
33 | asterisk |
26 | imp |
25 | ethereal |
24 | cluster_server |
24 | mailman |
SELECT
*
FROM
(
SELECT
product,
COUNT(1) as hits
FROM
nvds
INNER JOIN
cpes
ON nvds.id = cpes.id
WHERE
published_date >= "2017-01-01 00:00:00:00-00:00"
AND published_date <= "2017-11-30 00:00:00-00:00"
GROUP BY
product
ORDER BY
hits DESC
)
LIMIT 10
;
2017.1月~11月までの脆弱性が多い製品top10(NVD)
product | hits |
---|---|
linux_kernel | 2349 |
ios | 646 |
ethereal | 478 |
php | 341 |
weblogic_server | 338 |
phpbb | 282 |
mac_os_x | 248 |
vbulletin | 248 |
jetty | 240 |
jdk | 207 |
SELECT
*
FROM
(
SELECT
product,
COUNT(1) as hits
FROM
nvds
INNER JOIN
cpes
ON nvds.id = cpes.id
WHERE
published_date >= "2017-01-01 00:00:00:00-00:00"
AND published_date <= "2017-11-30 00:00:00-00:00"
AND score >= 9.0
GROUP BY
product
ORDER BY
hits DESC
)
LIMIT 10
;
2017.1月~11月までの脆弱性が多い且つcvssが9.0(critical)以上の製品top10
product | hits |
---|---|
linux_kernel | 175 |
ethereal | 80 |
windows_2000 | 39 |
gtk%2b | 36 |
vbulletin | 36 |
php | 35 |
jdk | 34 |
weblogic_server | 29 |
ios | 26 |
opera_browser | 23 |
まとめ
Vulsは、脆弱性検知ツールですが、
脆弱性情報DBを持っているので、解析などにも利用ができそうです。
この情報を元に可視化をするのも面白いかなと思いました。
以上になります。