はじめに
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を抽出するのがなるほどという感じでした