Cisco Japan Blog

脆弱な Windows ドライバに関する分析

2 min read



今回の投稿内容は、Bring Your Own Vulnerable Driver(BYOVD)攻撃手法の実際の応用例に関する調査結果と、Cisco Talos が行ってきた悪意のある Windows ドライバについての一連の投稿を基にしています。調査結果の一部は、2024 年 12 月上旬にチェンナイで開催された AVAR カンファレンスpopup_iconで発表されたものです。

ドライバに存在する脆弱性の分析に関して、これまで研究に貢献されてきた Connor McGarr 氏popup_iconRussell Sanford 氏popup_iconRyan Warns 氏popup_iconTim Harrison 氏popup_iconMichal Poslušný 氏popup_iconに謝意を表します。

Talos は、脆弱な Windows ドライバのリサーチを行う中で、攻撃者によくエクスプロイトされる脆弱性のクラスと、エクスプロイト後に攻撃者が一般的に展開するペイロードについて調査しました。既知の脆弱なドライバを意図的にインストールし、時間をおいてエクスプロイトする手法は、Bring Your Own Vulnerable Driver(BYOVD)と呼ばれています。

BYOVD 攻撃手法

攻撃者は、目的を果たすために、脆弱なドライバを使用して数々のアクションを実行します。Talos が行ったリサーチで、以下で説明する 3 つの主要ペイロードの使用が確認されました。これらのペイロードとともに、ランサムウェアグループに関連する最近の活動も明らかになっています。これは、攻撃者が脆弱な Windows ドライバをエクスプロイトして目的を達成している実際の例です。

脆弱なドライバと一般的なペイロード

ローカル特権昇格(カーネル/システムに対する管理者権限)

任意のカーネルメモリ書き込みの脆弱性について考えた場合、最も一般的なペイロードの 1 つに、悪意のあるプロセスの特権昇格があります。プロセスのアクセス権限は、プライマリアクセストークンの構造体に保存されます。この構造体は _EPROCESS 構造体(個々のプロセスに関する情報を保持するために Windows カーネルが使用するカーネルモード構造体)の文書化されていないオフセットに格納されています。Vergilius Project には、_EPROCESS 構造体popup_iconなど、文書化されていないほぼすべての Windows 構造体についてのドキュメントとオフセットが掲載されており、攻撃側の研究者も防御側も参照できます。

非特権プロセスの権限を昇格させる一般的な方法は、カーネルメモリで上位の特権プロセスの _EPROCESS 構造体を見つけて、非特権プロセスのアクセストークンを特権プロセスのものに置き換えることです。カーネルメモリ空間の読み取りと書き込みで脆弱なドライバを使用できるのであれば、比較的簡単に実行できます。

Windows プロセスのプライマリアクセストークンが格納されている _EPROCESS 構造体(『インサイド Windows 7 版』より)

たとえば、特権昇格は以下の手順で実行できます。

  1. _EPROCESS 構造体/オブジェクトを 1 つ見つけます。
  2. 例として、ユーザーモードで ntoskernel.exe をロードし、PsInitialSystemProcess の RVA を計算します。PsInitialSystemProcess は、ブートプロセス中にメモリ内に ntoskernel.exe がロードされると、システムプロセス(ID:0x04)の _EPROCESS 構造体をポイントします。
  3. NtQuerySystemInformation((SYSTEM_INFORMATION_CLASS) 11, ModuleInfo, 1024 * 1024, NULL))) // 11 = SystemModuleInformation を使用して ntoskernel の VA を見つけ、脆弱なドライバを使用してオフセットを読み取り、RVA を追加してカーネルメモリで _EPROCESS 構造体を見つけます。
  4. 脆弱なドライバの読み取りまたはメモリコピー機能を使用して、既知のオフセットからトークンを読み取ります。
  5. _EPROCESS を解析して、他の _EPROCESS のリンクリストをポイントする ActiveProcess のリンクメンバーを見つけ、下位の特権プロセスが見つかるまで繰り返します。
  6. 脆弱なドライバのカーネルメモリ書き込み機能を使用して、非特権プロセスのアクセストークンを、SYSTEM プロセスから以前保存したもので上書きします。

未署名のカーネルコードのロード

ドライバに存在する任意のカーネルメモリ書き込みの脆弱性は、未署名の悪意のあるコードをカーネルメモリ空間に展開するために使用されます。コードの形式は、シェルコードまたは未署名の悪意のあるドライバのいずれかです。未署名デバイスドライバをロードするユーティリティには、オープンソースのものが複数あります。一例を挙げると、Lenovo Mapperpopup_icon が「sexy_girl_addy.exe」(2024 年 5 月に VirusTotal にアップロードされたゲームチートユーティリティ)を開発するためのベースとして使用されました。このユーティリティは、Lenovo Mapper のコードを使用して、『Valorant』というゲームの TPM ベースのライセンスチェックを無効化しようとするドライバをロードします。

前述した任意のメモリ書き込みの脆弱性(CVE-2022-3699)を使用して未署名のチートドライバを展開するために、Lenovo Mapper のコードを利用

Valorant ライセンスチェックを回避するために、チートによって TPM ドライバ機能を無効化

EDR ソフトウェアやゲームチート対策ソフトウェアのバイパス

脆弱なドライバをエクスプロイトして EDR ツールを終了させるマルウェアについて説明するにあたり、2024 年 9 月の Gh0stRAT 攻撃を例にしたいと思います。ドロッパーは、実行ファイル「nthandlecallback.exe」、脆弱性のある Dell バイナリ ユーティリティ ドライバ「dbutil_2_3.sys」のほか、「tree.exe」という名前の ZIP ファイルをドロップします。この ZIP には、実行ファイル「EDR.exe」、DLL ファイル「irrlicht.dll」、暗号化ファイル「server.log」が含まれています。「EDR.exe」は、オープンソースツールである RealBlindingEDRpopup_icon の一種で、EDR プログラムを無効化するために使用されます。暗号化されたファイルから Gh0stRAT の最終ペイロードを復号する DLL を最初の実行ファイルがロードする際に、Dell のバイナリ ユーティリティ ドライバに存在する任意のメモリ書き込みの脆弱性をエクスプロイトして EDR プログラムを無効化します。

2024 9 月、EDR ドライバを無効化するために Gh0stRAT 攻撃で使用された RealBlindingEDR

RealBlindingEDR は、エンドポイント セキュリティ ソフトウェアの無効化を目的に開発された数あるオープンソースツールの 1 つに過ぎません。こうしたツールは攻撃にもレッドチーム演習にも使用されます。

Dbutil_2_3.sys は、RealBlindingEDR による EDR ツールの無効化に対応したドライバの 1

その他のペイロード

脆弱なドライバ(主に、アクセス制御が不適切だとされるドライバ)は、高度な攻撃で使用されてきました。たとえば Shamoon 攻撃では、ハードドライブの上書きに Eldos の RawDisk ドライバが使用されました。また、2022 年 2 月の HermeticWiper では、「EaseUS Partition Master」ドライバのパーティションマネージャである「empntdrv.sys」のプロキシ物理ディスク書き込みドライバがドライブの上書きに使用されました。HermeticWiper には、Windows のバージョンと、オペレーティングシステムのデフォルトのワードメモリのサイズに応じて、4 つの埋め込みリソース(ワイパーが使用するドライバの圧縮コピー)が含まれていました。

さまざまなバージョンの「EaseUS Partition Master」パーティション マネージャ ドライバが、リソースとして HermeticWiper コードに埋め込まれている

BYOD を悪用したランサムウェアの例

脆弱なドライバをエクスプロイトする EDR バイパスツールが普及したことで、高度な攻撃者の領域から、ランサムウェアを主とする一般的な脅威の領域へとエクスプロイトが移行したのは当然だと言えます。BYOVD 手法を用いる既知のランサムウェアグループの一部をここで紹介します。

1 月:Kasseika

2024 年 1 月、Kasseika のランサムウェア攻撃者は、正規の VirIT ウイルス対策ソフトウェアの一部である脆弱なドライバ「viragt64.syspopup_icon」を悪用し、セキュリティツールとシステムユーティリティに関連した事前定義済みの 991 のプロセスを無効化しました。サービスとしてのランサムウェア(RaaS)の活動は 2023 年から積極的に展開されており、二重恐喝の手口が使用されていますが、データリークサイトは運営されていません。最近の攻撃では、ランサムウェアは最初にスクリプトを実行して、「Martini.exe」という悪意のある実行ファイルや「Martini.syspopup_icon」という名前に変更された脆弱なドライバなど、さまざまなツールをロードします。次に、Kasseika が新しいサービスを作成して開始し、ドライバが悪意のある実行ファイルにロードされます。

この実行ファイルは、ハードコードされたプロセスリストを検出するために環境のスキャンを開始します。検出された場合、制御コードがドライバに送られ、プロセスの終了が可能になります。

3 月:Akira

2024 年 3 月、Akira が正規の署名済み Zemana Anti-Malware カーネルドライバ「zamguard64.syspopup_icon」を PowerTool を介して悪用し、カーネルレベルで EDR を無効化したことが確認されました。Zemana の zamguard ドライバのエクスプロイトは、2023 年 5 月から違法なマーケットプレイスで販売されるようになった人気の Terminator EDR Killer ツールの主要コンポーネントでした。

7 月:Qilin

2024 年 7 月、Qilin ランサムウェアグループ(RaaS モデルで活動している別のグループ)が「Killer Ultrapopup_icon」という新しいマルウェアを攻撃に使用していることが確認されました。Killer Ultra には、BYOVD 手法によるセキュリティツール停止など、多数の機能があります。既知の任意プロセス終了の脆弱性を悪用して、Zemana Anti-Keylogger ドライバに影響を与えるもので、CVE-2024-1853 として追跡されています。この脆弱性により、攻撃者はプロセスを終了できるようになります。Killer Ultra が実行されると、脆弱なドライバが解凍され、一連のセキュリティツールを検出して無効化するための新しいサービスが作成されます。

7 月:BlackByte

Talos は最近、BYOVD 手法を使用してホストの暗号化を促進した 2024 年 7 月の BlackByte 攻撃の進展を観察し、文書化しました。この新種の暗号化ツールは、BlackByte による通常の BYOVD 攻撃チェーンの一部として 4 つの脆弱なドライバをドロップすることが確認されました。それまでのレポートでは 2 つまたは 3 つのドライバがドロップされると説明されており、増加しています。ドライバの構成は、元々はシステム オーバークロック ユーティリティである MSI Afterburner が使用するドライバ RtCore64.syspopup_icon、Dell クライアントファームウェア更新ユーティリティの一部であるドライバ DBUtil_2_3.syspopup_icon、すでに紹介した、別の攻撃者もエクスプロイトしている Zemana Anti-Malware(ZAM)アプリケーションの一部であるドライバ zamguard64.syspopup_icon、GIGABYTE マザーボード用の GIGABYTE Tools ソフトウェアパッケージの一部であるドライバ gdrv.syspopup_icon となっています。

Talos インシデント対応チーム(Talos IR)が調査したすべての BlackByte 攻撃では、暗号化ツールのバイナリによって 4 つのドライバの名前が変更され、ドロップされていました。脆弱な各ドライバの命名規則は似ており、ランダムな 8 文字の英数字の後にアンダースコアと数値(1 つずつ増加)が続く形式で名称が付けられています。

8 月:RansomHub

2024 年 8 月、RansomHub ランサムウェアの攻撃者が EDRKillShifter として知られる新しいマルウェアを使用して、ランサムウェアバイナリを実行する前にセキュリティツールを無効化していたことが確認されました。EDRKillShifter は、脆弱な正規ドライバのローダーとして機能します。エクスプロイトされると、持続的に防御が回避されるようになります。攻撃者が最近使用したエクスプロイトは GitHub で見つかったコンセプト実証に関連するもので RentDrv2popup_icon を利用しています。他の事例では ThreatFireMonitorpopup_icon というドライバがエクスプロイトされました。攻撃者は、パスワードで保護された EDRKillShifterpopup_icon バイナリを起動してプロセスを開始していました。これにより、メモリに埋め込まれたリソースが復号された後、実行されます。続いて、ペイロードが解凍・実行され、標的となった脆弱な正規ドライバがエクスプロイトされます。この方法で特権昇格が行われ、アクティブな EDR プロセスが無効化されます。

その後、マルウェアによってドライバ用の新しいサービスが作成・開始され、システムにロードされていました。最終的に、ハードコードされている標的プロセスのリストに一致するプロセスの継続的なスキャンとプロセス終了に至り、再起動時であっても持続的に防御が回避されるようになっています。

RansomHub と Qilin による BYOVD 手法の採用は、金銭目的の脅威グループ Scattered Spiderpopup_icon のメンバーが両ランサムウェアグループと協力関係を結んだことが関係していると考えられます。この新たな協力関係は 2024 年 7 月に確認され、情報が公開されましたが、それよりも前に関係が構築されていた可能性があります。Scattered Spider のメンバーは、遅くとも 2022 年 12 月から BYOVD の手口を用いていたpopup_iconことが判明しています。

Windows ドライバと脆弱性

高難度化する悪意のある Windows ドライバの作成

悪意のある Windows カーネルドライバを新たに作成するのは、ますます困難になっています。新しい Windows ドライバには、開発者による有効な拡張検証(EV)証明書の署名が必要で、Microsoft Hardware Lab Kit(HLK)互換性テストに合格しなければならず、Microsoft Dev Portal の署名も求められます。

しかし、この複雑なプロセスは、新たに作成される Windows カーネルモードドライバまたはユーザーモードドライバに導入されるものであり、既存のドライバには適用されません。つまり、有効な証明書で署名されたレガシードライバであれば、Windows カーネル空間にロードできるわけです。

ドライバには他の Windows カーネルコンポーネントと同じアクセス許可が与えられているので、脆弱な既存のレガシードライバのインストールとエクスプロイトは、カーネルデータ構造体に変更を加えたり、カーネルでコードを実行したりするための数少ない方法の 1 つになる場合があります。

レガシードライバの脆弱性のエクスプロイトは、カーネルの脆弱性をエクスプロイトすることと同じ

Microsoft 社は、この問題に対処するために、既知の脆弱なドライバのブロックリストを導入しました。当初、このリストは Windows Defender アプリケーション制御機能に含まれていましたが、Windows 新バージョンでは Windows セキュリティ アプリケーションに引き継がれました。

Windows 11 2022 Update を実行しているシステム、またはハードウェア仮想化コードの整合性(HVCI)が有効なシステムでは、脆弱なドライバのブロックリストがデフォルトでオンになっていますが、脆弱なドライバが展開された場合や、ブロックリストにない脆弱なドライバが新たに見つかった場合は、多くのシステムが攻撃を受ける可能性があります。

BYOVD ドライバに存在する一般的な脆弱性のクラス

Talos は、BYOVD 攻撃で一般的に使用される脆弱な Windows カーネルドライバの調査を行う中で、よくエクスプロイトされる脆弱性のクラスを特定しました。任意の MSR 書き込み、任意のカーネルメモリ書き込み、そしてドライバ機能の不適切なアクセス制御の 3 つです。この分類は厳密なものではなく、1 つのドライバが複数の脆弱性クラスに属する場合もあります。

任意の MSR 読み取り/書き込みの脆弱性

このクラスを見ていくにあたって、最初に CPU のモデル固有レジスタ(MSR)について説明しておきます。MSR とは、CPU とオペレーティングシステムがさまざまな目的(キャッシングメカニズムの制御、ファンの速度の制御、ユーザーモードからカーネルモードへの移行など)で使用する追加の CPU レジスタです。MSR は固有の数字でアドレス指定でき、人間が判読できる名前が付けられていることもあります。

特定の MSR は、win32 API 関数を呼び出した後の、ユーザーモードからカーネルモードへの移行にとって重要な役割を果たす

なお、カーネルモードからユーザーモードへの移行は、システムコール番号がレジスタ rax に格納され、syscall または「int 0x2e」命令が実行されたときに、ユーザーモード最下位の DLL 層(通常は「ntdll.dll」)で行われます。移行中、syscall 命令により命令ポインタ(RIP)が更新され、カーネル内のシステムコールハンドラのアドレスと、カーネル空間のスタックを指すスタックポインタ(RSP)に設定されます。

最初に実行する関数は「KiSystemCall64」です。ここで、Windows はカーネルモードの実行開始場所をどのようにして知るのか、という疑問が浮かびます。その答えは、ユーザーモードからカーネルモードへの移行中に使用される MSR にあります。64 ビット Windows システムの場合は IA32_LSTAR(MSR 0xC0000082)であり、これには syscall 命令(通常は関数 KiSystemCall64)のカーネルモード エントリポイントのアドレスが格納されています。

MSR 0xc0000082 に、カーネルモードで最初に実行される命令のアドレスを格納

攻撃者が任意の MSR に書き込みを行えるようになった場合、KiSystemCall64 へのポインタを、カーネルのコンテキストでコードを実行できる悪意のある関数へのポインタに置き換える可能性があります。

任意の MSR の変更に対して脆弱なドライバの例としては、WinRing0 ドライバが挙げられます。マイナーの能力向上を目的としてキャッシングなどのプロセッサ機能を無効化するために、暗号通貨マイニングソフトウェア XMRig によって広く使用されているドライバです。WinRing0 はオープンソースやクローズドソースの多くのプログラムにも含まれています。残念ながら、このドライバは任意の MSR 書き込みの脆弱性にもさらされているため、Windows 8 より前のバージョンの Windows ではカーネルモードのコード実行に、それ以降のバージョンの Windows では特権昇格popup_iconにつながる恐れがあります。最新バージョンの Windows では、仮想化ベースのセキュリティ(詳細は後述)など最新のエクスプロイト軽減策がデフォルトで有効になっているので、リスクは軽減されています。

WinRing0 ドライバは任意の MSR 書き込みの脆弱性にさらされている

任意のカーネル物理メモリ読み取り/書き込みの脆弱性

頻繁に使用される BYOVD ドライバの脆弱性クラスの 2 つ目は、任意のカーネルメモリ書き込みです。この場合、任意のメモリに書き込みを行えるドライバ機能が書き込みプリミティブとして使用され、カーネルメモリへのシェルコードの展開、または重要なカーネルデータ構造体の変更によって、悪意のあるユーザーモードプロセスの特権昇格が行われます。

このクラスの脆弱性が存在するドライバは数多くあり、そのほとんどはきちんと文書化されています。カーネルメモリ書き込みを許可する脆弱なドライバの例については、loldriverspopup_icon プロジェクトを参照してください。

以下のカーネル関数のいずれかを使用するドライバは、この脆弱性クラスに該当する可能性があります。ただし、ユーザーがアクセス可能なデバイス I/O 制御コード(IOCTL)を通じてユーザーバッファとターゲットアドレスがドライバに供給されるという結論を出すには、さらなる分析が必要です。

Access to Physical Memory

MmMapIOSpace()

ZwMapViewOfSection()

PCI Config Space Access

HalSetBusDataByOffset()

HalGetBusDataByOffset()

Memory Copying Operations

memcpy()

memmove()

 

この脆弱性グループの良い例が CVE-2022-3699(任意のメモリ読み取り/書き込みを許可する Lenovo ドライバの脆弱性)です。

CVE-2022-3699:アクセス可能な Lenovo ドライバの MmMapIoSpace 関数を介したメモリ書き込み

アクセス制御が不適切な Windows ドライバの既存機能の悪用

BYOVD ドライバによる攻撃で見られる脆弱性クラスの 3 つ目は既存のドライバ機能の悪用であり、不適切なアクセス制御に起因します。

INF ファイルは、ドライバのインストール時に使用されるファイルです。いろいろな情報が記述されていますが、このファイルには、SDDL 言語を使用して指定されるドライバのアクセス許可も含まれています。セキュリティ記述子定義言語(SDDL)はドメイン固有の言語であり、コンポーネントが文字列の形式を使用してアクセス制御リスト(ACL)を生成できるようにします。これは、ユーザーモードとカーネルモードのどちらのプログラミングでも利用されています。下の図で示しているのは、デバイスオブジェクトに対する SDDL 文字列の構造です。

Access 値は、許可されたアクセスのタイプを指定します。SID 値は、Access 値の適用先(例:ユーザーまたはグループ)を決定するセキュリティ識別子を指定します。たとえば、「D:P(A;;GA;;;SY)(A;;GR;;;WD)」という文字列は、システム(SY)に対してはすべてへのアクセスを許可し、他のすべてのユーザー(WD)に対しては読み取りアクセスのみを許可します。

セキュリティ記述子定義言語の文字列により、ドライバオブジェクトに対するアクセス許可を管理

Windows カーネルドライバのプログラミングは、短期間での習得が求められます。結果として多くのドライバには、SDDL アクセス許可をはじめとして、テンプレートやサンプルドライバからコピーしたコードが含まれています。ドライバを作成する際、アクセス許可が不適切になってしまい、本来は上位特権レベルのユーザーだけがアクセスすべき機能に非特権ユーザーがアクセスできるようになる可能性があります。

不適切なアクセス許可を持つ脆弱なドライバの良い例が、TG Soft 社が開発した古いバージョンのマルウェア対策ソフトウェアドライバ「viragt64.sys」(VirIT Agent System)です。カーネルモードからプロセスを終了させる機能を、下位特権レベルのユーザーに公開しています。このドライバは、他のマルウェア対策製品や EDR 製品を終了させることを目的に、Kasseikapopup_icon などのランサムウェア攻撃者が使用しています。

カーネルモードから任意のプロセスを終了させるために、デバイス IOCTL 制御コード 0x82730030 が使用されている

viragt64.sys ZwTerminateProcess を使用して任意のプロセスを終了しているが、不適切なアクセス制御が原因で攻撃者に悪用される可能性がある

Talos は、頻繁に使用される BYOVD ドライバの脆弱性クラスの文書化に加え、脆弱なドライバのエクスプロイト後に、脅威や望ましくない可能性があるアプリケーションによって一般的に送り込まれるペイロードの調査を行い、ローカル特権昇格、未署名コードのロード、EDR 機能のバイパスといった複数のグループに分類しました。

最新の Windows 軽減策と脆弱なドライバ

悪意のあるコードのカーネルメモリへのロードは、攻撃者が利用できる最も強力なペイロードの 1 つです。この方法は、Windows Vista より前の、ドライバの署名が必要なかった初期の Windows で頻繁に用いられました。未署名のコードをカーネルモードにロードする機能は、Sinowal や TDL4 などの Windows カーネルルートキットを作成する動機付けになりました。こうしたルートキットは、カーネルプログラムとデータ構造体を変更することによって悪意のあるペイロードの存在を防御者から隠すことを目的に設計されています。

これらの脅威とカーネルのエクスプロイトに対応するため、Microsoft 社は、Patch Guard として知られるカーネル パッチ プロテクション(KPP)を x64 バージョンの Windows XP SP3 に導入しました。これに続いて、x64 Windows Vista でドライバの署名が必須となりました。

Windows カーネルに軽減策が導入されたことで、攻撃者と Microsoft 社の間で競争が起こりました。新たに導入された軽減策に攻撃者はすぐに対応し、Patch Guard への対処として、デジタル署名の適用をオフにする方法を明らかにし、Microsoft 社はさらなる軽減策を打ち出しました。時間とともに、Windows カーネルのエクスプロイトは高難度化することになります。次は、Windows 10 と 11 に実装された 4 つのエクスプロイト対策機能について簡単に説明します。

仮想化ベースのセキュリティ(VBS)

仮想信頼レベル(VTL)は、仮想化ベースのセキュリティ(VBS)の主要概念です。分離された実行環境を作ってシステムセキュリティを強化するように設計されています。VTL は、ハードウェアの仮想化を利用し、メインのオペレーティングシステムで動作する潜在的にセキュリティの低いコードから機密プロセスを分離して保護します。

VTL は基本的に、同じ物理マシン内の異なるセキュリティレベル(環境)を指し、それぞれが異なる信頼レベルを提供します。VTL の主な目的は、信頼のある操作とデータをシステムの他の部分から分離させ、改ざんを防止することです。Windows では、主な VTL レベルが 2 種類あります。

  • VTL0:標準的な信頼レベルです。従来のオペレーティングシステムと、ユーザーモードとカーネルモードのすべてのアプリケーションが動作します。
  • VTL1:上位の信頼レベルです。機密性の高いセキュリティ機能の実行や、重要なデータの保存に使用されます。これは VTL0 とは切り分けられています。つまり、VTL0 の操作では、VTL1 のコードやデータに直接アクセスしたり変更したりすることはできません。VTL1 は、暗号化キー、パスワードハッシュ、セキュリティトークン(ログイン情報保護)などの機密情報の保存に使用されます。

仮想化ベースのセキュリティ概念における上位レベルのアーキテクチャ(『インサイド Windows 7 上』より)

カーネルのさまざまな部分を異なる信頼レベル(異なる仮想マシン)で実行することで、Windows は第 2 レベルのアドレス変換popup_icon(SLAT)を使用して、アクセス元に応じてメモリページに異なるアクセス許可を作成できます。

基本的に、シャドウページテーブルと同様のプロセスで、VBS により排他的書き込み、またはページアクセス実行の許可が適用されます。別の言い方をすると、VTL0 のコードがページテーブルのアクセス許可を書き込み可能から実行可能に変更しようとした場合、VTL1 により検出され、ページのデータが実行されることはありません。

このメカニズムは、別の重要な軽減策であるハイパーバイザーで保護されたコードの整合性(HVCI)の主要機能の 1 つです。

ハイパーバイザーで保護されたコードの整合性(HVCI)

ハイパーバイザーで保護されたコードの整合性(HVCI)が Windows システムで有効になっている場合、実行可能なコードのインジェクションを軽減するために、メモリページアクセス許可に制御が適用されます。HVCI は、検証された信頼のあるコードのみがカーネルモードで実行されるよう設計されており、ポリシーを適用してメモリページの使用方法と変更方法を管理します。

HVCI によって適用(および最新の CPU でサポート)される重要な機能の 1 つは、ページが同時に書き込み可能および実行可能になるのを防ぐことです。このポリシーは Write XOR Execute(W^X)として知られており、メモリページが同時に書き込み可能および実行可能になるのを防止します。

HVCI は、特定のセキュリティチェックに合格しない限り、最近書き込み可能になったページからの直接のコード実行を防ぎます。アクセス許可が変更されたページからコードを実行する前にコード整合性チェックに合格しなければならず、信頼のある証明書でコードが署名されていることの確認が必要です。コードがこれらの整合性要件を満たさない場合、実行はブロックされます。HVCI により、カーネルモードで動作するコードが有効な証明書で署名されていることを確認できます。

カーネルの制御フローガード(kCFG)

カーネルの制御フローガード(kCFG)は、カーネルモードコードの制御フローを操作しようとする特定の攻撃から、オペレーティングシステムのカーネルを保護するよう設計された Windows のセキュリティ機能です。ユーザーモードのアプリケーションの保護で使用される、制御フローガード(CFG)の原則に基づいて構築されています。

kCFG の目的は、カーネルコードの制御フローを、意図しない場所や悪意のある場所にリダイレクトするエクスプロイトを阻止することです。これにより、関数ポインタや間接的なコード実行で使用される他のデータを上書きして制御フローをハイジャックするエクスプロイトを防げます。

Windows カーネルのコンパイル中に、kCFG は有効なアドレスビットマップ作成のためにコードをインストゥルメント化します。間接的な呼び出しは、コンパイル時に既知のターゲットで終了します。呼び出しが既知のターゲット以外に向けられた場合、システムではセキュリティチェック失敗となります。

カーネルシャドウスタック

Windows カーネルシャドウスタックの主な目的は、コールスタック上のリターンアドレスの改ざんを徹底的に防止することです。特に、リターン指向プログラミング(ROP)を使用したエクスプロイトの軽減を目的としています。

シャドウスタックは、通常のコールスタックと並行して、リターンアドレスの別のコピーを保持します。関数の呼び出しが発生すると、通常のスタックとシャドウスタックの両方にリターンアドレスがプッシュされます。関数が返されると、リターンアドレスが変更されていないことを確認するために、シャドウスタックと照合してリターンアドレスの検証が行われます。Windows のシャドウスタックはハードウェアによりアシストされており、Intel 社の制御フロー強制テクノロジー(CET)と AMD シャドウスタックを通じて性能向上を実現しています

まとめ

近年、Windows プラットフォームのセキュリティは改善されており、新たに開発された悪意のあるドライバの展開を効果的に防いでいます。しかし、脆弱なレガシードライバのカーネルモードの脅威は依然として懸念されています。幸い、リスクを軽減し、BYOVD 手法を使用した潜在的な攻撃を検出するためにできることがいくつかあります。

具体的には、拡張検証(EV)証明書で署名され、Windows Hardware Quality Labs(WHQL)認定を受けたドライバにのみアクセスを許可するポリシーを適用して、レガシードライバに関連するリスクを防止することが考えられます。すべてのレガシードライバをブロックすることが不可能な場合は、Windows Defender Application Control(Windows セキュリティ)ドライバブロックリストを導入して、既知の脆弱なドライバの実行を阻止するとよいでしょう。

上記とは別に、脅威検出と対応については、Sysmon のイベント ID 6 で記録されたような、ドライバ読み込みイベントを監視する機能の開発が推奨されます。

まとめとして、Windows のセキュリティは改善されていますが、カーネルモードの脅威に対する警戒を保つには、ベストプラクティスとモニタリング技術を導入して、ドライバに存在する既知および未知の脆弱性から保護することが求められます。

参照情報

投稿記事およびレポート

  1. 悪意のあるドライバに関する分析(パート 1):Cisco Talos
  2. 悪意のあるドライバに関する分析(パート 2):Cisco Talos
  3. エクスプロイト開発の現状(パート 1)popup_icon[英語]:Connor McGarr、Crowdstrike 社
  4. エクスプロイト開発の現状(パート 2)popup_icon[英語]:Connor McGarr、Crowdstrike 社
  5. コード実行がない?問題ありません。VBS、HVCI、カーネル CFG の時代を生きるpopup_icon [英語]:Connor McGarr
  6. Windows 核心部への無防備なゲートウェイとなる、署名されたカーネルドライバpopup_icon [英語]:Michal Poslušný、ESET 社
  7. Windows カーネルに対する脅威の詳細分析popup_icon [英語]:TrendMicro 社
  8. ドライバ開発者向けの Windows セキュリティモデル:Microsoft 社
  9. ドライバ署名ポリシー:Microsoft 社
  10. ドライバコード署名の要件:Microsoft 社

動画

  1. 最新の Windows カーネルのエクスプロイト/ハッキングに関する分析popup_icon [英語]:Connor McGarr による Off By One Security ポッドキャスト
  2. インサイド Windowspopup_icon [英語]:Alex Sotirov
  3. カーネルモードの脅威と実用的な防御策popup_icon [英語]:Joe Desimone、Gabriel Landau、Endgame 社(現在の Elastic 社)
  4. デバイスドライバの問題と MSR の狂気popup_icon [英語]:Ryan Warns、Timothy Harrison、INFILTRATE 2019
  5. コード実行がない?問題ありません。popup_icon[英語]:Connor McGarr
  6. カーネルを操作できないなら、触れないほうがいいpopup_icon [英語]:Jesse Michael、DEF CON 27 カンファレンス

書籍

  1. インサイド Windows 第 7 版:Pavel Yosifovich、Alex Ionescu、Mark E. Russinovich、David A. Solomon 著、出版社:日経 BP
  2. NT ドライバプログラミング―経験とノウハウを結集した実践的ドライバ開発:Peter G. Viscarola、W. Anthony Mason 著、出版社:SB クリエイティブ
  3. Windows カーネル ドライバ プログラミング:Pavel Yosifovich 著、出版社:翔泳社

 

本稿は 2024 年 12 月 19 日にTalos Grouppopup_icon のブログに投稿された「Exploring vulnerable Windows driverspopup_icon」の抄訳です。

 

コメントを書く