公開日:2024/04/23 最終更新日:2024/04/23

JVNTA#90371415
WindowsカーネルドライバーのIOCTL処理におけるアクセス制御不備の脆弱性

概要

第三者が提供するWindowsカーネルドライバーに、IOCTL処理におけるアクセス制御不備の脆弱性が報告されています。

影響を受けるシステム

  • IOCTLインタフェースを実装したWindowsカーネルドライバー
Carbon Blackの研究者により、複数のWDF(Windows Driver Framework)およびWDM(Windows Driver Model)カーネルドライバーに本脆弱性が存在することが報告されています。

詳細情報

WindowsのカーネルドライバーにIOCTLインタフェースを実装することで、ユーザプロセスからカーネルドライバーの動作を制御することが可能になります。
カーネルドライバーはシステムのすべてのリソースにアクセスできるため、その制御を行うユーザは一定の権限を持っていること、アクセスするリソースは一定の範囲のみ、といった制限を実装することが重要です。

カーネルドライバーが、IOCTLリクエストの処理に関してアクセス権限の設定や入力データの検証を適切に行っていない場合、予期せぬユーザに操作されたり、想定外の動作をさせられたりする可能性があります。

想定される影響

具体的な影響はカーネルドライバーが提供している機能によって異なりますが、ファームウェアの消去や改ざん、権限昇格などにつながる例が報告されています。
また、管理者権限を持ったユーザが任意の脆弱なカーネルドライバーをロードしてIOCTLリクエストを送ることにより、EDR等に使われるセキュリティ機構の無効化、ファームウェアレベルでのサービス運用妨害(DoS)攻撃、ルートキット(ブートキット)のインストールなどを行う可能性があります。このような、脆弱なドライバーをシステムに持ち込んで悪用する手法は、BYOVD(Bring Your Own Vulnerable Driver)攻撃と呼ばれています。

対策方法

ドライバーベンダが実施できる対策
Microsoftは、カーネルドライバーの開発者向けにDriver Security Guidanceを公開しています。以下に、このガイダンスの中から基本的かつ効果の高いものを紹介します。

デバイスオブジェクトへのアクセスを管理者に限定する
ユーザプロセスがIOCTLリクエストを送信するためには、カーネルドライバーが生成したデバイスオブジェクトのハンドルを取得する必要があります。デバイスオブジェクトへのアクセスを管理者のみに限定することで、IOCTLリクエストを悪用した権限昇格を防ぐことができます。具体的には、ドライバーインストールのための設定ファイルであるinfファイル内に記述(INF AddReg directiveのSecurity項目)するか、WdmlibIoCreateDeviceSecureもしくはWdfControlDeviceInitAllocate等のAPIを使ってソースコード内で明示的に指定します。

入力できる値の範囲を限定する
デバイスオブジェクトへのアクセスを管理者に限定することで権限昇格を防ぐことができますが、ドライバーの仕様として管理者以外のユーザからのアクセスを許可しなければいけないケースもあります。また、管理者権限を持っているユーザによるBYOVD攻撃を防ぐことはできません。
より汎用的な対策は、IOCTLリクエストで受け付ける入力値の範囲を限定することです。例えば、ハードウェアポートに対する入出力を実行するIOCTLリクエストを処理する際には、IOCTLリクエストに含まれるポート番号やデータが想定される値の範囲内であることを確認します。物理アドレスに対する入出力(memory-mapped I/O)で指定されるアドレスやサイズ、MSR(Model-Specific Register)/CR(Control Register)等で指定されるレジスタインデックスおよびデータについても同様です。
本対策による一例として、Sangoma Technologiesによるcg6kwin2k.sysの修正が挙げられます。具体的には、物理アドレスに対する入出力で指定されるアドレス範囲が、Sangoma TechnologiesのPCIeアダプタによって使用されているアドレスの範囲内に収まっているかを確認し、範囲外であれば入出力を行わないようになりました。

Sangoma Technologies による cg6kwin2k.sys の memory-mapped I/O コードの修正
Sangoma Technologies による cg6kwin2k.sys の memory-mapped I/O コードの修正

ユーザが実施できる対策
既知の脆弱性修正済みのドライバーを使用する
使用しているカーネルドライバーのリリース状況を確認し、既知の脆弱性を修正済みのバージョンに更新します。カーネルドライバーの配布形態によっては、該当する顧客のみに通知するケースもあります。公開情報だけではなくドライバーベンダからの個別の注意喚起も確認してください。

最新のWindowsオペレーティングシステムを使用する
Microsoftは脆弱なドライバーブロックリストを公開しています。Windows 11 2022 update以降の初期状態では、このリストに含まれているドライバーのロードをブロックする設定になっています。
Carbon Blackが報告したカーネルドライバー群についても2024年1月にリストに追加されている模様ですが、執筆時点(2024年4月22日)で最新版のWindows 11 23H2 (OS build 22631.3447)では、そのドライバー群のロードをブロックしませんでした。

サードバーティの脆弱なドライバーのリストを活用する
Microsoftの脆弱なドライバーのブロックリストは年に1、2回の頻度でしか更新されません。そのため、脆弱性が公表されたばかりのドライバーはカバーできていない可能性があります。Microsoftの脆弱なドライバーブロックリストでは網羅できていない情報を収集する手段として、サードバーティによって管理されているリストを活用することができます。このようなリストの例としてはLOLDriversがあります。

ベンダ情報

参考情報

  1. Carbon Black
    Hunting Vulnerable Kernel Drivers
  2. Japan Vulnerability Notes JVNVU#93886750
    Phoenix Technologies製WindowsカーネルドライバーにおけるIOCTLに対する不十分なアクセス制御の脆弱性
  3. Japan Vulnerability Notes JVNVU#97149791
    Advanced Micro Devices製WindowsカーネルドライバーにおけるIOCTLに対する不十分なアクセス制御の脆弱性
  4. Japan Vulnerability Notes JVNVU#90671953
    Sangoma Technologies製CG/MG family driver cg6kwin2k.sysにおけるIOCTLに対する不十分なアクセス制御の脆弱性

JPCERT/CCからの補足情報

JPCERT/CCによる脆弱性分析結果

謝辞

本文書はBroadcom 春山敬宏氏とJPCERT/CCが共同で執筆しました。

関連文書

JPCERT 緊急報告
JPCERT REPORT
CERT Advisory
CPNI Advisory
TRnotes
CVE
JVN iPedia