👨‍⚕️

VulsでOSの判定に失敗する場合は環境変数のTERMを設定すると解消するかもしれない

2022/12/05に公開

問題

Vulsvuls configtest を実行した際にOSが正しく判定されないケースがありました。

次は Amazon Linux 2 のホスト target-host に対して vuls configtest した際のログを抜粋したものです。

time="Dec  1 00:00:00" level=info msg="(1/1) Detected: target-host: amazon unknown"

次のようにリリースコード Karoo が表示される事を期待するのですが、そうなっていません。

time="Dec  1 00:00:00" level=info msg="(1/1) Detected: target-host: amazon 2 (Karoo)" 

(おそらく)これに関連して vuls scan を実行してもエラーになるケースがあります。

対策

vuls コマンドを実行する前に、次のように環境変数 TERM に適当な値を設定すると解消する可能性があります。

export TERM=xterm

原因

vuls configtest をデバッグで実行した時のログを確認すると、次のようになっていました。

time="Dec  1 00:00:00" level=debug msg="execResult: servername: target-host\n  cmd: /usr/bin/ssh -tt -F /root/.ssh/config -l ec2-user -p 22 target-host stty cols 1000; cat /etc/system-release\n  exitstatus: 0\n  stdout: tput: No value for $TERM and no -T specified\r\nAmazon Linux release 2 (Karoo)\r\n\n  stderr: Warning: Permanently added '[xx.xx.xx.xx]:22' (RSA) to the list of known hosts.\r\nWarning: Permanently added 'xx.xx.xx.xx' (ECDSA) to the list of known hosts.\r\nConnection to xx.xx.xx.xx closed.\r\nKilled by signal 1.\r\n\n  err: %!s(<nil>)"

注目すべきは標準出力 stdout の部分です。

tput: No value for $TERM and no -T specified\r\nAmazon Linux release 2 (Karoo)

https://github.com/future-architect/vuls/blob/v0.21.1/scanner/redhatbase.go#L275 によると、v0.21.1 では ls /etc/system-release の標準出力に対して、前方一致で Amazon Linux release 2 をチェックしています。しかし、実際の標準出力結果は OS 情報の前に tput のメッセージが出力されているのでマッチしません。そのため、Amazon Linux 2 である事しか判別出来ていません。

同様に、vuls scan でもインストール済みパッケージの読み取りがエラーになるのですが、ログには tput のメッセージが表示されています。

time="Dec  1 00:00:00" level=error msg="Error on target-host, err: [Failed to scan installed packages:\n    github.com/future-architect/vuls/scanner.(*redhatBase).scanPackages\n        /go/src/github.com/future-architect/vuls/scanner/redhatbase.go:382\n  - Failed to parse installed packages. err:\n    github.com/future-architect/vuls/scanner.(*redhatBase).scanInstalledPackages\n        /go/src/github.com/future-architect/vuls/scanner/redhatbase.go:468\n  - Failed to parse package line: tput: No value for $TERM and no -T specified\r:\n    github.com/future-architect/vuls/scanner.(*redhatBase).parseInstalledPackagesLine\n        /go/src/github.com/future-architect/vuls/scanner/redhatbase.go:539]" 

そもそもなぜ環境変数 TERM が空になっているのか、なぜ同じ Amazon Linux 2 でも問題が発生する環境としない環境があるのかは不明ですが、Vuls を実行前に、その値を設定しておくことでこの問題に対処することができました。

export TERM=xterm

Discussion