2007年10月1日 星期一

Vista 的 Session 0 Isolation 問題

MSN SpaceGoogle DocGoogle Blog
Chui-Wen Chiu
2007.10.01

前言

由於我目前還相當排斥 Vista 也無開發環境,所以當初開發時並沒有把 Vista 列入考慮。可是當這個產品漸漸成型,也受到眾多主管的關注,偏偏他們都已經在使用 Vista 作業系統,所以測試發現無法在 Vista 上運作,這針是讓我頭痛的問題。一來我要先借到一台安裝 Vista 的機器,二來在 XP 上熟悉的工具在 Vista 上很多都不相容,尤有甚者 Vista 就直接重開機,最慘的是 Alcohol 120% 1.9.5.3105 在 Vista 上安裝重開機會沒有辦法進入作業系統,真是讓人傻眼,還好系統還原後就正常。總之,最後安裝了最基本的開發工具和除錯套件,由於發生問題的是印表機驅動程式,也就是 Print Processor 部份,這個的用途是當應用程式執行列印命令時,系統的 Print Spooler 服務會依據你選擇的印表機,載入對應的 Driver DLL,並依序喚起 OpenPrintProcessor, PrintDocumentOnPrintProcessor, ClosePrintProcessor 完成列印的工作,我的測試發現 OpenPrintProcessor 在 Vista 上就結束了,所以沒有辦法完成列印。

因為我的程式在列印過程會將資料導入一個 Window,在 OpenPrintProcessor 檢查該 Window Handle 是否存在,居然在 Vista 上的 FindWindow 抓不到該 Window,查了許多的資料後才知道,Vista 基於安全的理由,進行了 Session 0 Isolation,導致程式沒有辦法 FindWindow 和 SendMessage。

何謂 Session 0 Isolation?

在 Windows 2000/XP/2003 和更早期的 Windows 作業系統,所有 Service 都運作在第一個登入用戶的 Session。此 Session 稱為「Session 0」。一般的應用程式也運作在同一個 Session 如圖1 所示。如此程式可透過 Windows API 如: FindWindow, SendMessage 與視窗應用程式互動。
圖1、2000/XP/2003 上的 Session(摘自[7])


可是到了 Vista,基於「Session 0」中同時運作 Service 和視窗應用程式會產生安全風險,因為這些服務以提升的權限運行,因此會成為那些正在伺機提升自身權限級別的惡意代理的目標。因此 Vista 中透過 Session 0 Isolation 使 Service 和視窗應用程式進行隔離,使得 Service 和視窗應用程式沒有辦法透過視窗訊息進行互動,如圖2 所示。

圖2、Vista 上的 Session(摘自[7])

在 Windows Vista 中,只有 System Process 和 Service在「Session 0」運作。第一個使用者登入將到 Session 1,隨後的使用者將登入到後續的 Session (如:Session 2, Session 3, ...)。這表示著 Service 永遠不會與應用程式在相同的 Session 中進行溝通,因此可防止應用程式的攻擊。但是這樣的改變會造成透過 Service 運作的動程式受到影響,如:印表機驅動程式(使用 "Print Spooler" Service)。所以,簡單的說 Session 0 Isolation 機制,讓 Service 和應用程式分屬不同的 Session,避免 Service 遭受應用程式攻擊。

由於 Vista 上述 Session 機制改變,導致我的程式移植到 Vista 上無法正常運作。因為無法使用 SendMessage/PostMessage/PeekMessage 或其他視窗相關的 Windows API。所以,只能透過其他方式來繞過這個限制。官方建議的修改方式是改用 RPC 或命名的 Pipe 與視窗應用程式溝通。

可能解決方式

針對我的問題,因為我的需求很單純,只是透過 SendMessage 通知 Window 資料寫入完成。於是我將 FindWindow 和 SendMessage 用 Pipe 方式改寫,也就是在 Window 端建立一個接收訊息的 Pipe,Driver 端則在必要的時候透過 Pipe 傳送命令過來,如此可規避 Session 0 Isolation 對其他 Session 應用持事互動的遮蔽。

總結

雖然透過 Pipe 方式可以暫時解決問題,不過 Vista 上的 UAC 會使程式作受到些許限制,初期開發我是先關閉 UAC 解決這個問題,未來可能要再考慮 UAC 的情況。真希望 Jeffrey Richter 趕快出一本關於 Vista 底層運作的書,也許我對 Vista 上的開發會得心應手些~

參考資料

[1] 在 Windows Vista 中,嘗試傳送訊息至工作階段 0 的程式可能會停止回應
[2] Impact of Session 0 Isolation on Services and Drivers in Windows Vista
[3] Windows Vista Developer Story:应用程序兼容性集锦
[4] Security, services and the interactive desktop in Windows
[5] Interacting with Services
[6] Services in Windows Vista
[7] Application Compatibility - Session 0 Isolation








沒有留言:

搜尋此網誌