ユーザーインターフェイス特権の分離(UIPI)
ユーザーインターフェイス特権の分離(User Interface Privilege Isolation, UIPI)は、Windows Vistaや
Windows Server 2008以降に実装された重要なセキュリティ機能です。この技術は、主にシャッターアタック(Shatter Attack)と呼ばれる攻撃からシステムを守るために開発されました。この攻撃は、悪意のあるソフトウェアが異なるプロセス間で操作を行い、権限のあるプロセスに不正なアクセスを試みるものです。
背景
Windows NT 4.0以降、システム内のオブジェクトはセキュリティ記述子によってアクセス制御が可能でした。しかし、特定のウィンドウオブジェクトにはこのセキュリティ記述子が設けられていなかったため、ウィンドウ自体への直接的なセキュリティ制御は行えませんでした。このような欠点を補う形でUIPIが導入され、異なる整合性レベルを持つプロセス間の相互作用を制限することで、システムの安全性を高めることが狙われています。
UIPIの機能
UIPIは、同じユーザーインターフェースセッション内に存在するプロセス間の権限の違いを利用し、低整合性(Low Integrity Level, LIL)のプロセスが高整合性(High Integrity Level, HIL)のプロセスに対して行える操作を制限します。具体的には、低整合性のプロセスが高整合性のプロセスに向けてDLLインジェクションやウィンドウメッセージを送信することができなくなります。
例えば、もし
メモ帳が高整合性で実行されている場合、UIPIはその
メモ帳に対してデータを書き込もうとする試みを防ぎます。しかしながら、特定のメッセージ(WP_NULLやWM_MOVEなど)はUIPIの制限にかからないため、注意が必要です。このような例では、WM_GETTEXTメッセージが制限されないため、高整合性のプロセス情報を低整合性のプロセスが読み取ることが可能です。これはシャッターアタックにおいて悪用されることがあります。
メッセージブロックと無効化
UIPIにより、いくつかの危険なメッセージ(例えば、WM_COPYDATAやWM_DROPFILES)がブロックされるため、低整合性プロセスから高整合性プロセスへの情報流出が防がれます。ただし、特定の整合性レベル以上のプロセスは、ChangeWindowMessageFilterExを使用して、特定のメッセージのフィルターを無効にすることが可能です。
また、ユーザーインターフェースアクセシビリティソフトウェアなど、他のソフトウェアのUIにアクセスする必要があるアプリケーションの場合、UIPIによってブロックされることがあります。これを解決するため、以下の条件を満たす場合に限り、UIPIを無効にすることができます。
- - アプリケーションがデジタル署名されていること
- - アプリケーションが%SystemRoot%または%ProgramFiles%にインストールされていること
- - アプリケーションマニフェストでuiAccessがtrueに設定されていること
このような仕組みにより、Windowsはプロセス間のセキュリティを強化し、悪質な攻撃からシステムを防御することを目指しています。