【セキュリティ対策|実務向け】深刻度だけで判断していませんか?KEVカタログを活用したリスクベース脆弱性管理の実践

1. 導入:なぜ「深刻度スコア」だけでは不十分なのか

近年のセキュリティ現場において、脆弱性対応の工数不足は深刻な課題です。CVSSのスコア(深刻度)が高い順から対応する手法は一般的ですが、現実には「High」や「Critical」の脆弱性が溢れかえっており、全てを即座にパッチ適用するのは不可能です。特に、ネットワーク機器(VPN等)を狙った攻撃は増加しており、深刻度が「Medium」であっても、実際に悪用が確認されている場合は即時対応が求められます。本稿では、「攻撃の実態」に基づいたリスクベースの優先順位付けを実現する方法を解説します。

2. 基礎知識:KEVカタログと脆弱性トリアージ

KEVカタログ (Known Exploited Vulnerabilities Catalog) とは、米国CISAが公開している「実際に攻撃者が悪用していることが確認された脆弱性」のリストです。
従来の脆弱性管理は「システムの脆弱性(=穴の深さ)」に注目していましたが、現代の管理手法では「攻撃者の動向(=泥棒が窓を狙っているか)」を加味するリスクベースのアプローチが不可欠です。深刻度(CVSS)だけでなく、KEVカタログとの照合を行うことで、対応すべき脆弱性を劇的に絞り込むことができます。

3. 実装/解決策:PythonによるKEVカタログ照合の自動化

手作業での照合は困難であるため、CISAが提供するKEVカタログのJSONデータを取得し、自社の脆弱性リスト(CSV等)と照合するスクリプトを活用するのが効率的です。以下に、KEVカタログに含まれる脆弱性ID(CVE)を抽出し、自社環境のリストと照合するサンプルプログラムを示します。

4. サンプルプログラム

import requests
import csv

CISA KEVカタログのURL
KEV_URL = “https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json”

def get_kev_list():
“””CISA KEVカタログから現在悪用されているCVEリストを取得する”””
response = requests.get(KEV_URL)
data = response.json()
# 悪用が確認されているCVE-IDをセットで抽出
return {v[‘cveID’] for v in data[‘vulnerabilities’]}

def check_vulnerabilities(my_vulns_file):
“””自社の脆弱性リストとKEVカタログを照合する”””
kev_list = get_kev_list()

print(f”— 危険な脆弱性の警告リスト —“)
with open(my_vulns_file, ‘r’) as f:
reader = csv.DictReader(f) # CSV形式の自社脆弱性リストを想定
for row in reader:
cve_id = row[‘cve_id’]
# 自社の脆弱性がKEVリストに含まれているか確認
if cve_id in kev_list:
print(f”【緊急対応】{cve_id} がKEVカタログに掲載されています!直ちにパッチ適用を検討してください。”)

実行例(my_vulns.csvには cve_id カラムが必要)
check_vulnerabilities(‘my_vulns.csv’)

5. 応用・注意点:現場で陥りやすい罠

・「KEVにない=安全」ではない
KEVカタログは「既に悪用が確認されたもの」です。未知の攻撃(ゼロデイ)や、公開直後の脆弱性には対応していない場合があります。あくまで「優先順位付けの基準の一つ」として活用してください。
・SBOM(ソフトウェア部品表)との連携
ネットワーク機器だけでなく、内部で使用しているライブラリにも脆弱性は潜んでいます。SBOMを導入し、どの機器やアプリケーションでどのライブラリを使っているかを可視化することで、KEVカタログとの照合精度が向上します。
・自動化の運用
脆弱性情報は日々更新されます。スクリプトをCI/CDパイプラインや日次バッチに組み込み、常に最新のKEV情報と照合する仕組みを構築しましょう。

深刻度という「静的な指標」に、KEVカタログという「動的な脅威情報」を組み合わせることが、限られたリソースで最大限のセキュリティを確保する唯一の近道です。

コメント

タイトルとURLをコピーしました