脆弱性情報と資産の照合
教材用のLAB-ADVという架空の勧告を使い、修正済みの資産と検査できなかった資産を確認します。CVSSや悪用情報を自社資産の状態に結び付け、対応対象を絞る方法を学びます。
説明
脆弱性の深刻度スコアだけでは、どの資産から対応すべきかは決まりません。対象製品と修正版の確認、認証付き検査の成否、外部から届く経路、業務への影響を合わせて判断します。
教材用のLAB-ADVという架空の勧告を使い、修正済みの資産と検査できなかった資産を確認します。CVSSや悪用情報を自社資産の状態に結び付け、対応対象を絞る方法を学びます。
1勧告の対象版を読む
cvssは評価値、known_exploitedは勧告に記載された悪用の確認状況を表します。
from oplab import *
db=connect(13)
show(db, 'SELECT勧告の対象版を読む * FROM advisories ORDER BY id')sample-apiはr1が対象でr2が修正版です。実製品では版の比較規則やバックポート情報も確認します。
2検査の認証状態を確認する
検査結果だけでなくauthを並べて読みます。
show(db, 'SELECT検査の認証状態を確認する * FROM scans ORDER BY id')web8は認証に失敗したversion_onlyです。検査が正常終了した非該当と扱わないようにします。
3資産台帳の版を照合する
製品と対象revisionを合わせます。この固定資料ではrevisionの完全一致で影響を判定します。
show(db, 'SELECT資産台帳の版を照合する a.id,a.revision,v.id AS advisory,a.revision=v.affected_revision AS affected FROM assets a JOIN advisories v USING(product) ORDER BY a.id')web8はr2で、この勧告の対象版ではありません。スキャンの曖昧な結果と、認証された資産情報を合わせて再確認します。
4外部から届く対象を絞る
この限定した経路モデルでは、public_routeとport_openの両方を必要条件とします。
show(db, 'SELECT外部から届く対象を絞る id,business FROM assets WHERE public_route=1 AND port_open=1 ORDER BY id')web7とweb8が外部到達の候補です。実ネットワークでは認証、プロキシ、追加のフィルターなども考慮します。
5影響版と到達性と悪用情報を合わせる
三つの条件を満たす資産を優先調査対象として抽出します。
show(db, 'SELECT影響版と到達性と悪用情報を合わせる a.id,a.business,a.owner,v.cvss FROM assets a JOIN advisories v USING(product) WHERE a.revision=v.affected_revision AND a.public_route=1 AND a.port_open=1 AND v.known_exploited=1')web7が対象です。高いスコアだけでなく、影響版、到達性、悪用情報という理由を添えて優先度を説明できます。
6外部に出ていない対象も残す
優先対象以外を「対応不要」と落とさず、影響版の一覧を残します。
show(db, 'SELECT外部に出ていない対象も残す a.id,a.business,a.owner,a.public_route FROM assets a JOIN advisories v USING(product) WHERE a.revision=v.affected_revision ORDER BY a.id')job7にも是正が必要です。外部経路がないことは、内部からの攻撃や将来の構成変更に対して影響が消えたことを意味しません。
まとめ
job7にも是正が必要です。外部経路がないことは、内部からの攻撃や将来の構成変更に対して影響が消えたことを意味しません。
表示された証拠IDと検索条件を残すと、調査結果を元の記録までたどれます。
操作履歴と解説を振り返れます。
Python 3.15 / SQLite・固定の調査記録
from oplab import *
db=connect(13)
show(db, 'SELECT * FROM advisories ORDER BY id')id | product | affected_revision | fixed_revision | cvss | known_exploited LAB-ADV-7 | sample-api | r1 | r2 | 9.8 | 1 LAB-ADV-8 | sample-worker | r1 | r2 | 7.5 | 0
show(db, 'SELECT * FROM scans ORDER BY id')id | asset | advisory | auth | result s1 | web7 | LAB-ADV-7 | ok | affected s2 | web8 | LAB-ADV-7 | failed | version_only s3 | job7 | LAB-ADV-8 | ok | affected
show(db, 'SELECT a.id,a.revision,v.id AS advisory,a.revision=v.affected_revision AS affected FROM assets a JOIN advisories v USING(product) ORDER BY a.id')id | revision | advisory | affected job7 | r1 | LAB-ADV-8 | 1 web7 | r1 | LAB-ADV-7 | 1 web8 | r2 | LAB-ADV-7 | 0
show(db, 'SELECT id,business FROM assets WHERE public_route=1 AND port_open=1 ORDER BY id')id | business web7 | orders web8 | reports
show(db, 'SELECT a.id,a.business,a.owner,v.cvss FROM assets a JOIN advisories v USING(product) WHERE a.revision=v.affected_revision AND a.public_route=1 AND a.port_open=1 AND v.known_exploited=1')id | business | owner | cvss web7 | orders | web-team | 9.8
show(db, 'SELECT a.id,a.business,a.owner,a.public_route FROM assets a JOIN advisories v USING(product) WHERE a.revision=v.affected_revision ORDER BY a.id')id | business | owner | public_route job7 | nightly | batch-team | 0 web7 | orders | web-team | 1
演習完了