※当サイトの記事には、広告・プロモーションが含まれます。

Vuls(VULnerability Scanner)でUbuntuの脆弱性の対応が必要なのか確認してみる

nazology.net

⇧ 想像を絶しますな...

ubuntu.comのCVEの検索結果の「PACKAGE」は何のことを言っているのか

ちょっと前に、

news.mynavi.jp

Ubuntuに深刻な脆弱性って情報が公開されましたと。

で試しに、Ubuntuが管理してる脆弱性の情報を検索してみたのだけど、

ubuntu.com

⇧「PACKAGE」が何を指してるか分からんではないか...

security.stackexchange.com

There are lots of binary packagings of the upstream kernel sources for different hardware platforms and other use cases- "linux", "linux-mako", "linux-snapdragon", etc- and there are also many release lineages- Ubuntu 12.04 LTS/14.04/etc- of all those packages that are maintained concurrently.

https://security.stackexchange.com/questions/134269/how-to-read-cve-2016-5696-correctly

superuser.com

First, some background, if you try to type:

dpkg-query -W -f '${Package} -- ${Source}\n' | grep linux

in Ubuntu 18.04, you find those binary packages and their corresponding source packages. among them, you can find the following correspondence:

binary package                   source package
-----------------------------------------------     
linux-image-4.15.0-xx-generic    linux-signed       
linux-image-generic              linux-meta         
linux-generic                    linux-meta
linux-headers-4.15.0-xx          linux

https://superuser.com/questions/1452205/why-is-the-source-package-name-of-kernel-image-changed-from-linux-to-linux-si

⇧「source package」のことで良いのかしら?

そもそも、

askubuntu.com

⇧ 本当のpackage名を取得できないって話が出てるんだが...

単純に、「uname」コマンドで表示されるのが、ubuntu.comの「PACKAGE」ということで良いのだろうか?

結局、分からん...

Vuls(VULnerability Scanner)とは?

「Vuls(VULnerability Scanner)」が何なのかと言うと、

github.com

Agent-less vulnerability scanner for Linux, FreeBSD, Container, WordPress, Programming language libraries, Network devices.

Vulnerability scanner for Linux/FreeBSD, agent-less, written in Go.

https://github.com/future-architect/vuls

⇧ とのこと。

一応、www.ipa.go.jp

⇧「独立行政法人情報処理推進機構IPA:Information-technology Promotion Agency, Japan)」でも紹介されてるツールなので、信頼できるツールだとは思われる、たぶん...。

Vuls(VULnerability Scanner)を導入してみる

というわけで、導入してみようと思うのですが、

vuls.io

⇧ 2023年7月29日(土)時点で、サポートされてるOSが紹介されている。

Ubuntuもバージョン14、16、18、20、21、22 に対応してますと。

で、インストール方法ですが、ドキュメントには、

  1. Vulsctl - Quickest Vuls setup
  2. Vulsctl - Install on HostOS
  3. Install Manually
  4. Install with Docker
  5. Install with Package
  6. Install with Ansible
  7. Install with awless

の7つの方法が選択肢として公開されてるようなのですが、

devops-blog.virtualtech.jp

⇧ 上記サイト様を参考に、「2. Vulsctl - Install on HostOS」の方法でインストールすることにしました。

github.com

vuls.io

■抜粋 https://github.com/vulsio/vulsctl/blob/master/install-host/install.sh

...省略

case $distro in
	"ubuntu" | "debian" | "pop")
		apt-get update
		apt-get $OPT install sqlite3 git gcc make wget
		filename="$(wget -qO- https://golang.org/dl/ | grep -oP 'go([0-9\.]+)\.linux-amd64\.tar\.gz' | head -n 1)";
		install_go $filename
		install_vuls;;
	"raspbian")
		apt-get update
		apt-get $OPT install sqlite3 git gcc make wget
		filename="$(wget -qO- https://golang.org/dl/ | grep -oP 'go([0-9\.]+)\.linux-armv6l.tar\.gz' | head -n 1)";
		install_go $filename
		install_vuls;;
	"rhel" | "centos")
		yum $OPT install sqlite git gcc make wget
		filename="$(wget -qO- https://golang.org/dl/ | grep -oP 'go([0-9\.]+)\.linux-amd64\.tar\.gz' | head -n 1)";
		install_go $filename
		install_vuls;;
	"fedora")
		dnf $OPT install sqlite git gcc make wget
		filename="$(wget -qO- https://golang.org/dl/ | grep -oP 'go([0-9\.]+)\.linux-amd64\.tar\.gz' | head -n 1)";
		install_go $filename
		install_vuls;;
	*) # we can add more install command for each distros.
		echo "\"$distro\" is not supported distro, so please install packages manually." ;;
esac
 

シェルスクリプトUbuntuに対応してるっぽいので。

「vulsctl」ってツールを経由して「Vuls(VULnerability Scanner)」をインストールする形になるっぽいですね。

脱線しましたが、「Vuls(VULnerability Scanner)」をインストールします。

一般的には、

zenn.dev

⇧ リモートスキャンモードで検証する構成が取られるようなので、「Vuls(VULnerability Scanner)」専用のサーバーへインストールするのが良いとは思うのですが、今回は、検証対象と同じサーバーにインストールします。

まずは、

ts0818.hatenablog.com

⇧ 上記の記事で構築した環境に、SSHでログインします。

「WSL 2(Windows SubSystem for Linux 2)」のUbuntuを起動して、別のコマンドプロンプトを起ち上げて、SSHログイン。

とりあえず、一般ユーザーに切り替えて、Vulsctlというツールをダウンロード(リポジトリの複製)してくる。

git clone https://github.com/vulsio/vulsctl.git

Vulsctlというツールのシェルスクリプトの場所へ移動。

cd vulsctl/install-host

「Vuls(VULnerability Scanner)」をインストールするシェルスクリプトを実行。

sudo bash install.sh

外部の脆弱性の情報を管理しているデータベースから情報を取得するシェルスクリプトを実行。

./update-all.sh

「upgrade.sh」を実行するのに、Goをインストールしておく必要があるので、インストールします。

go.dev

⇧ 上記を参考にインストールします。

go(圧縮ファイル)をダウンロードします。

wget https://go.dev/dl/go1.20.6.linux-amd64.tar.gz

go(圧縮ファイル)を展開(解凍)を展開します。

rm -rf /usr/local/go && tar -C /usr/local -xzf go1.20.6.linux-amd64.tar.gz

設定ファイルにGoのパスを追加します。

vi /etc/profile

追加する内容。

export PATH=$PATH:/usr/local/go/bin

設定ファイルの修正を反映。

source /etc/profile

設定ファイル「~/.bashrc」「~/.profile」にGOPATHを追加しましたが、認識されず...

teratail.com

qiita.com

⇧ 上記サイト様によりますと、設定ファイルが読み込まれない原因がよく分かっていない感じ...

致し方ないので、upgrade.sh に直接、GOの環境変数を追加しました。

vi upgrade.sh

そしたらば、「Vuls(VULnerability Scanner)」に関連するモジュールを更新しておく必要があるようなので、更新用のシェルスクリプトを実行します。

sudo bash upgrade.sh

⇧ なんか、ディレクトリが見つからんって怒られてるけど...、Done.ってなってるんで完了したってことで良いんかな?

ここまで済んで、「Vuls(VULnerability Scanner)」を利用できるようになるようです。

Vuls(VULnerability Scanner)で脆弱性の対応が必要なのか確認してみる

で、vuls scanコマンドを実行することで、検証できるようなのだけど、

  1. Local Scan Mode
  2. Remote Scan Mode

の2つに大別できるっぽいのだけど、「config.toml」ってファイルを作成する必要があるらしいのですが、

vuls.io

Step3. Configuration 

Create a config file(TOML format).

$ cd $HOME
$ cat config.toml
[servers]

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

https://vuls.io/docs/en/tutorial-local-scan.html#step3-configuration

⇧ 設定ファイル作る場所が本当に、$HOMEで良いんかね...

設定ファイルのチェック。

スキャンしてみる。

結果出力してみたけど、脆弱性は無いってことで良いんかな?

ts0818@ubuntuhost:~$ vuls report -format-list -lang ja
[Jul 29 23:10:16]  INFO [localhost] vuls-v0.23.3-build-20230729_221103_a23abf4
[Jul 29 23:10:16]  INFO [localhost] Validating config...
[Jul 29 23:10:16]  INFO [localhost] cveDict.type=sqlite3, cveDict.url=, cveDict.SQLite3Path=/home/ts0818/cve.sqlite3
[Jul 29 23:10:16]  WARN [localhost] cveDict.SQLite3Path=/home/ts0818/cve.sqlite3 file not found
[Jul 29 23:10:16]  INFO [localhost] ovalDict.type=sqlite3, ovalDict.url=, ovalDict.SQLite3Path=/home/ts0818/oval.sqlite3
[Jul 29 23:10:16]  WARN [localhost] ovalDict.SQLite3Path=/home/ts0818/oval.sqlite3 file not found
[Jul 29 23:10:16]  INFO [localhost] gost.type=sqlite3, gost.url=, gost.SQLite3Path=/home/ts0818/gost.sqlite3
[Jul 29 23:10:16]  WARN [localhost] gost.SQLite3Path=/home/ts0818/gost.sqlite3 file not found
[Jul 29 23:10:16]  INFO [localhost] exploit.type=sqlite3, exploit.url=, exploit.SQLite3Path=/home/ts0818/go-exploitdb.sqlite3
[Jul 29 23:10:16]  WARN [localhost] exploit.SQLite3Path=/home/ts0818/go-exploitdb.sqlite3 file not found
[Jul 29 23:10:16]  INFO [localhost] metasploit.type=sqlite3, metasploit.url=, metasploit.SQLite3Path=/home/ts0818/go-msfdb.sqlite3
[Jul 29 23:10:16]  WARN [localhost] metasploit.SQLite3Path=/home/ts0818/go-msfdb.sqlite3 file not found
[Jul 29 23:10:16]  INFO [localhost] kevuln.type=sqlite3, kevuln.url=, kevuln.SQLite3Path=/home/ts0818/go-kev.sqlite3
[Jul 29 23:10:16]  WARN [localhost] kevuln.SQLite3Path=/home/ts0818/go-kev.sqlite3 file not found
[Jul 29 23:10:16]  INFO [localhost] cti.type=sqlite3, cti.url=, cti.SQLite3Path=/home/ts0818/go-cti.sqlite3
[Jul 29 23:10:16]  WARN [localhost] cti.SQLite3Path=/home/ts0818/go-cti.sqlite3 file not found
[Jul 29 23:10:16]  INFO [localhost] Loaded: /home/ts0818/results/2023-07-29T23-07-33+0900
[Jul 29 23:10:16]  INFO [localhost] Skip OVAL and Scan with gost alone.
[Jul 29 23:10:16]  INFO [localhost] localhost: 0 CVEs are detected with OVAL
[Jul 29 23:10:17]  INFO [localhost] localhost: 0 CVEs are detected with gost
[Jul 29 23:10:17]  INFO [localhost] localhost: 0 CVEs are detected with CPE
[Jul 29 23:10:18]  INFO [localhost] localhost: 0 PoC are detected
[Jul 29 23:10:18]  INFO [localhost] localhost: 0 exploits are detected
[Jul 29 23:10:18]  INFO [localhost] localhost: Known Exploited Vulnerabilities are detected for 0 CVEs
[Jul 29 23:10:18]  INFO [localhost] localhost: Cyber Threat Intelligences are detected for 0 CVEs
[Jul 29 23:10:18]  INFO [localhost] localhost: total 0 CVEs detected
[Jul 29 23:10:18]  INFO [localhost] localhost: 0 CVEs filtered by --confidence-over=80

localhost (ubuntu20.04)
=======================
Total: 0 (Critical:0 High:0 Medium:0 Low:0 ?:0)
0/0 Fixed, 0 poc, 0 exploits, cisa: 0, uscert: 0, jpcert: 0 alerts
712 installed

No CVE-IDs are found in updatable packages.
712 installed

う~む、とりあえず、脆弱性は見つからなかったということで良いんか?

もし、Ubuntu自体をアップグレードする場合は、

qiita.com

⇧ バックアップを忘れないように注意ですかね。

それにしても、Vulsのドキュメントもなかなに分かり辛い...

Vlusの環境が本当に構築できているのかがハッキリしませんな...

毎度モヤモヤ感が半端ない...

今回はこのへんで。

 

NG集

失敗したパターン。

おそらく、「WSL 2(Windows SubSystem for Linux 2)」がちょっと特殊なのが原因ではありそう。

事象としては、Bashが設定ファイルを認識してくれないという...

まずは、「WSL 2(Windows SubSystem for Linux 2)」のUbuntuを起動しログインします。

git がインストールされてる必要があるようなので、git がインストールされてるか確認。

dpkg -l | grep -i git  
which git  

git はインストールされているようなので、「vulsctl」をダウンロードします。

git clone https://github.com/vulsio/vulsctl.git

ダウンロード(リポジトリが複製)された場所に移動。

cd vulsctl/install-host/  

そしたらば、「Vuls(VULnerability Scanner)」をインストールするシェルスクリプトを実行します。

bash install.sh

成功したのかどうかが分からんけど、「Done.」とあるのでシェルスクリプトの実行が完了したってことらしい。
で、ドキュメントに『Fetch Vulnerability Databases』とあるように、外部で公開されている脆弱性にまつわる情報を管理しているデータベースの情報をダウンロードするシェルスクリプトを実行する必要があるようです。

かなりの時間がかかります。(自分の環境では、3時間ぐらいかかりました...)

./update-all.sh

考えてみたら、「Vuls(VULnerability Scanner)」は別サーバーにインストールして、対象のサーバーについて脆弱性を検証するようにすべきでしたね...

公式だとDockerコンテナから、ホストOSに関しての脆弱性を検証するようにしてますが、

⇧ Dockerコンテナだと、コンテナのプロセスが落ちることが多いイメージがあるから、常駐プロセスとして「Vuls(VULnerability Scanner)」を稼働させるのが心許ない気もするのだけど、どうなんだろうか?

何にせよ、「Vuls(VULnerability Scanner)」で必要とする情報が多そうなので、「Vuls(VULnerability Scanner)」専用のマシンを用意する必要はありそうですかね。

一般的には、

zenn.dev

⇧ リモートスキャンモードで検証する構成が取られるようなので。

まぁ、実際の開発現場では、保守運用チームが良しなに環境整備してくれてるとは思うので、アプリケーション開発者が気にすることでは無いと思うけども。

脱線しましたが、「Vuls(VULnerability Scanner)」のモジュールを更新するシェルスクリプトを実行します。

 

はい、エラー。Goのパスの設定が必要らしい...ドキュメントに記載なかったんだけどな...

そもそも、UbuntuにGoがインストールされてないような気がするんだが...

分からんけど、Goをインストールすることにします。

go.dev

⇧ 上記を参考にインストールします。

go(圧縮ファイル)をダウンロードします。

wget https://go.dev/dl/go1.20.6.linux-amd64.tar.gz

go(圧縮ファイル)を展開(解凍)を展開します。

wget https://go.dev/dl/go1.20.6.linux-amd64.tar.gz

設定ファイルにGoのパスを追加します。

vi /etc/profile

# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

if [ "${PS1-}" ]; then
  if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

export PATH=$PATH:/usr/local/go/bin

設定ファイルの修正を反映。

source /etc/profile

「3.Install Manually」のインストール方法の方で、

vuls.io

Add these lines into /etc/profile.d/goenv.sh (you'll need sudo access)

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

https://vuls.io/docs/en/install-manually.html

⇧ って記載があるから、設定しときますか。

と思ったんだけど、そもそも「/etc/profile.d/goenv.sh」なんてファイル存在しない...ドキュメントが適当過ぎる...

仕方ないので、「/etc/profile.d/goenv.sh」というファイルを新規作成して、設定を追加で。

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

/etc/profile.d/goenv.shファイルの中身。

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

設定を反映。

source /etc/profile.d/goenv.sh

改めて、「upgrade.sh」を実行するも、

エラー。GOPATHが設定されていない?

設定されているんだが...

またしても、「WSL 2(Windows SubSystem for Linux 2)」の痴れ者のせいでした...

ascii.jp

 やはり前回説明した、/etc/profileは一般的なLinuxの場合システムコンソールからの起動では実行されるが、WSLの場合、/etc/profileは実行されず、bashは「インタラクティブ・シェル」として起動される。このため、WSLでは/etc/profileに何か記述しても実行されることがない。この部分、Linux一般としては正しくとも、WSLの記述としては、前回の記述は誤解させてしまう内容だった。ここでお詫びさせていただく。

ASCII.jp:Windows Subsystem for LinuxのBashの初期設定【後編】

 WSLで最初に起動するbashは、「ログイン・シェル」ではなく「インタラクティブ・シェル」になっているようだ。つまり、bashが起動するまでに実行されるのは、

/etc/bash.bashrc
~/.bashrc

の2つだけだ。

ASCII.jp:Windows Subsystem for LinuxのBashの初期設定【後編】

⇧ 全然、完全なLinux環境を実現できていないんだが...

むしろ、誤ったLinuxの知識が身に付くので最早、悪影響なんだが...

「WSL 2(Windows SubSystem for Linux 2)」でも有効な設定ファイルにGOPATHを追記する。

変わらんのだけど...

ちなみに、「.profile」「.bashrc」にも設定してみたけど、駄目でした...

■$HOME 配下のbashの設定ファイル

root@ubuntuhost:~# ls -la $HOME
total 104
drwx------ 13 root root  4096 Jul 29 21:55 .
drwxr-xr-x 19 root root  4096 Jul 30 09:21 ..
lrwxrwxrwx  1 root root    27 Dec 18  2021 .aws -> /mnt/c/Users/Toshinobu/.aws
lrwxrwxrwx  1 root root    29 Dec 18  2021 .azure -> /mnt/c/Users/Toshinobu/.azure
-rw-------  1 root root 12880 Jul 29 23:41 .bash_history
-rw-r--r--  1 root root  3219 Jul 29 21:55 .bashrc
drwxr-xr-x  3 root root  4096 Jan  3  2023 .bundle
drwx------  7 root root  4096 Jul 29 15:30 .cache
drwxr-xr-x  3 root root  4096 Jul 29 16:38 .config
drwxr-xr-x  5 root root  4096 Jan 30  2022 .docker
drwxr-xr-x  4 root root  4096 Jul 17 15:17 .local
-rw-r--r--  1 root root     0 Jul 30 09:21 .motd_shown-rw-r--r--  1 root root  4548 Jul 29 18:13 .profile
-rw-------  1 root root    66 Jan  8  2023 .python_history
drwx------  2 root root  4096 Jun  2 22:57 .ssh
drwxr-xr-x  2 root root  4096 Dec 17  2022 .vim
-rw-------  1 root root 11806 Jul 29 21:55 .viminfo
drwxr-xr-x  4 root root  4096 Jul 18 17:53 .vscode-remote-containers
drwxr-xr-x  5 root root  4096 Mar  1  2021 .vscode-server
-rw-r--r--  1 root root   249 Jul 29 18:34 .wget-hsts
drwxr-xr-x  5 root root  4096 Jul 29 12:44 go
drwxr-xr-x  3 root root  4096 Dec 29  2022 snap
-rw-r--r--  1 root root  3359 Jan 10  2023 twitter_tweepy.py

■/home/ts0818 配下のbashの設定ファイル

root@ubuntuhost:~# ls -la /home/ts0818
total 103700
drwxr-xr-x 8 ts0818 ts0818      4096 Jul 29 23:10 .
drwxr-xr-x 4 root   root        4096 Dec 16  2022 ..
-rw------- 1 ts0818 ts0818     10535 Jul 29 23:41 .bash_history
-rw-r--r-- 1 ts0818 ts0818       220 Dec 16  2022 .bash_logout
-rw-r--r-- 1 ts0818 ts0818      3866 Jul 29 20:19 .bashrc
drwx------ 5 ts0818 ts0818      4096 Jul 29 19:47 .cache
-rw-r--r-- 1 ts0818 ts0818       807 Dec 16  2022 .profile
drwx------ 2 ts0818 ts0818      4096 Dec 17  2022 .ssh
-rw-r--r-- 1 ts0818 ts0818         0 Dec 27  2022 .sudo_as_admin_successful
-rw------- 1 ts0818 ts0818     11545 Jul 29 23:06 .viminfo
drwx------ 2 ts0818 ts0818      4096 Jul 29 22:55 .vuls
-rw-rw-r-- 1 ts0818 ts0818       175 Dec 29  2022 .wget-hsts
-rw-rw-r-- 1 ts0818 ts0818        72 Jul 29 23:06 config.toml
-rw-r--r-- 1 ts0818 ts0818    204800 Jul 29 23:10 cve.sqlite3
-rw-r--r-- 1 ts0818 ts0818    315392 Jul 29 23:10 go-cti.sqlite3
-rw-r--r-- 1 ts0818 ts0818     90112 Jul 29 23:10 go-exploitdb.sqlite3
-rw-r--r-- 1 ts0818 ts0818     20480 Jul 29 23:10 go-kev.sqlite3
-rw-r--r-- 1 ts0818 ts0818     40960 Jul 29 23:10 go-msfdb.sqlite3
-rw-r--r-- 1 ts0818 ts0818    274432 Jul 29 23:10 gost.sqlite3
drwxr-xr-x 8 ts0818 ts0818      4096 Dec 27  2022 kafka_2.13-3.3.1
-rw-rw-r-- 1 ts0818 ts0818 105053134 Oct  3  2022 kafka_2.13-3.3.1.tgz
-rw-r--r-- 1 ts0818 ts0818     86016 Jul 29 23:10 oval.sqlite3
drwx------ 3 ts0818 ts0818      4096 Jul 29 23:07 results
drwxrwxr-x 5 ts0818 ts0818      4096 Jul 29 18:32 vulsctl

「.bash_profile」は存在しないから、「.profile」が無視されるってことはないと思うのだけど...

blog1.mammb.com

⇧ 上記サイト様によりますと、bashが読み込む設定ファイルで、

  • .profile
  • .bashrc

のどちらかは読み込まれるような気がするのだけど、「WSL 2(Windows SubSystem for Linux 2)」環境下だと挙動が異なるのか?

qiita.com

⇧ 上記サイト様を見ても、「.bashrc」が読み込まれるような気がするんだが...

というわけで、bashの設定ファイルによるGOPATHが解決できず...

実行するシェルスクリプトのファイルの中に、直接、GOPATHを設定することで動作しました。

「WSL 2(Windows SubSystem for Linux 2)」環境のUbuntuBashが参照する設置ファイルが特定できれば解決できるのかもしらんけど...

相変わらず、「WSL 2(Windows SubSystem for Linux 2)」の動作がブラックボックス過ぎて、気が滅入る...