無料でサーバーの脆弱性診断!「Vuls」のインストールと使い方 for Linux

Linux

Vulsとは?

Vulsはオープンソースで無料の脆弱性スキャンツールです。GO言語というプログラミング言語で開発されています。

膨大で多岐にわたる脆弱性情報をどんな優秀なエンジニアでも手動ではとても管理やチェックはしきれません。

VulsはNVD、OVALなどの様々な脆弱性データベースからの情報に基づき自動でコンピュータの内部をスキャンして脆弱性を発見します。

2019年にIPA(情報処理推進機構)でも推奨されたことから近年注目度が上がっているようです。

Vulsが対応しているOS

OSの対象範囲がとても広くほとんどのメジャーなLinuxOSで利用できます。すばらしいですね!!!

Distribution Release
Alpine 3.3 and later
Ubuntu 14, 16, 18, 20
Debian 8, 9, 10, 11
RHEL 5, 6, 7, 8
Oracle Linux 5, 6, 7
CentOS 6, 7, 8
Alma Linux 8
Rocky Linux 8
Amazon Linux All
FreeBSD 10, 11
SUSE Enterprise 11, 12
Raspbian Jessie, Stretch, Buster

Vulsでできること

動作の特徴としては以下のようなものがあります。

  • 簡易的に軽負荷で行う「Fastスキャン」や、ルート権限でしっかり行う「Deepスキャン」
  • ローカルだけで動作させるローカルスキャンモード
  • SSHで中央マシンから収集先各サーバーに接続する「リモートスキャンモード」
  • HTTPサーバーとして各マシンから情報を受信する「サーバーモード」

Vulsのインストールをするにあたり準備

今回はCentOS6という古いOSで試して脆弱性を発見してみたいと思いますが、説明の中で特有のコマンドなどはほとんど使っていませんのでCentOS7,8やDebian/Ubuntuなど他のOSなどでも対応可能です。

基本ライブラリの準備

Vulsには次のライブラリ・ソフトウェアが必要です。

・SQLite3, MySQL, PostgreSQL, Redis
・git
・gcc
・GNU Make
・Go v1.13以上(最新バージョンを推奨)

一応、はじめる前に以下のコマンドを実行しておくといいかと思います。

CetnOSの場合
# yum install sqlite git gcc make wget

Debian系/Ubuntuの場合
# apt-get install sqlite git gcc make wget

他足りないものは失敗したら都度インストールしてください。

GO言語のインストール

VulsはGO言語が無いと実行できませんのでGO言語をインストールします。

※ちなみにyumでgolangをインストールしたら後でエラーで先に進めなくなりましたので以下の通りのインストールをおすすめします。

vulsを実行する予定のユーザーでログインしておきます。

どこか適当なアーカイブを保存するディレクトリに移動して次を実行していきます。

GO言語のインストール

内容としては手動でgo言語をダウンロードして解凍後ディレクトリを移動させています。

$ export latest_version=1.17.1 # Latest Go release as of writing
$ wget https://dl.google.com/go/go$latest_version.linux-amd64.tar.gz
$ sudo rm -rf /usr/local/go
$ sudo tar -C /usr/local -xzf go$latest_version.linux-amd64.tar.gz
$ mkdir $HOME/go

※なるべく最新バージョンをインストールしてください。1.17.1は2021/12月時点での最新

環境変数GOPATHの設定

GO言語を扱うにあたっての事前準備です。

先ほど作った/usr/local/goと~/goディレクトリを環境変数に設定していきます。

ログインした時に環境変数が読み込まれるようにします。

vulsを実行する予定のユーザーでログインしておきます。

$ sudo vi /etc/profile.d/goenv.sh

goenv.shの内容は以下の通りにします。

export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

ログインした時じゃないと実行されないので、手動で環境変数を読み込みます。

$ source /etc/profile.d/goenv.sh

変数を出力してみましょう。

echo $GOPATH

/usr/local/go

次から、脆弱性データベースからデータをローカルにインポートしていきます。

このインポート作業がなんといってもデータのダウンロードに時間がかかるので待ち時間が発生し大変です。

ダウンロードにかかる時間に関してはサーバー環境やスペック、回線の強さによっても大分変ると思うので時間に余裕を見て作業を進めてください。何か並行して作業しながらがよいでしょう。

脆弱性情報DBのインポート① go-cve-dictionary

go-cve-dictionaryとは?

「go-cve-dictionary」は脆弱性データベースの公開データをインポートするためのツールです。具体的には脆弱性情報データベースであるNVDとJVNのデータのローカルコピーを作成します。形式はsqlite形式です。

go-cve-dictionaryのインストール

以下のようにgithubからソースをダウンロードしてコンパイルします。

$ sudo mkdir /var/log/vuls
$ sudo chown $USER /var/log/vuls
$ sudo chmod 700 /var/log/vuls
$ mkdir -p $GOPATH/src/github.com/vulsio
$ cd $GOPATH/src/github.com/vulsio
$ git clone https://github.com/vulsio/go-cve-dictionary.git
$ cd go-cve-dictionary
$ make install

※一瞬gitのオプションエラーが出ますが無事に終了します。

コンパイルでエラーが出た場合の対処法

gccのバージョンが4.6以上じゃないと以下のエラーが出ます。
確認してみると現在のyumでいれたバージョンは4.4.7で古いものでした。

full error output:
cc1: error: unrecognized command line option "-fno-lto"
$ sudo  yum install centos-release-scl
$ sudo  yum install scl-utils
$ sudo  yum install devtoolset-7-gcc devtoolset-7-gcc-c++ devtoolset-7-binutils

※-7の部分を6などにしてバージョンを変えることもできる

有効化

$ sudo  scl enable devtoolset-7 bash

今入れたバージョンの確認

$ gcc --version

gcc (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5)

毎回有効化するのは面倒なのでprofile.dで設定しておきます。

$ sudo vi /etc/profile.d/enabledevtoolset-7.sh
#!/bin/bash
source scl_source enable devtoolset-7

go-cve-dictionaryで脆弱性データベースのダウンロード

脆弱性データベースのNVDからデータをダウンロードします。

$ cd $HOME
$ go-cve-dictionary fetch nvd

GCP上では5分程度で終わりました。
ただ別の環境では20分以上かかることもありました。

全作業工程でここが一番長いです。

今度は、脆弱性データベースのJVNからデータをダウンロードします。

$ cd $HOME
$ go-cve-dictionary fetch jvn

2分ほどで終わりました。

次からも同じような容量でDBからデータをインポートしていきます。
数が多く大変ですががんばってください!

脆弱性情報DBのインポート② goval-dictionary

goval-dictionaryとは?

「goval-dictionary」も脆弱性データベースの公開データをインポートするためのツールです。OVALのDBのローカルコピーを作成します。形式はsqliteで保存されます。

以下のようにgithubからソースをダウンロードしてコンパイルします。

goval-dictionaryのインストール

以下のようにgithubからソースをダウンロードしてコンパイルします。

$ mkdir -p $GOPATH/src/github.com/vulsio
$ cd $GOPATH/src/github.com/vulsio
$ git clone https://github.com/vulsio/goval-dictionary.git
$ cd goval-dictionary
$ make install

※gccバージョンが4.6以上でないとエラーが出ます。

goval-dictionaryで脆弱性データベースのダウンロード

今度は、脆弱性データベースのOVALからRedhatのデータをダウンロードします。

以下のように実行します。
OSとバージョンを指定しています。

$ cd $HOME
$ goval-dictionary fetch redhat 5 6

OSの種類やバージョンによって使い分けてください。
(centosはredhat系)

例
$ goval-dictionary fetch redhat 5 6 7 8
$ goval-dictionary fetch debian 7 8 9 10 11
$ goval-dictionary fetch ubuntu 14 16 18 19 20 21

こちらはあまりたくさん選択しなければ直ぐに終わります。

脆弱性情報DBのインポート③ gost

gost(go-security-tracker)とは?

gost(go-security-tracker)は各OSのバグや脆弱性情報であるSecurity Tracker(Redhat/Debian/Ubuntu/Microsoft)のデータベースのローカルコピーを作成します。

gostのインストール

以下のようにgithubからソースをダウンロードしてコンパイルします。

$ sudo mkdir /var/log/gost
$ sudo chown $USER /var/log/gost
$ sudo chmod 700 /var/log/gost
$ mkdir -p $GOPATH/src/github.com/vulsio
$ cd $GOPATH/src/github.com/vulsio
$ git clone https://github.com/vulsio/gost.git
$ cd gost
$ make install

※gccバージョンが4.6以上でないとエラーが出ます。

gostで脆弱性データベースのダウンロード

RedHatのセキュリティトラッカー情報をダウンロードします。

$ gost fetch redhat

※OSタイプに応じて debian, ubuntuなどと変えてください
(centosはredhat系)

5分ほどで終わります。

脆弱性情報DBのインポート④ go-exploitdb

go-exploitdbとは?

go-exploitdbはエクスプロイト(脆弱性利用型不正プログラム)に関する情報DBをローカルに作成します。具体的な取得先はアメリカのOffensive Security社が管理するExploitDBです。

go-exploitdbのインストール

以下のようにgithubからソースをダウンロードしてコンパイルします。

$ sudo mkdir /var/log/go-exploitdb
$ sudo chown $USER /var/log/go-exploitdb
$ sudo chmod 700 /var/log/go-exploitdb
$ mkdir -p $GOPATH/src/github.com/vulsio
$ cd $GOPATH/src/github.com/vulsio
$ git clone https://github.com/vulsio/go-exploitdb.git
$ cd go-exploitdb
$ make install

go-exploitdbで脆弱性データベースのダウンロード

ExploitDBから脆弱性データをダウンロードします。

cd $HOME
$ go-exploitdb fetch exploitdb

1~2分で終わりました。

vulsのインストール

いよいよVuls本体のインストールです。長かったですね・・・・

$ mkdir -p $GOPATH/src/github.com/future-architect
$ cd $GOPATH/src/github.com/future-architect
$ git clone https://github.com/future-architect/vuls.git
$ cd vuls
$ make install

※新規インストールでなく更新の場合は先に以下を実行

更新の場合は消してからインストールしてください!

$ rm -rf $GOPATH/pkg/linux_amd64/github.com/future-architect/vuls/
$ rm -rf $GOPATH/src/github.com/future-architect/vuls/

早速、脆弱性のローカルスキャンしてみる

vulsの設定ファイル

ローカルスキャン設定します。

$ cd $HOME
$ vi $HOME/config.toml

内容としては以下のようにローカルのスキャンを指定しています。

[servers]

[servers.localhost]
host = "localhost"
port = "local"

設定ふぁいるのあるディレクトリでスキャンを実行

$ vuls scan

再度スキャンを実行

$ vuls scan

[Dec  8 02:23:26]  INFO [localhost] vuls-v0.19.0-build-20211208_021014_0c6a892
[Dec  8 02:23:26]  INFO [localhost] Start scanning
[Dec  8 02:23:26]  INFO [localhost] config: /home/vulstest/config.toml
[Dec  8 02:23:26]  INFO [localhost] Validating config...
[Dec  8 02:23:26]  INFO [localhost] Detecting Server/Container OS...
[Dec  8 02:23:26]  INFO [localhost] Detecting OS of servers...
[Dec  8 02:23:26]  INFO [localhost] (1/1) Detected: localhost: centos 6.10
[Dec  8 02:23:26]  INFO [localhost] Detecting OS of containers...
[Dec  8 02:23:26]  INFO [localhost] Checking Scan Modes...
[Dec  8 02:23:26]  INFO [localhost] Detecting Platforms...
[Dec  8 02:23:26]  INFO [localhost] (1/1) localhost is running on other
[Dec  8 02:23:26]  INFO [localhost] Scanning OS pkg in fast mode
[Dec  8 02:23:34]  INFO [localhost] Scanning listen port...
[Dec  8 02:23:34]  INFO [localhost] Using Port Scanner: Vuls built-in Scanner
[Dec  8 02:23:34]  WARN [localhost] Some warnings occurred during scanning on localhost. Please fix the warnings to get a useful information. Execute configtest subcommand before scanning to know the cause of the warnings. warnings: [Standard OS support is EOL(End-of-Life). Purchase extended support if available or Upgrading your OS is strongly recommended.]


Scan Summary
================
localhost       centos6.10      872 installed, 0 updatable

Warning: [Standard OS support is EOL(End-of-Life). Purchase extended support if available or Upgrading your OS is strongly recommended.]



To view the detail, vuls tui is useful.
To send a report, run vuls report -h.

今度は出来ました!

CentOS6で試したためOSが古すぎるって怒られました・・・そりゃそうですね笑

もし、スキャンの時点でエラーがおきるようならもう一度脆弱性データのダウンロードをし直して再スキャンしてみましょう。

脆弱性スキャン結果のレポートを出力

以下のようにしてレポートを見ます。

脆弱性のタイプなどによってCVSS(共通脆弱性評価システム)という値を一定の算出ルールの元で集計してそれによって、緊急度の高さなどをランク付けしています。

CVSS値のよる重大度の判定は9~でCritical、7~でHight、4~でMedium、それ以下でLow、0は?と判定されます。

意味の分からない記号だらけで表現されているので解読がけっこう難しいのですが、詳細はこの辺を糸口にCriticalやHighの検出から解決していくとよいでしょう。

https://www.ipa.go.jp/security/vuln/CVSS.html

脆弱性結果のサマリを1行で出力

CVSS値による集計サマリ等を表示します。

$ vuls report -format-one-line-text

One Line Summary
================
localhost       Total: 116 (Critical:2 High:30 Medium:67 Low:16 ?:1)    0/116 Fixed     872 installed   29 poc  0 exploits      cisa: 0, uscert: 3, jpcert: 1 alerts

脆弱性検出結果を1件1行ずつで出力

検出結果を1件1行の表形式で出力します。

$ vuls report -format-list
localhost (centos6.10)
======================
Total: 116 (Critical:2 High:30 Medium:67 Low:16 ?:1)
0/116 Fixed, 29 poc, 0 exploits, cisa: 0, uscert: 3, jpcert: 1 alerts
872 installed

Warning: Some warnings occurred.
[Standard OS support is EOL(End-of-Life). Purchase extended support if available or Upgrading your OS is strongly recommended.]


+------------------+------+--------+-----+-----------+---------+---------------------------------------------------+
|      CVE-ID      | CVSS | ATTACK | POC |   ALERT   |  FIXED  |                        NVD                        |
+------------------+------+--------+-----+-----------+---------+---------------------------------------------------+
| CVE-2015-4042    |  9.8 |  AV:N  | POC |           | unfixed | https://nvd.nist.gov/vuln/detail/CVE-2015-4042    |
| CVE-2015-9289    |  9.8 |  AV:N  |     |           | unfixed | https://nvd.nist.gov/vuln/detail/CVE-2015-9289    |
| CVE-2017-18198   |  8.8 |  AV:N  |     |           | unfixed | https://nvd.nist.gov/vuln/detail/CVE-2017-18198   |
| CVE-2016-4472    |  8.1 |  AV:N  |     |           | unfixed | https://nvd.nist.gov/vuln/detail/CVE-2016-4472    |
| CVE-2010-0205    |  7.8 |  AV:N  |     |           | unfixed | https://nvd.nist.gov/vuln/detail/CVE-2010-0205    |
| CVE-2011-2534    |  7.8 |  AV:L  |     |           | unfixed | https://nvd.nist.gov/vuln/detail/CVE-2011-2534    |
| CVE-2015-3288    |  7.8 |  AV:L  |     |           | unfixed | https://nvd.nist.gov/vuln/detail/CVE-2015-3288    |
| CVE-2015-4041    |  7.8 |  AV:L  | POC |           | unfixed | https://nvd.nist.gov/vuln/detail/CVE-2015-4041    |
| CVE-2016-3157    |  7.8 |  AV:L  |     |           | unfixed | https://nvd.nist.gov/vuln/detail/CVE-2016-3157    |
| CVE-2017-1000365 |  7.8 |  AV:L  |     |           | unfixed | https://nvd.nist.gov/vuln/detail/CVE-2017-1000365 |
| CVE-2017-13167   |  7.8 |  AV:L  |     |           | unfixed | https://nvd.nist.gov/vuln/detail/CVE-2017-13167   |
| CVE-2017-7294    |  7.8 |  AV:L  |     |           | unfixed | https://nvd.nist.gov/vuln/detail/CVE-2017-7294    |
| CVE-2020-0444    |  7.8 |  AV:L  |     |           | unfixed | https://nvd.nist.gov/vuln/detail/CVE-2020-0444    |
| CVE-2020-36385   |  7.8 |  AV:N  |     |           | unfixed | https://nvd.nist.gov/vuln/detail/CVE-2020-36385   |

脆弱性検出結果の詳細の全文レポート

検出結果をそれぞれ詳細な情報を出力します。

$ vuls report -format-full-text | less
0/116 Fixed, 29 poc, 0 exploits, cisa: 0, uscert: 3, jpcert: 1 alerts
872 installed

Warning: Some warnings occurred.
[Standard OS support is EOL(End-of-Life). Purchase extended support if available or Upgrading your OS is strongly recommended.]


+----------------+-------------------------------------------------------------------------------------+
| CVE-2015-4042  | UNFIXED                                                                             |
+----------------+-------------------------------------------------------------------------------------+
| Max Score      | 9.8 CRITICAL (nvd)                                                                  |
| nvd            | 9.8/CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H CRITICAL                           |
| jvn            | 9.8/CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H CRITICAL                           |
| redhat_api     | 3.7/AV:L/AC:H/Au:N/C:P/I:P/A:P LOW                                                  |
| nvd            | 7.5/AV:N/AC:L/Au:N/C:P/I:P/A:P HIGH                                                 |
| jvn            | 7.5/AV:N/AC:L/Au:N/C:P/I:P/A:P HIGH                                                 |
| Summary        | Integer overflow in the keycompare_mb function in sort.c in sort in GNU             |
|                | Coreutils through 8.23 might allow attackers to cause a denial of service           |
|                | (application crash) or possibly have unspecified other impact via long strings.     |
| Mitigation     | https://access.redhat.com/security/cve/CVE-2015-4042                                |
| Primary Src    | https://nvd.nist.gov/vuln/detail/CVE-2015-4042                                      |
| Patch          | http://openwall.com/lists/oss-security/2015/05/15/1                                 |
| Patch          | https://github.com/pixelb/coreutils/commit/bea5e36cc876ed627bb5e0eca36fdfaa6465e940 |
| Affected Pkg   | coreutils-8.4-47.el6 -> Affected                                                    |
| Confidence     | 100 / RedHatAPIMatch                                                                |
| CWE            | [CWE Top8] CWE-190: Integer Overflow or Wraparound (nvd)                            |
| CWE            | [CWE/SANS Top24]  CWE-190: Integer Overflow or Wraparound (nvd)                     |
| CWE            | [CWE Top1] CWE-119: Improper Restriction of Operations within the Bounds of a       |
|                | Memory Buffer (redhat_api)                                                          |
| CWE            | https://cwe.mitre.org/data/definitions/CWE-190.html                                 |
| CWE            | https://cwe.mitre.org/data/definitions/CWE-119.html                                 |
| nvd            | http://openwall.com/lists/oss-security/2015/05/15/1                                 |
| CWE Top25      | https://cwe.mitre.org/top25/archive/2019/2019_cwe_top25.html                        |
| SANS/CWE Top25 | https://www.sans.org/top25-software-errors/                                         |
+----------------+-------------------------------------------------------------------------------------+

+----------------+---------------------------------------------------------------------------------------------------------------------+
| CVE-2015-9289  | UNFIXED                                                                                                             |
+----------------+---------------------------------------------------------------------------------------------------------------------+
| Max Score      | 9.8 CRITICAL (jvn)                                                                                                  |
| redhat_api     | 3.3/CVSS:3.0/AV:L/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N MODERATE                                                           |
| nvd            | 5.5/CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N MEDIUM                                                             |
| jvn            | 9.8/CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H CRITICAL                                                           |
| nvd            | 4.9/AV:L/AC:L/Au:N/C:C/I:N/A:N MEDIUM                                                                               |
| jvn            | 7.5/AV:N/AC:L/Au:N/C:P/I:P/A:P HIGH                                                                                 |
| Summary        | In the Linux kernel before 4.1.4, a buffer overflow occurs when checking                                            |
|                | userspace params in drivers/media/dvb-frontends/cx24116.c. The maximum size for                                     |
|                | a DiSEqC command is 6, according to the userspace API. However, the code allows                                     |
|                | larger values such as 23.                                                                                           |
| Primary Src    | https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=1fa2337a315a2448c5434f41e00d56b01a22283c |
| Primary Src    | https://github.com/torvalds/linux/commit/1fa2337a315a2448c5434f41e00d56b01a22283c                                   |
| Primary Src    | https://nvd.nist.gov/vuln/detail/CVE-2015-9289                                                                      |
| Patch          | https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=1fa2337a315a2448c5434f41e00d56b01a22283c |
| Patch          | https://github.com/torvalds/linux/commit/1fa2337a315a2448c5434f41e00d56b01a22283c                                   |
| Affected Pkg   | kernel-2.6.32-754.35.1.el6 -> Affected                                                                              |
| Confidence     | 100 / RedHatAPIMatch                                                                                                |
| CWE            | [CWE/SANS Top3]  CWE-120: Buffer Copy without Checking Size of Input ('Classic                                      |
|                | Buffer Overflow') (redhat_api)                                                                                      |
| CWE            | [CWE Top5] CWE-125: Out-of-bounds Read (nvd)                                                                        |
| CWE            | https://cwe.mitre.org/data/definitions/CWE-120.html                                                                 |
| CWE            | https://cwe.mitre.org/data/definitions/CWE-125.html                                                                 |
| CWE Top25      | https://cwe.mitre.org/top25/archive/2019/2019_cwe_top25.html                                                        |
| SANS/CWE Top25 | https://www.sans.org/top25-software-errors/                                                                         |
+----------------+---------------------------------------------------------------------------------------------------------------------+

+----------------+----------------------------------------------------------------------------------+
| CVE-2017-18198 | UNFIXED                                                                          |
+----------------+----------------------------------------------------------------------------------+
| Max Score      | 8.8 HIGH (nvd)                                                                   |
| redhat_api     | 3.9/CVSS:3.0/AV:L/AC:L/PR:L/UI:R/S:U/C:L/I:N/A:L LOW                             |
| nvd            | 8.8/CVSS:3.0/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H HIGH                            |

コメント

タイトルとURLをコピーしました