VulsでCpeNamesを使う

# 概要

Vulsでは、CpeNamesを用いてスキャンすることが可能。
これの使い方について記載されいてる記事が少ないので、ここで利用イメージを展開します。

以下の内容について記載します。

-  CPEについて
-  CpeNamesの取得方法
-  Vulsでの設定方法
-  Hello! CVE-2017-5487(wordpress)
-  注意点

## 30秒流し読みまとめ

- 「Hello! CVE-2017-5487(wordpress)」項目に、コマンドベースで書いてあるから、そっち参照！
- CPE-Dictionaryに、最新のCPE名が乗っているとは限らない。自分でバージョン書き換えよう
- [peco](https://github.com/peco/peco/) 便利
- config.tomlに記載すればよい
- vuls reportの際に、上記configを読ませる
    - vuls scanの際は、cpeNamesは処理しない
    - vuls reportの際に、cpeNamesから情報を処理する

# CPE等についての確認
## CPEについて

CPEは、Common Platform Enumeration:共通プラットフォーム一覧と呼ばれる、「情報システムを構成する、ハードウェア、ソフトウェアなどを識別するための共通の名称基準」です。

- https://www.ipa.go.jp/security/vuln/CPE.html

ベンダ名や製品名などを体系的に「識別」できるようにしたものです。

- WordPressであれば、
    - 4.5.3なら、"cpe:/a:wordpress:wordpress:4.5.3"
    - 4.7.3なら、"cpe:/a:wordpress:wordpress:4.7.3"
- Aapache Struts2であれば
    - 2.3.8なら、cpe:/a:apache:struts:2.3.8
    - 2.5なら、cpe:/a:apache:struts:2.5

歴史的な経緯は以下のようです。

- MITRE社が仕様策定をしていた
- その後、CPEに関するすべての知的財産がNIST(米国国立標準技術研究所)に移転された。
    - 現行の管理権限は、NIST。
    - https://cpe.mitre.org/
    - http://nvd.nist.gov/cpe.cfm

OSやアプリケーションを、一位に識別するための識別子、です。一覧としては、nistのページ https://nvd.nist.gov/cpe.cfm に存在する、official-cpe-dictionary...xmlになります。

そして、これの更新は、申請ベースのようです。そのため、申請のないプロジェクトの識別子は更新されないようです。

- 例えば
    - WordPressは 4.5.3 までの登録しかない（現時点の最新は
    - 公式のcpe-dictionaryに、最新のCPE名があるとは限らない
        - 更新されている場合も多い

そしてこのCPE名は、NVDで利用されています。

- 例えば、WoredPress 4.7.1以下で影響があったREST APIの脆弱性 CVE-2017-5487
    - https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2017-5487
        - "Vulnerable software and versions"で、
        - "cpe:/a:wordpress:wordpress:4.7 and previous versions"のように記載されている

## CpeNamesの取得方法

前述のように、cpe-dictionaryに最新バージョンが乗っていない場合が多いように思えます。
そのため、既存のCPE名を探し出し、バージョン番号を書き換えるのが良いと思われます。

vulsで利用する go-cve-dictionaryを入れると、cpe名のデータベースを作る [go-cpe-dictionary](https://github.com/kotakanbe/go-cpe-dictionary) が追加されます。このsqlte3DBの結果を[peco](https://github.com/peco/peco/)で絞り込むのがすごく楽です。

- go-cpe-dictionaryで、cpe.db データベースができる
- ` sqlite3 ./cpe.db 'select name from cpes' | peco`などで、検索
- 古いバージョンのCPE名が見つかったら、バージョンを現在のものに書き換える
    - WordPress 4.7のCPE名を得たい
        - pecoで絞り込み、cpe:/a:wordpress:wordpress:4.5.3 をえる
        - 4.5.3を最新バージョン(4.7.3)に書き換える
            - cpe:/a:wordpress:wordpress:4.7.3

## Vulsでの設定方法

VulsでCPE名を用いてスキャンする場合は、cpeNamesエントリを利用します。このエントリを、関連するホストの中に記載します。

```
[servers]

[servers.172-31-4-82]
host="localhost"
port="local"
user="vuls"
cpeNames = [
  "cpe:/a:wordpress:wordpress:4.7.3",
]
```

vuls **report** 時に、cpeNamesエントリが処理されるので、必要に応じて、-configオプションで当該のconfigを読み込む必要があります。config.toml以外の名前でconfigを使っている場合は、report時に忘れやすいので注意が必要。

```
$ vuls scan   <--この時点でCPE名は処理されない
$ vuls report <--この時点で、config.tomlに書いてあるCPE名が処理される
```

# Hello! CVE-2017-5487(wordpress)

## 1. cpe.dbの作成

go-cpe-dictionaryで、cpe.dbを作成する。既にある場合はfetchオプションで更新できるようだ。

```
$ pwd
/opt/vuls
$ go-cpe-dictionary
INFO[0000] Fetching from NVD...
INFO[0007] Dumping XML to /opt/vuls/cpe.json...
INFO[0008] Inserting into DB... dbpath: /opt/vuls/hogehoge/cpe.db
INFO[0008] Migrating Tables                         
 117880 / 117880 [=============================================================================================] 100.00% 37s
INFO[0046] Inserted 117880 CPEs
$ ls
cpe.db  cpe.json
$
```

## 2. peco入れる

https://github.com/peco/peco/ 参照

## 3. CPE名を取得する

スキャン対象にしたいパッケージのバージョンを、別途確認します。
cpe.dbに当該のCPE名があるかを確認し、無い場合はバージョンを書き換えます。

```
-- wordpress 4.7をスキャン対象に加える
$ pwd
/opt/vuls
$  sqlite3 ./cpe.db 'select name from cpes' | peco
cpe:/a:wordpress:wordpress:4.5.3  
; これの 4.5.3部分を 4.7として、cpe:/a:wordpress:wordpress:4.7 を得る
$ 
```

## 4. config.tomlに記載する

今回は、Vulsのスキャンサーバ自身の検査結果に含まれるように設定してみます。

- 2017/03に話題になった Struts2を追加
- なんとなくCiscoのIOSも追加
- 本命のWordPress4.7も追加

```text:config.toml
[default]
user = "vuls"

[servers]
[servers.vuls-servre]
host = "localhost"
port = "local"
cpeNames = [
  "cpe:/a:apache:struts:2.3.31",
  "cpe:/o:cisco:ios:15.2%281%29ex",
  "cpe:/a:wordpress:wordpress:4.7",
]
```

## 5. スキャンする

いつも通り、scanとreportを行います。
reportはjsonファイルへの情報追加を行うので、-format-jsonとします。

```
$ pwd
/opt/vuls
$ vuls scan
$ vuls report -to-localfile -format-json
```

## 6. 結果を見る

vuls tuiでも、report系コマンドでも表示されます。

```
$ vuls report -format-short-text
...
CVE-2017-5487   5.0  (Medium)   wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php in the REST
                                API implementation in WordPress 4.7 before 4.7.1 does not properly restrict
                                listings of post authors, which allows remote attackers to obtain sensitive
                                information via a wp-json/wp/v2/users request.
                                http://www.cvedetails.com/cve/CVE-2017-5487
                                https://access.redhat.com/security/cve/CVE-2017-5487
                                cpe:/a:wordpress:wordpress:4.7Confidence: 100 / CpeNameMatch
...
```

vuls tuiだと以下のような感じ
![vuls_tui.png](https://qiita-image-store.s3.amazonaws.com/0/124868/a1bd65c4-2205-53fd-0846-feae2bdc0a86.png)



### 6.1 その他の脆弱性のあるCPE名のものは？

Struts2も検出できている

```
...
CVE-2017-5638   10.0 (High)     The Jakarta Multipart parser in Apache Struts 2 2.3.x before 2.3.32 and 2.5.x
                                before 2.5.10.1 mishandles file upload, which allows remote attackers to execute
                                arbitrary commands via a #cmd= string in a crafted Content-Type HTTP header, as
                                exploited in the wild in March 2017.
                                http://www.cvedetails.com/cve/CVE-2017-5638
                                https://access.redhat.com/security/cve/CVE-2017-5638
                                cpe:/a:apache:struts:2.3.31Confidence: 100 / CpeNameMatch
...
```

Cisco IOSは結構数があったので、2つほど例示

```
...
CVE-2015-0635   9.0  (High)     The Autonomic Networking Infrastructure (ANI) implementation in Cisco IOS 12.2,
                                12.4, 15.0, 15.2, 15.3, and 15.4 and IOS XE 3.10.xS through 3.13.xS before
                                3.13.1S allows remote attackers to spoof Autonomic Networking Registration
                                Authority (ANRA) responses, and consequently bypass intended device and node
                                access restrictions or cause a denial of service (disrupted domain access), via
                                crafted AN messages, aka Bug ID CSCup62191.
                                http://www.cvedetails.com/cve/CVE-2015-0635
                                https://access.redhat.com/security/cve/CVE-2015-0635
                                cpe:/o:cisco:ios:15.2%281%29exConfidence: 100 / CpeNameMatch

CVE-2015-0636   7.8  (High)     The Autonomic Networking Infrastructure (ANI) implementation in Cisco IOS 12.2,
                                12.4, 15.0, 15.2, 15.3, and 15.4 and IOS XE 3.10.xS through 3.13.xS before
                                3.13.1S allows remote attackers to cause a denial of service (disrupted domain
                                access) via spoofed AN messages that reset a finite state machine, aka Bug ID
                                CSCup62293.
                                http://www.cvedetails.com/cve/CVE-2015-0636
                                https://access.redhat.com/security/cve/CVE-2015-0636
                                cpe:/o:cisco:ios:15.2%281%29exConfidence: 100 / CpeNameMatch
...
```

# 終わりに

とりあえず手動で cpeNames を取得することで、ネットワーク機器やパッケージ外のミドルウェアの監視が可能です。

現時点ではネットワーク機器は Vulsの対象外であるため、手動でバージョンを控え、cpeNamesに登録することで検知は可能です。

あと、注意点は以下の通りです。

- cpeNames設定は、 **report** の時に処理されます。
- cpe-dictionaryに、最新バージョンの記載がない場合もありますが、NVD(CVE)には記載があるので、気にしない。