⇧ 想像を絶しますな...
ubuntu.comのCVEの検索結果の「PACKAGE」は何のことを言っているのか
ちょっと前に、
で試しに、Ubuntuが管理してる脆弱性の情報を検索してみたのだけど、
⇧「PACKAGE」が何を指してるか分からんではないか...
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
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
⇧「source package」のことで良いのかしら?
そもそも、
⇧ 本当のpackage名を取得できないって話が出てるんだが...
単純に、「uname」コマンドで表示されるのが、ubuntu.comの「PACKAGE」ということで良いのだろうか?
結局、分からん...
Vuls(VULnerability Scanner)とは?
「Vuls(VULnerability Scanner)」が何なのかと言うと、
Agent-less vulnerability scanner for Linux, FreeBSD, Container, WordPress, Programming language libraries, Network devices.
Vulnerability scanner for Linux/FreeBSD, agent-less, written in Go.
⇧ とのこと。
⇧「独立行政法人情報処理推進機構(IPA:Information-technology Promotion Agency, Japan)」でも紹介されてるツールなので、信頼できるツールだとは思われる、たぶん...。
Vuls(VULnerability Scanner)を導入してみる
というわけで、導入してみようと思うのですが、
⇧ 2023年7月29日(土)時点で、サポートされてるOSが紹介されている。
Ubuntuもバージョン14、16、18、20、21、22 に対応してますと。
で、インストール方法ですが、ドキュメントには、
- Vulsctl - Quickest Vuls setup
- Vulsctl - Install on HostOS
- Install Manually
- Install with Docker
- Install with Package
- Install with Ansible
- Install with awless
の7つの方法が選択肢として公開されてるようなのですが、
⇧ 上記サイト様を参考に、「2. Vulsctl - Install on HostOS」の方法でインストールすることにしました。
■抜粋 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
「vulsctl」ってツールを経由して「Vuls(VULnerability Scanner)」をインストールする形になるっぽいですね。
脱線しましたが、「Vuls(VULnerability Scanner)」をインストールします。
一般的には、
⇧ リモートスキャンモードで検証する構成が取られるようなので、「Vuls(VULnerability Scanner)」専用のサーバーへインストールするのが良いとは思うのですが、今回は、検証対象と同じサーバーにインストールします。
まずは、
⇧ 上記の記事で構築した環境に、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(圧縮ファイル)をダウンロードします。
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を追加しましたが、認識されず...
⇧ 上記サイト様によりますと、設定ファイルが読み込まれない原因がよく分かっていない感じ...
致し方ないので、upgrade.sh に直接、GOの環境変数を追加しました。
vi upgrade.sh
そしたらば、「Vuls(VULnerability Scanner)」に関連するモジュールを更新しておく必要があるようなので、更新用のシェルスクリプトを実行します。
sudo bash upgrade.sh
⇧ なんか、ディレクトリが見つからんって怒られてるけど...、Done.ってなってるんで完了したってことで良いんかな?
ここまで済んで、「Vuls(VULnerability Scanner)」を利用できるようになるようです。
Vuls(VULnerability Scanner)で脆弱性の対応が必要なのか確認してみる
で、vuls scanコマンドを実行することで、検証できるようなのだけど、
- Local Scan Mode
- Remote Scan Mode
の2つに大別できるっぽいのだけど、「config.toml」ってファイルを作成する必要があるらしいのですが、
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自体をアップグレードする場合は、
⇧ バックアップを忘れないように注意ですかね。
それにしても、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)」専用のマシンを用意する必要はありそうですかね。
一般的には、
⇧ リモートスキャンモードで検証する構成が取られるようなので。
まぁ、実際の開発現場では、保守運用チームが良しなに環境整備してくれてるとは思うので、アプリケーション開発者が気にすることでは無いと思うけども。
脱線しましたが、「Vuls(VULnerability Scanner)」のモジュールを更新するシェルスクリプトを実行します。
はい、エラー。Goのパスの設定が必要らしい...ドキュメントに記載なかったんだけどな...
そもそも、UbuntuにGoがインストールされてないような気がするんだが...
分からんけど、Goをインストールすることにします。
⇧ 上記を参考にインストールします。
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」のインストール方法の方で、
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
⇧ って記載があるから、設定しときますか。
と思ったんだけど、そもそも「/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)」の痴れ者のせいでした...
やはり前回説明した、/etc/profileは一般的なLinuxの場合システムコンソールからの起動では実行されるが、WSLの場合、/etc/profileは実行されず、bashは「インタラクティブ・シェル」として起動される。このため、WSLでは/etc/profileに何か記述しても実行されることがない。この部分、Linux一般としては正しくとも、WSLの記述としては、前回の記述は誤解させてしまう内容だった。ここでお詫びさせていただく。
WSLで最初に起動するbashは、「ログイン・シェル」ではなく「インタラクティブ・シェル」になっているようだ。つまり、bashが起動するまでに実行されるのは、
/etc/bash.bashrc
~/.bashrc
の2つだけだ。
⇧ 全然、完全な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」が無視されるってことはないと思うのだけど...
⇧ 上記サイト様によりますと、bashが読み込む設定ファイルで、
- .profile
- .bashrc
のどちらかは読み込まれるような気がするのだけど、「WSL 2(Windows SubSystem for Linux 2)」環境下だと挙動が異なるのか?
⇧ 上記サイト様を見ても、「.bashrc」が読み込まれるような気がするんだが...
というわけで、bashの設定ファイルによるGOPATHが解決できず...
実行するシェルスクリプトのファイルの中に、直接、GOPATHを設定することで動作しました。
「WSL 2(Windows SubSystem for Linux 2)」環境のUbuntuのBashが参照する設置ファイルが特定できれば解決できるのかもしらんけど...
相変わらず、「WSL 2(Windows SubSystem for Linux 2)」の動作がブラックボックス過ぎて、気が滅入る...