Windows Rust Kernel GDI Vulnerability Leads to Crash and Blue Screen of Death Error
2025/10/17 CyberSecurityNews — Microsoft が公表したのは、Windows の GDI用に新たに実装した、Rust ベースのカーネル・コンポーネントに存在する脆弱性の情報である。この脆弱性は、システム全体のクラッシュ (BSOD:Blue Screen of Death) を引き起こす可能性があり、メモリセーフな言語を重要な OS コンポーネントに統合する際の課題を浮き彫りにしている。Microsoft は、この問題の深刻度を Medium と分類している。しかし、この脆弱性を武器化する攻撃者が、広範囲にわたる混乱を引き起こす可能性があるため、エンタープライズ環境には潜在的なリスクが生じることになる。

この脆弱性が発見されたのは、Windows のグラフィックス・サブシステムの脆弱性調査を目的とする、Check Point による標的型ファジング・キャンペーンの最中である。ファジングとは、ソフトウェアに不正な入力を集中的に送りつけてバグを摘発する手法であり、今回のケースではその有効性が示された。
研究者たちが注目したのは、 WinAFL や WinAFL Pet などのツールを制御されたテスト・セットアップで使用し、2D グラフィックスのレンダリングを GDI に指示する、Enhanced Metafile Format (EMF) および EMF+ ファイルのコンパクトな構造である。
多くの場合において、これらのファイルにはドキュメントや画像に埋め込まれており、その複雑さゆえに、長年にわたりエクスプロイトの攻撃対象となってきた。
Check Point のファジング・ツールは、わずか 16 個のシードファイルから調査を開始し、情報漏洩からユーザー空間コンポーネントにおけるコード実行のリスクを調べ上げ、さまざまなクラッシュの形態を迅速に見つけ出した。
しかし、真のブレイクスルーは予想外のタイミングで起こったという。バグチェックでカーネルレベルの問題が指摘された後に、システムが何度も再起動したのだ。この、”ファジング拒否状態” と呼ばれる状況によりテストは中断され、カーネル・フォレンジックへの切り替えが余儀なくされた。
Windows Rust ベースのカーネル GDI 脆弱性
原因を特定するために Check Point は、MemProcFS と Volatility を用いたメモリダンプ解析を導入し、 RAM ディスクから変異ファイルを抽出することで、ファジング・セットアップを強化した。
彼らはコーパスを反復的に改良し、836 個のサンプルを用いることで、再現時間を数日から 30 分に短縮した。
巧妙なハーネス修正により、カスタム C 関数と Python リスナーを介して変異をリモート・サーバにストリーミングし、クラッシュを引き起こした 38 万番目の変異を正確に捕捉した。
詳細な分析の結果として判明したのは、 Microsoft が Rust で書き換えた GDI 領域用ドライバ win32kbase_rs.sys にバグがあることだった。
NtGdiSelectClipPath におけるパスから領域への変換中に、 region_from_path_mut() における範囲外の配列アクセスにより Rust の panic_bounds_check() が呼び出され、 SYSTEM_SERVICE_EXCEPTION が発生していた。

その原因は、EmfPlusDrawBeziers レコードの不正な形式 (ポイント数が一致しない 17 個のポイントが 4 個として宣言されている) と異常な座標であり、EmfPlusObject との組み合わせである。
この不正なジオメトリは、単方向リンクリスト表現の境界をバイパスし、エッジ・ブロックの処理に負荷をかけるものだった。
シンプルな PowerShell の PoC により、このエクスプロイトが再現可能であることが判明した。 System.Drawing を介して細工されたメタファイルを、Graphics オブジェクトに埋め込むと、 x86/ x64 Windows 11 24H2 上の低権限セッションからでも即座に BSOD が発生した。
直接のリモートコード実行を可能にするものではないが、たとえば週末の夜に、悪意のインサイダーのスクリプトによるクラッシュが企業全体で発生した場合に、強力なサービス拒否の脅威となり得る。

2025年5月28日に Microsoft は、KB5058499 プレビューで OS ビルド 26100.4202 をリリースし、この問題に対処している。強化されたロジックによりドライバーのメモリ構造を 16 KB 拡張し、この脆弱性を修正したという。
主な変更点には、機能フラグで制御される2つのエッジ処理ルーチン add_edge_original() と、境界チェック付き add_edge_new() が含まれる。6月に完全なロールアウトが行われたが、このフラグが無効であることが初期テストで確認された。
この問題は Check Point から速やかに報告されたが、 Microsoft の MSRC は、それを重大ではない DoS 攻撃と見なし、Rust のパニック・メカニズムは設計通りの動作であると主張した。
BlueHat IL 2023 でセキュリティ強化が強調されていたように、この問題は、統合後に公開された Rust カーネルのバグの一つである。 Rust はオーバーフローを軽減するが、設計上の欠陥や不完全なテストを排除するものではない。
Windows がメモリ安全性の向上に注力する中で、このようなインシデントが開発者に認識させるのは、プログラム言語が万能薬ではないことだ。したがって、徹底したファジングと検証が依然として不可欠となる。
この Windows の脆弱性ですが、細工された EMF/EMF+ メタファイルの不正なポイント数や座標がトリガーとなり、GDI の region_from_path_mut() で範囲外アクセスが発生し、Rust の panic_bounds_check() が呼ばれてカーネル例外 (BSOD) を引き起こすというものです。ファジングで短時間に再現可能な PoC が示されており、メタファイルの複雑さと入力検証の抜けが、直接的な原因になっていたことが判明しました。よろしければ、Rust で検索も、ご参照ください。
You must be logged in to post a comment.