RustカーネルモジュールにおけるWindows GDIの脆弱性がリモート攻撃を可能に

概要:RustベースのWindows GDIに新たな脆弱性

MicrosoftのRustベースのグラフィックデバイスインターフェース(GDI)カーネルコンポーネントに、新たな脆弱性が発見されました。この欠陥により、権限のない攻撃者がWindowsシステムをクラッシュさせたり、制御を奪ったりする可能性があります。

この問題は、Check Point Research(CPR)が2025年1月に発見し、Microsoftに報告しました。Microsoftは、2025年5月28日のKB5058499プレビューアップデート(OSビルド26100.4202)でこのバグに対処し、6月下旬までに完全に展開されました。

メタファイルファジングによるカーネルパニックの発見

CPRの調査は、Windowsメタファイルに焦点を当てたファジングキャンペーンから始まりました。ファジングとは、ソフトウェアの弱点を発見するために、ランダムまたは不正なデータを注入する手法です。チームはWinAFL Petを使用して中規模のファジングジョブを管理し、BugIdでクラッシュを分析しました。彼らは、GDI関数の描画命令を埋め込む拡張メタファイル形式(EMF)とそのEMF+バリアントをターゲットにしました。

初期テストではユーザー空間のクラッシュとメモリリークが発生しましたが、1週間後、テストマシンは予期せずカーネルのBugCheckにより再起動しました。調査員はその後、メモリダンプをキャプチャし、MemProcFSを使用してRAMディスクから変異したシードファイルを抽出することに移行しました。これらのサンプルを単一インスタンスのファジング設定で再生することで、約380,000回の変異と836個のシードファイルの後、30分以内にクラッシュを一貫して再現することができました。

脆弱性の技術的詳細

クラッシュは、新しいRustベースのwin32kbase_rs.sysドライバーのNtGdiSelectClipPathシステムコール中に発生しました。region_from_path_mut()関数内の境界チェックが、不正なパスデータが原因で配列の範囲外アクセスを引き起こした際に失敗しました。

この誤ったロジックは、EMF+ベジェ曲線レコードが4つの点を宣言しているにもかかわらず、17の点が供給されたことで、エッジブロックリストがオーバーフローしたときに生じました。panic_bounds_check()の呼び出しがブルースクリーンオブデス(BSOD)を引き起こしました。

概念実証(PoC)スクリプト

CPRは、Graphics::FromImage()およびDrawImage()関数(無害な描画タスクを意図したもの)を介して、特別に細工されたメタファイルをロードする概念実証(PoC)PowerShellスクリプトを開発しました。低整合性アカウントから、攻撃者は企業全体のデスクトップやサーバーを繰り返しクラッシュさせ、データ損失や運用停止を引き起こす可能性がありました。

Microsoftの修正とセキュリティ評価

Microsoftはこの欠陥を中程度の深刻度の「サービス拒否」と分類し、2025年6月にセキュリティ以外のアップデートを通じて修正しました。win32kbase_rs.sysファイルのサイズが148KBから164KBに増加したことは、境界チェックが強化されたことを示しています。このアップデートでは、安全なパスを選択するためのランタイム機能フラグを持つadd_edge_original()add_edge_new()という二重のエッジ処理ルーチンが導入されました。パッチはプレビュー版に存在していましたが、フラグは製品版まで無効のままでした。

教訓と今後の課題

セキュリティ研究者たちは、ユーザーが制御できる入力がBSODにつながる場合、それは脆弱性として扱われるべきだと主張しています。このケースでは、Rustのメモリ安全性はサイレントなデータ破損を防ぎましたが、デフォルトでクラッシュを引き起こしました。より堅牢な設計では、システム全体を停止させることなく、範囲外条件を適切に処理する必要があります。

このインシデントは、WindowsのRustカーネルモジュールにおける初の公開されたセキュリティ上の欠陥である可能性が高いです。これは、Rustが強力な安全性保証を提供する一方で、言語の選択だけでは厳格なテストと設計原則に取って代わることはできないことを浮き彫りにしています。侵入者を阻止するために家を破壊するホームアラームの比喩は、破壊的な副作用なしに脅威を封じ込めるセキュリティ対策の必要性を強調しています。より多くのRustコードが重要なシステムに統合されるにつれて、開発者は非常に高いエンジニアリング基準を維持し、微妙なエッジケースを予測して、大規模な混乱を防ぐ必要があります。


元記事: https://gbhackers.com/windows-gdi-vulnerability-in-rust-kernel/