使用者介面權限隔離(User Interface Privilege Isolation,簡稱UIPI),是從Windows NT 6.0開始引入的技術。其目的在於防止粉碎視窗攻擊(英語:Shatter
attack)。使用者介面權限隔離阻止較低等完整性層級(Integrity level)進程的視窗向較高等完整性層級進程的視窗發送訊息,但也有一些訊息不被阻止。
[1] Windows訊息是一種處理序間通訊機制,可被低等完整性層級的惡意軟體利用,在較高等完整性層級的進程上下文裡執行任意代碼,可能允許權限提高。介紹
在早期版本的Windows中,同一個使用者帳號下啟動並執行進程共用相同的安全許可權。例如,一個線程可以發送視窗資訊到另一個線程中的視窗。
從Windows Vista開始這個並不總能正常工作。新特性權限等級被附加到進程上(也可以是其它特性)。進程不可以將訊息視窗發送到具有更高權限等級的進程,儘管他們以運行於同一個使用者帳號(例如當前登入使用者)。
通過UIPI(使用者介面權限隔離)機制防止來自其它可能更高許可權的線程中建立的windows訊息進行惡意代碼攻擊。
顯示UIPI
此問題在UAC(使用者帳戶控制)啟用時最為清晰(預設情況下是啟用的)。
UAC中,一個管理員登入擷取兩個令牌對象:第一個是管理員令牌,具有最高許可權(類似於Windows Vista以前版本的系統帳號),
第二個令牌是過濾後的版本,帶有標準使用者權限。
預設情況下,進程用完整性層級為normal(UIPI 層級分為low,normal,high,和system)的標準使用者啟動。作為對比,進程使用管理員權限(例如,當使用者右擊“Run as Administrator”或用”runas”命令調用SheellExecute)使得進程具有high的權限等級。
如此,系統可以用使單一權限等級運行兩種類型的進程(技術上講用的是同一使用者帳號)。UIPI支援低完整性層級(integrity level)的進程和更進階別的進程進行通訊。
使用用Windows Sysinternals 的Process Explorer查看權限等級(http://www.microsoft.com/technet/sysinternals ) ,選擇“Integrity Level”列
這裡有個基於同一圖片的兩個進程的例子,其中一個用標準使用者權限啟動另一個使用管理員權限啟動。注意他們是不同的完整性層級(integrity level)。
UIPI 施加限制
較低許可權的應用程式不能做如下操作:
• 驗證更高許可權進程建立的視窗。調用 SendMessage 或 PostMessage到更高許可權進程建立的視窗
• 使用線程鉤子來附加一個更高許可權的進程。
• 使用日誌鉤子(SetWindowsHookEx) 來監視更高許可權的進程
• DLL注入到更高許可權的進程。
下列windows訊息永遠是允許狀態:
• 0x000 - WM_NULL
• 0x003 - WM_MOVE
• 0x005 - WM_SIZE
• 0x00D - WM_GETTEXT
• 0x00E - WM_GETTEXTLENGTH
• 0x033 - WM_GETHOTKEY
• 0x07F - WM_GETICON
• 0x305 - WM_RENDERFORMAT
• 0x308 - WM_DRAWCLIPBOARD
• 0x30D - WM_CHANGECBCHAIN
• 0x31A - WM_THEMECHANGED
• 0x313, 0x31B (WM_???)
UIPI 問題的修複
基於比Windows Vista更早的作業系統的應用程式會需要互相之前能傳遞訊息。Windows Vista 引入了ChangeWindowMessageFilter API,這是已編檔方法,用來添加或刪除能通過隔離等級的訊息。需要允許訊息傳遞到更高許可權的進程的視窗時,使用如下方法:
ChangeWindowMessageFilter(message, MSGFLT_ADD);
類似的標記MSGFLT_REMOVE從進程允許清單中刪除訊息。
Windows 7引入了一個新的函數ChangeWindowMessageFilterEx,相對於控制整個進程它可以在特定視窗控制允許訊息:
BOOL ChangeWindowMessageFilterEx(
HWND hWnd, UINT message, DWORD action,
PCHANGEFILTERSTRUCT pChangeFilterStruct
);
事件的參數可以是MSGFLT_ALLOW (類似於ChangeWindowMessageFilter中的MSGFLT_ADD ), MSGFLT_DISALLOW (類似於MSGFLT_REMOVE),和 MSGFLT_RESET,將視窗重設成預設篩選器,可選的架構允許操作結果以接收更多的資訊。
原文出處:來自網路