1. 程式人生 > >Windows中Session 0隔離對服務程式和驅動程式的影響

Windows中Session 0隔離對服務程式和驅動程式的影響


讀完Impact of Session 0 Isolation on Services and Drivers in Windows的筆記
推薦使用Logonsessions檢視當前所有Session以及其程序、使用ProcessExplorer檢視當前程序的核心物件來進行驗證。


Session 0隔離:


在Windows XP,Windows Server 2003以及更早的版本中,第一個登入的使用者以及Windows的所有服務都執行在Session 0上。
這樣做危險的地方是,使用者使用的應用程式可能會利用Windows的服務程式提升自己的許可權。
    如下圖所示,第一個登入的使用者與Windows服務程式執行在同一個會話中,第二個以及後續的登入使用者

(在XP中為通過FUS登入的使用者,在Server 2003中則為遠端登入的使用者)就執行在其他的會話中。
    Windows Vista,Windows Server 2008及後續版本中,Windows服務運行於Session 0,第一個登入的使用者則在Session 1中執行。
   
Session 0是一個非互動型的(noninteractive)Session,只能執行系統程序以及服務程式。
    所以服務程式已經不能像之前一樣工作,比如不能訪問視訊驅動程式。



            Windows XP,Windows Server 2003及更早版本                                Windows Vista,Windows Server 2008及後續版本


受影響的程式:
主要影響到了一些以服務程式形式安裝的應用程式或者驅動程式和一些由執行在Session 0下的作業系統程序以及作業系統服務程式載入的驅動程式。
比如:
1、印表機驅動,由spooler service載入(spooler service執行在Session 0下)
2、UDMF的驅動程式(其託管程序WUDFHost.exe執行在Session 0下)


潛在的問題:
當然,所有服務程式或者由服務程式載入的驅動程式,如果它們執行時假設使用者運行於Session 0,在新版作業系統中將不能執行。
1、服務程式建立的使用者介面,使用者是看不到的,因為使用者都不在Session 0中執行。
2、服務程式嘗試傳送視窗訊息(例如呼叫SendMessage或者PostMessage)是不可行的。
原因是,應用程式執行在另外一個Session中,接收不到訊息,並且服務程式跟應用程式的訊息佇列是不一樣的。
3、用Local來建立或者開啟命名物件預設已經不再是建立或者開啟/BaseNamedObjects/下的物件,
而是建立或者開啟/Session/<n>/BaseNamedObjects/下的物件,Local物件已經被不同Session隔離。
在Session 1中建立事件物件以及在系統中生成的事件物件的名稱的例子:
    CreateEvent(NULL, FALSE, FALSE, "Object") --> /Session/1/BaseNamedObject/Object
    CreateEvent(NULL, FALSE, FALSE, "Global//Object") -->/BaseNamedObject/Object
使用者應用程式和服務程式的同步最好是用Global名稱空間。


有關建立服務程式以及由服務託管的驅動程式的建議:
1、與應用程式通訊時,使用RPC、命名管道等C/S模式代替視窗訊息
2、如果服務程式需要UI與使用者互動的話,有兩種方式:
    ①用WTSSendMessage來建立一個訊息框與使用者互動
    ②使用一個代理(agent)來完成跟使用者的互動,服務程式通過CreateProcessAsUser建立代理。
        並用RPC或者命名管道等方式跟代理通訊,從而完成複雜的介面互動。
3、應該在使用者的Session中查詢顯示屬性,如果在Session 0中做這件事,將會得到不正確的結果。
4、明確地使用Local或者Global為命名物件命名,Local/為Session/<n>/BaseNamedObject/,Global/為BaseNamedObject/
5、將程式放在實際環境中測試是最好的方法,如果條件不允許,可以在XP的FUS下測試。在XP的FUS下能工作的服務程式將很可能可以在新版系統中工作,注意XP的FUS下的測試不能檢測到在Session 0下跟視訊驅動有關的問題



附《Impact of Session 0 Isolation on Services and Drivers in Windows》地址:http://www.microsoft.com/whdc/system/sysinternals/session0changes.mspx