首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Windows 7 開發白皮書:UIPI (使用者介面特權隔離) 深度解析與對策

     編輯:關於.NET

前言:為什麼相同使用者的進程無法自由通訊?

Windows Vista 引入 UIPI (User Interface Privilege Isolation),徹底改變了同一使用者帳戶下進程間的互動規則。過去進程共享相同安全權限,任意發送視窗訊息;現在每個進程附加 完整性層級,低 IL 進程預設無法向高 IL 進程發送視窗訊息、安裝鉤子、注入 DLL——即使它們屬於同一使用者。

UIPI 運作機制

UAC 雙 Token 模型

管理員登入時獲得兩個 Token:

  • 完整管理員 Token:High IL(類似舊版 SYSTEM)
  • 篩選後 Token:Medium IL(標準使用者權限)

預設進程用篩選 Token 啟動 (Medium);「以系統管理員身分執行」用完整 Token (High)。同一使用者、同一桌面,卻有不同 IL 的進程共存。

完整性層級階層

Low < Medium < High < System

  • Low:IE Protected Mode、低權限應用程式
  • Medium:標準使用者啟動的進程 (預設)
  • High:管理員權限啟動、系統服務
  • System:核心系統進程
Process Explorer Integrity Level 欄位
Medium 進程範例
High 進程範例
同圖片不同 IL 進程對比

UIPI 施加的具體限制

低 IL 進程不能對高 IL 進程執行:

  • 驗證高 IL 進程建立的視窗
  • SendMessage / PostMessage 到高 IL 視窗
  • 執行緒鉤子附加 (SetWindowsHookEx)
  • 日誌鉤子監視
  • DLL 注入

永遠允許通過的視窗訊息

系統保留一份白名單,以下訊息不受 UIPI 限制:

訊息值訊息值
WM_NULL0x000WM_MOVE0x003
WM_SIZE0x005WM_GETTEXT0x00D
WM_GETTEXTLENGTH0x00EWM_GETHOTKEY0x033
WM_GETICON0x07FWM_RENDERFORMAT0x305
WM_DRAWCLIPBOARD0x308WM_CHANGECBCHAIN0x30D
WM_THEMECHANGED0x31AWM_??? (0x313, 0x31B)-

修復策略:讓特定訊息穿透邊界

Windows Vista:ChangeWindowMessageFilter (進程級)

// 允許訊息穿越 IL 邊界
ChangeWindowMessageFilter(message, MSGFLT_ADD);

// 移除允許
ChangeWindowMessageFilter(message, MSGFLT_REMOVE);

影響整個進程的所有視窗。

Windows 7 新增:ChangeWindowMessageFilterEx (視窗級)

BOOL ChangeWindowMessageFilterEx(
    HWND hWnd,        // 目標視窗
    UINT message,     // 訊息 ID
    DWORD action,     // MSGFLT_ALLOW / MSGFLT_DISALLOW / MSGFLT_RESET
    PCHANGEFILTERSTRUCT pChangeFilterStruct  // 選擇性,接收詳細結果
);
  • MSGFLT_ALLOW ≈ MSGFLT_ADD (允許)
  • MSGFLT_DISALLOW ≈ MSGFLT_REMOVE (禁止)
  • MSGFLT_RESET 重置為預設過濾器
  • 可選結構體提供操作結果詳細資訊

最佳實踐建議

  1. 優先重構架構:避免跨 IL 視窗訊息通訊,改用 WCF、命名管道、RPC、共享記憶體等 IPC 機制。
  2. 最小權限原則:僅對必要的自訂訊息 (RegisterWindowMessage 取得的 ID) 呼叫過濾器,勿濫用。
  3. Windows 7+ 專案:優先使用 ChangeWindowMessageFilterEx 鎖定特定視窗,減少攻擊面。
  4. 測試驗證:必須在 UAC 啟用、標準/管理員雙權限場景下完整測試。

除錯利器:Process Explorer

檢視 Integrity Level 欄位即可快速判斷進程 IL,是診斷 UIPI 問題的標準工具。

  • 下載:Sysinternals
  • 啟用:View → Select Columns → 勾選 Integrity Level

總結

UIPI 是 Windows 防禦深度策略的關鍵一環,透過完整性層級將「使用者身分」與「進程信任度」解耦。開發者需從「同用戶即可互通」的舊思維轉型,採用 IPC 替代視窗訊息,或在必要時精準配置訊息過濾器。Windows 7 的 ChangeWindowMessageFilterEx 提供更細粒度控制,是現代應用程式相容性修復的利器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved