概要
Vulsでは、CpeNamesを用いてスキャンすることが可能。
これの使い方について記載されいてる記事が少ないので、ここで利用イメージを展開します。
以下の内容について記載します。
- CPEについて
- CpeNamesの取得方法
- Vulsでの設定方法
- Hello! CVE-2017-5487(wordpress)
- 注意点
30秒流し読みまとめ
- 「Hello! CVE-2017-5487(wordpress)」項目に、コマンドベースで書いてあるから、そっち参照!
- CPE-Dictionaryに、最新のCPE名が乗っているとは限らない。自分でバージョン書き換えよう
- peco 便利
- config.tomlに記載すればよい
- vuls reportの際に、上記configを読ませる
- vuls scanの際は、cpeNamesは処理しない
- vuls reportの際に、cpeNamesから情報を処理する
CPE等についての確認
CPEについて
CPEは、Common Platform Enumeration:共通プラットフォーム一覧と呼ばれる、「情報システムを構成する、ハードウェア、ソフトウェアなどを識別するための共通の名称基準」です。
ベンダ名や製品名などを体系的に「識別」できるようにしたものです。
- 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"のように記載されている
-
https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2017-5487
CpeNamesの取得方法
前述のように、cpe-dictionaryに最新バージョンが乗っていない場合が多いように思えます。
そのため、既存のCPE名を探し出し、バージョン番号を書き換えるのが良いと思われます。
vulsで利用する go-cve-dictionaryを入れると、cpe名のデータベースを作る go-cpe-dictionary が追加されます。このsqlte3DBの結果を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
- WordPress 4.7のCPE名を得たい
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も追加
[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
...
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)には記載があるので、気にしない。