| 項目 | 內容 |
|---|---|
| CVE 編號 | CVE-2005-0552 |
| 漏洞類型 | 權限提升 |
| 攻擊向量 | 本地攻擊(需登入桌面) |
| 影響版本 | Windows 2000 SP1~SP4、Windows XP SP1/SP2、Windows Server 2003 SP0/SP1 |
| 根本原因 | 桌面應用程式處理 keybd_event() 合成鍵盤事件時的設計缺陷 |
| 嚴重性 | 高(可繞過 UIPI,以 SYSTEM/高權限使用者身分執行任意程式碼) |
在 Windows 2000/XP/2003 的視窗站/桌面模型中,同一桌面上的所有進程預設享有相互發送視窗訊息的權限。這意味著:
explorer.exe、系統服務建立的 UI)發送 WM_KEYDOWN、WM_CHAR 等鍵盤訊息。keybd_event() / SendInput() API 允許任何進程合成全域鍵盤輸入,系統不驗證發送者權限。keybd_event() 或 SendInput() 模擬 Win+R → 輸入 cmd → Ctrl+Shift+Enter(以管理員身分執行)等按鍵序列。explorer.exe 桌面殼層)接收並處理合成按鍵,彈出「執行」對話框並啟動高權限命令提示字元。Windows Vista 引入 Mandatory Integrity Control (MIC) 與 UIPI:
ChangeWindowMessageFilterEx 開放)。XP/2003 缺乏此機制,故根本無法在架構層面防禦。
HK.exe、Privesc.exe)廣泛採用此手法。win32k.sys 驗證合成輸入來源的邏輯。wmic qfe list | find "893756"登錄 HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server,設 AllowRemoteRPC = 0、EnableRemoteDesktop = 0(非終端機環境)。
登錄 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows,設 UserInitMprLogonScript 限制登入腳本權限。
explorer.exe、taskmgr.exe、cmd.exe 拒絕接受來自非信任進程的 WM_KEY*、WM_MOUSE* 訊息。RunAs 提權。電腦設定 → Windows 設定 → 安全性設定 → 本地原則 → 安全性選項 → 互動式登入:不需要 Ctrl+Alt+Del → 停用(強制 SAS 序列,阻擋模擬登入)。根治之道:遷移至 Windows 7/10/11 或 Linux。Vista 起引入的 MIC+UIPI 從架構層面消除此類「碎片化輸入注入」攻擊面。
官方修補本質上在 win32k.sys 的 xxxProcessKeyEvent / xxxKeyEvent 流程中加入來源驗證:
// 簡化邏輯示意 if (pEvent->flags & KEYEVENTF_UNICODE) { // 合成輸入 if (PsGetCurrentProcessIntegrityLevel() < TargetThread->Process->IntegrityLevel) { return STATUS_ACCESS_DENIED; // XP/2003 無此檢查,Vista+ 有 } }
並限制 SendInput 只能注入到相同或較低完整性等級的桌面執行緒佇列。
鍵盤事件權限提升漏洞(CVE-2005-0552)是 Windows 經典「碎片化桌面信任模型」的典型受害者。它揭示了同一桌面進程間預設完全互信的架構缺陷,也倒逼微軟在 Vista 引入完整性等級與 UIPI 徹底重構視窗訊息傳遞安全邊界。對仍在維護 Windows 2000/XP/2003 系統的環境(如工控、醫療、舊版 ERP),務必套用 KB893756、部署 HIPS、強制最小權限並規劃遷移路線,方能將風險控制在可接受範圍內。