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