本文へ移動します

未来に繋ぐセキュリティ情報発信

Microsoft Defender for Endpoint で収集した脆弱性情報を KQL で出力してみた

安藤 翔一

こんにちは。Microsoft 製品を使用したサービス開発を行っている安藤です。

皆さまは Microsoft Defender for Endpoint の脆弱性管理機能を活用されておりますでしょうか。
Microsoft Defender for Endpoint では Endpoint Detection and Response(EDR)の機能が大部分を占めますが、アセットのテレメトリ情報を収集し、当該アセットにインストールされているプログラムおよびプログラムバージョンの特定が可能です。また、特定できたプログラムおよびプログラムバージョンが脆弱性を含んでいる場合、当該脆弱性情報を確認することが可能です。

今回は Microsoft Defender for Endpoint において収集している脆弱性情報を Kusto Query Language(以下、KQL)を使用してデータの整形、出力をする方法についてご紹介します。

Microsoft Defender for Endpoint の脆弱性情報収集

Microsoft Defender for Endpoint は、Windows 10、Windows 11 であればエージェントレスで利用可能です。予め OS にビルトインされている EDR 機能のサービスプロセスがマシンの状態を確認して脅威を検出した場合は“リアルタイム”にアラートの発報が行われます。
しかし、アセットのテレメトリ情報、脆弱性情報はリアルタイムではなく”1日に一度”のタイミングで更新されます。リアルタイムでの情報更新ではない点に注意してください。

Advanced Hunting でアセットと脆弱性情報を収集する

Microsoft Defender for Endpoint の Advanced Hunting は Microsoft Defender ポータルの[調査と対応 > 追及 > 高度な追及]から操作することができます。

脆弱性情報は DeviceTvmSoftwareVulnerabilities というスキーマを使用します。詳細は以下のページを参照してください。

※参考:マイクロソフト社「高度なハンティング スキーマの DeviceTvmSoftwareVulnerabilities テーブル」

KQL クエリを実行するには[エディターでクエリを実行する]を選択してください。

エディターに DeviceTvmSoftwareVulnerabilities を入力いただくか、エディター左側のスキーマをダブルクリックして入力します。非常に多くのデータが出力される恐れがあるため、limit や where を使用して件数にフィルタをかけることを推奨します。

Shift + Enter キーを押下するか、[クエリを実行する]ボタンをクリックして実行します。

このスキーマでは脆弱性を含むソフトウェア名、ソフトウェアバージョンが出力されます。

アセット情報や脆弱性情報を紐づける場合は DeviceId や CveId をキーとして join します。以下のクエリを実行しています。

DeviceTvmSoftwareVulnerabilities
| join kind=leftouter (
    DeviceInfo | summarize arg_max(Timestamp, *) by DeviceId
) on DeviceId
| join kind=leftouter (
    DeviceTvmSoftwareVulnerabilitiesKB
    //WorkaroundがあるDescriptionをparse
    | parse VulnerabilityDescription with "Summary: " VulnerabilitySummary "Impact: " VulnerabilityImpact "Workaround: " VulnerabilityWorkaround "Remediation: " VulnerabilityRemediation
    //WorkaroundがないDescriptionをparse
    | parse VulnerabilityDescription with "Summary: " VulnerabilitySummary "Impact: " VulnerabilityImpact "Remediation: " VulnerabilityRemediation
) on CveId
| limit 1

リスクレベル別に件数を数える

ここまでご紹介したのは脆弱性情報の詳細を含めて脆弱性ごとに出力する KQL クエリです。組織全体の現状を俯瞰するためにリスクレベル別に件数を数えてみます。
まずは DeviceTvmSoftwareVulnerabilities の VulnerabilitySeverityLevel カラム別に件数を集計します。以下のクエリを実行しています。

let rank = pack_array("Low","Medium","High","Critical");
DeviceTvmSoftwareVulnerabilities
| summarize count() by VulnerabilitySeverityLevel
| extend rankRowNum = array_index_of(rank, VulnerabilitySeverityLevel)
| sort by rankRowNum desc | project-away rankRowNum 

次に DeviceTvmSoftwareVulnerabilities の CvssScore カラムの値で集計しますが、CvssScore の範囲を定めた深刻度レベルを CVSSv3 に則り定義し、深刻度レベル別に集計します。深刻度レベルの定義については以下のページをご参照ください。

※参考:IPA独立法人情報処理推進機構「共通脆弱性評価システムCVSS v3概説」

以下のクエリを実行しています。

let rank = pack_array("なし","注意","警告","重要","緊急");
DeviceTvmSoftwareVulnerabilities | join kind=leftouter (DeviceTvmSoftwareVulnerabilitiesKB) on CveId
| extend CVSSLevel = case(
    9.0 <= CvssScore and CvssScore <= 10.0, "緊急",
    7.0 <= CvssScore and CvssScore <= 8.9, "重要",
    4.0 <= CvssScore and CvssScore <= 6.9, "警告",
    0.1 <= CvssScore and CvssScore <= 3.9, "注意",
    CvssScore == 0, "なし",
    "[記載なし]"
)
| summarize count() by CVSSLevel
| extend rankRowNum = array_index_of(rank, CVSSLevel)
| sort by rankRowNum desc | project-away rankRowNum

Known Exploited Vulnerabilities カタログをエンリッチ

外部の評価基準となる Known Exploited Vulnerabilities カタログ(以下、KEV カタログ)のデータをエンリッチします。幸いにも KEV カタログはデータが json で公開されているため、externaldata でクエリから取り込むことができます。KEV カタログに掲載されている脆弱性とアセットの組み合わせが組織内に何件存在するか確認するため、以下のクエリを実行します。

DeviceTvmSoftwareVulnerabilities
| join kind=leftouter (
externaldata (title: string, catalogVersion: string, dateReleased: string, ["count"]: int, vulnerabilities: dynamic)
[@"https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json"]
with(format="multijson")
| mv-expand vulnerabilities
| evaluate bag_unpack(vulnerabilities)
| project
    CveId = cveID,
    dateAdded,
    dueDate,
    product,
    requiredAction,
    shortDescription,
    notes,
    vendorProject,
    vulnerabilityName,
    kevFlag = true
) on CveId
| extend kevFlag = tostring(iff(isempty(kevFlag), false, kevFlag))
| summarize count() by kevFlag

まとめ

ここまでお読みいただきありがとうございました。中には脆弱性とアセットの組み合わせの数が膨大にあり、どのように対応を進めるべきか悩まれる方もいらっしゃるのではないかと思います。当社では Microsoft Defender for Endpoint のひとつの機能である脆弱性可視化機能を有効活用するための仕組みの検討を進めており、お悩みのお客様と共にベストプラクティスを検討できればと思っておりますので、ご興味がございましたらお気軽にお問い合わせください。

お問い合わせ

製品・サービスに関するお問い合わせはお気軽にご相談ください。

セキュリティソリューションに関する資料請求・お問い合わせ

関連製品・サービス

開催中のセミナー

最新トレンドや業務に役立つ知識が得られる SBテクノロジーのセミナー 参加無料 オンデマンド配信あり

ホワイトペーパー

SBT セキュリティサーベイ 2023

ピックアップ

セミナー情報
クラウドエンジニアブログ
NOZ
メールマガジン登録