はじめに
Vulsがどうやってインストールされたパッケージとそのバージョンに対応するCVEを見つけ出すのか疑問に思いました。
GolangもVulsも何も分からないので間違ってたら突っ込んでください
関数呼び出しリスト(?
こういうときどういう図にすれば良いかわかんないですね…
ローカルのCentOSをDeep Scanする場合を仮定しています。主要なものだけ抜き出してます。
()は深さ?みたいなもののつもりです
(0) commands/scan.go Execute
vuls scanされたとき呼び出される
(1) scan/serverapi.go Scan
serverapiは全部のOSのベース
(2) scan/serverapi.go scanVulns
Vulnsはvulnerabilitiesの略
(3) scan/redhatBase.go scanPackages
serverapiを継承?したやつ。
CentOSはredhat系なのでここ。スキャンするパッケージを探し、スキャンする
(4) scan/redhatBase.go scanInstalledPackages
rpm -qaコマンドを実行し、インストールされているパッケージのNAME,EPOCH,VERSION,RELEASE,ARCHを取得する
(4) scan/redhatBase.go scanUpdatablePackages
rpmquery --pkgnarrow=updatesを実行し、インストールされているパッケージのうちアップデート可能なもののNAME,EPOCH,VERSION,RELEASE,ARCHを取得する。
(4) scan/redhatBase.go scanUnsecurePackages
アップデート可能なパッケージのうち、インストールされているパッケージから最新のパッケージまでの間で修正されているCVEを取得する
Vulsがどういうソフトか理解して無くてこれに気づくのに時間がかかった…
(5) scan/redhatBase.go fillChangelogs
CentOSの場合は、ChangelogからしかCVEの修正情報が取得できないので、まずはChangelogを集める
(6) scan/redhatBase.go fillDiffChangelogs
ここでいうDiffは、バージョン間の差分という意味っぽい
(7) scan/redhatBase.go getDiffChangelog
もしインストールされているの以上のバージョンのChangelogがあれば、そのChangelogを返す。
無ければepochを抜いてもう一度試す
見つからなければエラー
(6) scan/redhatBase.go scanChangelogs
ChangelogからCVEIDを探す
(3) scan/base.go convertToModel
VulnInfoをScanReport.ScannedCvesに入れる
後はWebから見るなりTUIから見るなりご自由に
おわりに
ここまでで、現在インストールされているバージョン以降で修正されたCVE IDのリストを取得できました。
- その修正されたCVEが現在インストールされているバージョン向けなのか?
- OVALで見ているような気がする…。goval-directoryを見る限り、CVE毎にstart_version:end_versionのデータがあるっぽいので大小比較してる…?
 
- OVALで見ているような気がする…。goval-directoryを見る限り、CVE毎に
- そのパッケージが対象だが未修正のCVEはどうするのか
- 修正されてないんだから対応しようがないのでは?もしくはパッケージ名とバージョンから、上と同じようにOVALでCVEを取得しているのかも
 
個人的にはChangelogからCVEを抽出するのがなるほどという感じでした