Windows Vista如何以SYSTEM權限啟動進程(2)(圖)
查看WinSta0窗口站的安全權限
前面的內容隱藏了這樣一個事實,為什么Local SYSTEM進程有能力加入到WinSta0窗口站?
大家可以回想一下,在Windows 2000/XP下,只有以Local SYSTEM運行的服務,可以選擇“允許服務與桌面交互”。這實際上就是讓該服務運行在WinSta0窗口站里,而不是運行在默認的Service-0X0-3e7$窗口站里。
但是為什么以其他帳戶身份運行服務,不能選擇這個選項?甚至連以當前登錄帳戶身份運行的服務都不行?例如當前以Admin用戶帳戶身份登錄到系統,而系統中存在著一個服務,也以Admin身份運行。
這里我們可以查看一下WinSta0窗口站的安全權限。可以用Process Explorer,或者調試工具(例如Windbg)進行查看。
1. 用Windbg查看WinSta0的ACL
這里首先介紹用Windbg查看WinSta0窗口站的安全權限(更加完整)。
由于Windows Vista默認禁用Kernel Debug,所以必須運行以下命令手動打開Kernel Debug選項:
bcdedit -debug on
盆盆評注:注意,如果安裝了Demon Tools之類的工具,請不要打開Kernel Debug的選項,以免產生沖突。
下圖是利用Windbg所dump出來的WinSta0安全描述符的完整記錄:
我們主要關心日志中最后三個棕色加粗顯示的結果:Local System帳戶擁有0x000f037f權限組合;Administrators組帳戶擁有0x00020166權限組合;還有一個SACL的ACE為S-1-16-4096。
0x000f037f和0x00020166,看上去甚是古怪,但搞開發的兄弟應該很容易理解,這實際上是安全權限的組合掩碼。
咱IT Pro不需要理解這到底是什么意義,只需要知道0x000f037f代表擁有WinSta0的所有可能權限;而0x00020166代表擁有大多數可能的權限,但是無法讀取屏幕內容。
還有一個SACL的ACE為S-1-16-4096。這又是什么意思?
嘻嘻,這里就要請大家參考MVP小青蛙s兄弟的大作《Windows Vista UIPI和窗口消息的故事》。原來在Windows Vista里,每個安全對象,包括窗口站,都有MIC等級的概念。這里可以看到WinSta0窗口站的MIC等級就是S-1-16-4096,實際上就是Low Integrity Level。當然在盆盆的多篇拙作里也曾經多次提及,例如《Windows Vista有趣的標簽SID》。
WinSta0窗口站的MIC級別為什么會是低級?這可能是為了方便IE瀏覽器這樣的Low MIC進程也能夠讀寫WinSta0里的內容。
2. 用Process Explorer查看WinSta0的ACL
用Windbg查看WinSta0的ACL,可以得到比較豐富的信息,但是有一點小缺點,無法查看當前登錄帳戶的權限(相當于查看無用戶登錄時的WinSta0的安全權限)。
所以這里借助Process Explorer進行查看。
隨便找到一個用戶進程,查看其打開的句柄,可以發現其中有/Sessions/1/Windows/WindowStations/WinSta0這樣的句柄,查看其安全權限。
可以看到當前登錄帳戶(本例是Admin)沒有訪問WinSta0的權限,如附圖所示。
除了SYSTEM之外,還有一個古怪帳戶S-1-5-5-0-148836具有所有可能的權限,如附圖所示。S-1-5-5-0-148836實際上就是Admin登錄會話的SID。這樣的結果非常有趣,WinSta0的權限是授予Admin的一次登錄實例(登錄會話),而不是Admin這個安全主體本身,很有意義。其實道理很簡單,登錄會話是經過LSA驗證的一次登錄實例,Windows可以信任。而以Admin身份運行的進程,并不一定都是由Admin這個用戶觸發的,還有可能是以Admin身份運行的服務,從WinSta0的ACL可以看出,這些服務無法訪問WinSta0,盡管它們的身份就是登錄用戶本身!
Process Explorer雖然可以看到完整的安全描述符信息,也可以看到更詳細的權限。但是有兩個小缺點,一是無法顯示WinSta0的MIC級別,而是只顯示所謂的常規權限,而沒有顯示針對窗口站的特定權限。可能Mark Russinovich還沒有來得及更新,抑或這位大牛認為這太簡單了,認為大家很容易理解,不想再修改了。
盆盆評注:如何理解登錄會話的SID?可以用服務和服務SID的關系進行類比。
3. 小結
羅羅嗦嗦說了那么多,結論呢?
實際上很簡單,查看WinSta0窗口站發現,只有System和登錄會話SID擁有所有的可能權限。所以這就可以解釋,為什么在Windows里,只有運行在System權限下的服務才可以選擇“允許服務與桌面交互”,因為實在是只有System才有權限訪問WinSta0窗口站啊!
