LoginSignup
1
2

More than 5 years have passed since last update.

Vulsはどうやって脆弱性を見つけるか

Last updated at Posted at 2018-10-30

はじめに

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

Vulnsvulnerabilitiesの略

(3) scan/redhatBase.go scanPackages

serverapiを継承?したやつ。
CentOSredhat系なのでここ。スキャンするパッケージを探し、スキャンする

(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

VulnInfoScanReport.ScannedCvesに入れる

後はWebから見るなりTUIから見るなりご自由に

おわりに

ここまでで、現在インストールされているバージョン以降で修正されたCVE IDのリストを取得できました。

  • その修正されたCVEが現在インストールされているバージョン向けなのか?
    • OVALで見ているような気がする…。goval-directoryを見る限り、CVE毎にstart_version:end_versionのデータがあるっぽいので大小比較してる…?
  • そのパッケージが対象だが未修正のCVEはどうするのか
    • 修正されてないんだから対応しようがないのでは?もしくはパッケージ名とバージョンから、上と同じようにOVALでCVEを取得しているのかも

個人的にはChangelogからCVEを抽出するのがなるほどという感じでした

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2