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 |
コメント