脆弱性スキャンと修正状況の確認
検査不能、影響あり、修正済みをそれぞれの根拠で説明します。
説明
脆弱性管理では、資産の一覧、検査に成功した範囲、製品やパッケージの版、修正情報を照合します。検査が失敗した資産を、問題が見つからなかった資産と同じ扱いにしないことが必要です。
架空のsample-httpとLAB-ADV-7という固定資料を使います。外から見える版と認証付き検査の版を比較し、ベンダー改訂番号による修正と再検査を確認します。
検査不能、影響あり、修正済みをそれぞれの根拠で説明します。
1資産と検査結果を開く
methodは検査方式、statusはその処理結果です。
from sp18 import *
from sp02 import show資産と検査結果を開く
db=connect()
show(db,"SELECT * FROM asset ORDER BY id")
show(db,"SELECT * FROM scan ORDER BY asset,method")db7の認証付き検査はauth_failedです。パッケージ欄のNULLを「脆弱なものがない」とは読み替えません。
2検査できなかった資産を抽出する
完了以外を先に取り出します。
show検査できなかった資産を抽出する(db,"SELECT asset,method,status FROM scan WHERE status<>'complete'")db7が出ます。資格情報、対象範囲、到達性などを確認してから再検査の対象にします。
3外部表示と認証付きの情報を比較する
同じweb7の2方式を並べます。
show外部表示と認証付きの情報を比較する(db,"SELECT method,version,revision FROM scan WHERE asset='web7' ORDER BY method")表示版はどちらも1.2.0ですが、認証付き検査ではvendor-r2まで分かります。版名の一部分だけで修正状況を決めないようにします。
4ベンダー改訂番号を含めて照合する
教材用のadvisory表にはr1とr2の影響状態があります。
show(db,"SELECT * FROM advisory ORDER BY version,revision")
show(db,"SELECT s.asset,s.revision,a.affected FROM scan s JOIN advisoryベンダー改訂番号を含めて照合する a ON s.package=a.package AND s.version=a.version AND s.revision=a.revision WHERE s.status='complete' ORDER BY s.asset")web7のr2はaffected=0です。同じ上流版でも修正が取り込まれている例です。実際の判断には対象ベンダーの修正情報を使います。
5版だけの照合が複数候補を生むことを確認する
改訂番号を条件から外します。
show版だけの照合が複数候補を生むことを確認する(db,"SELECT s.asset,a.revision,a.affected FROM scan s JOIN advisory a ON s.package=a.package AND s.version=a.version WHERE s.asset='web7' AND s.method='banner' ORDER BY a.revision")影響あり・なしの両候補が出ます。この資料だけではbannerから一つに確定できません。
6認証付き再検査の資料を反映する
db7で検査をやり直し、r1が見つかった固定例です。
db.execute("UPDATE scan SET status='complete',package='sample-http',version='1.2.0',revision='vendor-r1' WHERE asset='db7'")
show認証付き再検査の資料を反映する(db,"SELECT s.asset,a.affected FROM scan s JOIN advisory a ON s.package=a.package AND s.version=a.version AND s.revision=a.revision WHERE s.asset='db7'")affected=1です。未検査から影響ありへ状態が変わりました。検査成功と修正成功は別の段階です。
7修正後の再取得で状態を確認する
db7をr2へ更新した後の再検査資料へ置き換えます。
db.execute("UPDATE scan SET revision='vendor-r2' WHERE asset='db7'")
show修正後の再取得で状態を確認する(db,"SELECT s.asset,s.revision,a.affected FROM scan s JOIN advisory a ON s.package=a.package AND s.version=a.version AND s.revision=a.revision WHERE s.asset='db7'")r2、affected=0です。修正したという作業記録に加え、対象から再取得した版を根拠にします。重大度スコアだけでなく公開範囲や業務影響も優先順位に含めます。
まとめ
検査失敗と問題未検出を分けます。
ベンダー改訂を含む製品情報を照合します。
修正後に対象から再取得して確認します。
操作履歴と解説を振り返れます。
Python 3.15 / 固定scan資料・公開試験証明書
from sp18 import *
from sp02 import show
db=connect()
show(db,"SELECT * FROM asset ORDER BY id")
show(db,"SELECT * FROM scan ORDER BY asset,method")id | owner | critical db7 | team-b | 1 lab7 | lab | 0 web7 | team-a | 1 asset | method | status | package | version | revision db7 | credentialed | auth_failed | NULL | NULL | NULL lab7 | credentialed | complete | sample-http | 1.3.0 | vendor-r1 web7 | banner | complete | sample-http | 1.2.0 | NULL web7 | credentialed | complete | sample-http | 1.2.0 | vendor-r2
show(db,"SELECT asset,method,status FROM scan WHERE status<>'complete'")asset | method | status db7 | credentialed | auth_failed
show(db,"SELECT method,version,revision FROM scan WHERE asset='web7' ORDER BY method")method | version | revision banner | 1.2.0 | NULL credentialed | 1.2.0 | vendor-r2
show(db,"SELECT * FROM advisory ORDER BY version,revision")
show(db,"SELECT s.asset,s.revision,a.affected FROM scan s JOIN advisory a ON s.package=a.package AND s.version=a.version AND s.revision=a.revision WHERE s.status='complete' ORDER BY s.asset")id | package | version | revision | affected LAB-ADV-7 | sample-http | 1.2.0 | vendor-r1 | 1 LAB-ADV-7 | sample-http | 1.2.0 | vendor-r2 | 0 LAB-ADV-7 | sample-http | 1.3.0 | vendor-r1 | 0 asset | revision | affected lab7 | vendor-r1 | 0 web7 | vendor-r2 | 0
show(db,"SELECT s.asset,a.revision,a.affected FROM scan s JOIN advisory a ON s.package=a.package AND s.version=a.version WHERE s.asset='web7' AND s.method='banner' ORDER BY a.revision")asset | revision | affected web7 | vendor-r1 | 1 web7 | vendor-r2 | 0
db.execute("UPDATE scan SET status='complete',package='sample-http',version='1.2.0',revision='vendor-r1' WHERE asset='db7'")
show(db,"SELECT s.asset,a.affected FROM scan s JOIN advisory a ON s.package=a.package AND s.version=a.version AND s.revision=a.revision WHERE s.asset='db7'")asset | affected db7 | 1
db.execute("UPDATE scan SET revision='vendor-r2' WHERE asset='db7'")
show(db,"SELECT s.asset,s.revision,a.affected FROM scan s JOIN advisory a ON s.package=a.package AND s.version=a.version AND s.revision=a.revision WHERE s.asset='db7'")asset | revision | affected db7 | vendor-r2 | 0
演習完了