Vulsを使って脆弱性の多い製品一覧を出してみた

この記事は、[LIFULL Advent Calendar 2017](https://qiita.com/advent-calendar/2017/lifull)の5日目の記事です。
こんにちは。
株式会社 LIFULL セキュリティグループの福沢です。

## この記事の要約
* 脆弱性の報告が多い製品について調べたよ
* Vulsというツールを使ってみたよ
* 調べた方法と結果をまとめたよ

です :smiley: 

## 背景

自部署では、脆弱性情報の収集と評価をするために、
脆弱性情報データーベースの [NVD](https://nvd.nist.gov/vuln/search) や [JVN](https://jvn.jp/) などから、
その日に報告された脆弱性を確認しています。

脆弱性は日々報告されており、
大体の感覚でいうと1日 50件〜200件 くらい
報告されているのかなという印象です。

脆弱性の情報を毎日見ていて、気づいたことがありました。
それは、
####「あれ？この製品の脆弱性がまた出ている。前にもよくみたぞ。」
ということでした。

そこで脆弱性の報告が多い製品ってどういうものなんだろう？
と思ったので、調べてみました。
サービス開発の際に、一つの参考になれば幸いです。
※ なお、脆弱性の報告が多い製品が危険で、
少ない製品が一概に安全という訳ではありません。
よく利用されている有名な製品ほど報告件数は、多くなります。
ので、あしからず:sweat_smile::sweat_drops:

ちなみに 既に脆弱性の多い製品の一覧を出してくれている
以下のようなサイト⬇︎もあります。
[CVE Deitals](https://www.cvedetails.com/top-50-products.php)

ただ、特定の期間で絞り込んだり、
cvss(脆弱性の脅威スコア)で絞り込みたい
などの複数の条件で調べたかったので、
今回は、**「Vuls」** というツールを使って調査しました。 
Vulsについては次に記載します。

## Vulsについて
![vuls_logo.png](https://qiita-image-store.s3.amazonaws.com/0/88603/121f1b80-dec5-bf05-57eb-29320331dc5d.png "vuls_logo.png")

VulsはGolang製で、エージェントレスな脆弱性検知ツールです。
GitHub: https://github.com/future-architect/vuls

vulsの大まかな流れは、以下です。
① 脆弱性情報の収集
② 対象のサーバへスキャン
<img src="https://qiita-image-store.s3.amazonaws.com/0/88603/f161a58c-34b3-0ea3-0f69-15ab7b970390.png" width=70%>

この「① 脆弱性情報の収集」で収集した情報は、
Vulsサーバ内のsqliteなどのDBに格納されます。
今回は、このDBを利用し、脆弱性の多い製品リストを取得します。

## 調査方法
【前提】
 Vulsをインストールしていること
(インストール方法は、[こちら](https://github.com/future-architect/vuls/blob/master/README.ja.md)をご覧ください)

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) ;
```
## クエリと結果
``` 2017.11月の脆弱性が多い製品top10
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|

```2017.1月~11月までの脆弱性が多い製品top10(NVD)
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|

```2017.1月~11月までの脆弱性が多い且つcvssが9.0(critical)以上の製品top10
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を持っているので、解析などにも利用ができそうです。
この情報を元に可視化をするのも面白いかなと思いました。

以上になります。

## 引用
- Vuls ロゴ
https://github.com/future-architect/vuls