天天看點

Windows Vista安全原理深入探索

有不少朋友對Windows Vista的UAC功能不滿意,是以特将以前給《程式員》雜志寫過的一篇文章貼到這裡,意圖介紹一下Windows Vista這個安全功能的底層原理,也希望讀者朋友能夠了解Windows安全設計人員的苦心。

如果看過Mark Russinovich的部落格,那麼就會明白,UAC的主旨并不是要替代防毒軟體等工具,并不是為了消除病毒、木馬等惡意軟體,UAC是安全縱深防禦體系中的一環,其主要設計目的是盡可能讓應用程式運作在标準使用者權限下,以減少所有應用程式(不管是合法軟體,還是惡意軟體)有意或者無意,對系統造成的危害。 

盆盆評注 筆者在探索和學習Windows Vista安全理論的過程,深受《Windows Internals》一書的啟發。該書由Mark Russinovich和David Solomon所著,堪稱IT Pro和Dev的聖經。

參考

使用者帳戶控制(UAC),是Windows Vista新引入的安全機制。管理者登入Windows時,系統會同時建立兩個通路令牌,其中一個是完全的管理者通路令牌(Full Token),另一個是經過“過濾”的通路令牌,叫做标準使用者通路令牌,如附圖所示。當Windows系統啟動Shell程序(Explorer.exe)時,LSA會把标準使用者通路令牌連接配接到Shell程序,是以Windows Vista啟動的使用者程序,預設都隻具有标準使用者權限。如果某個程序需要管理者權限,則系統會提示權限提升,得到使用者親自确認後,系統會把完全的管理者通路令牌連接配接到該程序上。

Windows Vista安全原理深入探索

 單擊看大圖

準備知識

在《Windows Internals》的第八章“安全”部分,介紹了一個執行個體:當我們在Windows XP裡啟動“日期和時間”控制台元件時,實際上啟動的是“rundll32”程序,由該程序加載“Timedate.cpl”控制台元件。用Process Explorer檢查該“rundll32”程序的通路令牌,可以發現“SeSystemTimePrivilege”特權處于啟用狀态,如附圖所示。

Windows Vista安全原理深入探索

單擊看大圖

“SeSystemTimePrivilege”是“更改系統時間”特權的内部名稱,所有特權都儲存在LSA的政策資料庫中,該資料庫會加載到HKLM\SECURITY系統資料庫分支,使用者登入系統時,LSA會讀取這些特權值。

對于Windows XP專業版,我們可以通過“本地安全政策”管理單元檢視使用者所具有的特權。可以看到,“更改系統時間”特權僅授予管理者組和Power Users組使用者,如附圖所示,這就是為什麼在Windows XP下,标準使用者無法修改系統時間和時區的原因。

Windows Vista安全原理深入探索

盆盆評注 筆者曾經寫過一個連載,介紹帳戶的登入權利所對應的HKLM\SECURITY系統資料庫鍵值。可以用同樣方法得出特權所對應的系統資料庫鍵值。

實驗準備

現在我們已經知道,要修改系統時間,目前帳戶必須具備“更改系統時間”特權。但是在Windows Vista下,預設不是隻有标準使用者權限嗎,這時候應該沒有“更改系統時間”特權!那麼系統是如何獲得“更改系統時間”特權的呢?我們用實驗來進行驗證。

1. 實驗工具

本實驗在Windows Vista中文旗艦版上進行,測試帳戶為Admin,是管理者組成員。為了檢視程序的通路令牌,需要采用先前提到的Process Explorer工具,下載下傳位址如下:

[url]http://www.microsoft.com/technet/sysinternals/utilities/ProcessExplorer.mspx[/url]

還有一個Process Monitor工具,下載下傳位址如下:

[url]http://www.microsoft.com/technet/sysinternals/utilities/processmonitor.mspx[/url]

2. 禁用安全桌面

由于“使用者帳戶控制”對話框預設運作在“安全桌面”上,這裡的安全桌面就是我們按“Ctrl+Alt+Del”組合鍵所進入的桌面。但是為了改善使用者體驗,UAC的安全桌面并不是藍綠色的背景,而是目前使用者桌面桌面背景的截圖快照(呈暗色顯示)。

盆盆評注 參考盆盆翻譯自Mark Russinovich的文章,了解如何強制使用者必須按“Ctrl+Alt+Del”組合鍵,才能打開UAC的憑據輸入對話框,這樣可以確定憑據的安全。

之是以啟用“安全桌面”,主要是因為考慮到安全因素,以防其他程序可以對“使用者帳戶控制”對話框進行操作。但是由于本實驗需要用工具對UAC的過程進行全程監控,是以需要臨時禁用“安全桌面”功能,方法如下。

運作“secpol.msc”并回車,打開“本地安全政策”對話框,然後在左側的控制台樹裡定位到本地政策→安全選項,在右側詳細窗格裡輕按兩下“使用者帳戶控制:提示提升時切換到安全桌面”政策項,并選中“已禁用”選項,如附圖所示。

Windows Vista安全原理深入探索

單擊看大圖

實驗記錄

1.檢視rundll32程序通路令牌

單擊工作列通知區域的時鐘圖示,然後單擊底部的“更改日期和時間設定”連結,即可打開“日期和時間”視窗。正如您所預料的,這時候還不能對系統時間進行任何修改。同時可以在Process Explorer視窗中看到新增一個程序rundll32(呈綠色顯示)。

輕按兩下該rundll32程序,即可打開其屬性對話框。在“Image”标簽頁的“Command Line”文本框裡可以看到“timedate.cpl”(“時間和日期”的控制台擴充檔案),如附圖所示。這說明該rundll32.exe就是“時間和日期”控制台元件的宿主程序。

Windows Vista安全原理深入探索

切換到“Security”标簽頁裡,就可以看到該rundll32程序的通路令牌,可以看到在下方的特權清單裡,隻有少得可憐的五個個特權,而其中并沒有SeSystemTimePrivilege特權!這就是為什麼在預設情況下,無法在管理者環境下修改系統時間的原因。

Windows Vista安全原理深入探索

2.提升權限

要能夠修改系統時間,隻需單擊“日期和時間”視窗右下側的“更改日期和時間”按鈕,即可打開 “使用者帳戶控制”對話框,單擊“繼續”按鈕,如附圖所示。現在應該可以修改系統時間了。

Windows Vista安全原理深入探索

看來這個“使用者帳戶控制”對話框負責向系統傳遞消息,以便系統确認使用者同意提升操作權限。其本質似乎應該是修改相關程序的通路令牌,就本例來說,應該是在rundll32程序的通路令牌裡添加SeSystemTimePrivilege特權。那麼果真是這樣嗎?

結果很讓人沮喪,重新打開rundll32程序的屬性對話框,并切換到“Security”标簽頁,發現其通路令牌沒有任何改變(并沒有新增SeSystemTimePrivilege特權)!

這是為什麼呢?

3.檢視dllhost程序的通路令牌

反複重新做實驗後,終于發現在“使用者帳戶控制”對話框上單擊“繼續”按鈕後,系統會新增一個dllhost程序,在其程序屬性對話框的“Image”标簽頁的“Command Line”文本框裡可以看到“/Processid: {9DF523B0-A6C0-4EA9-B5F1-F4565C3AC8B8}”參數,如附圖所示。

Windows Vista安全原理深入探索

搜尋系統資料庫得知,{9DF523B0-A6C0-4EA9-B5F1-F4565C3AC8B8}就是timedate.cpl的AppID,如附圖所示。

Windows Vista安全原理深入探索

在dllhost程序的屬性對話框上,切換到“Security”标簽頁,不出所料,dllhost程序的通路令牌裡果然有SeSystemTimePrivilege特權,而且是啟用狀态,如附圖所示。

Windows Vista安全原理深入探索

現在真相大白了,原來Windows Vista表面上讓rundll32程序“明修棧道”,背地裡卻讓dllhost程序“暗渡陳倉”,把完全的管理者令牌賦予該dllhost程序,真正讓我們可以修改系統時間的是dllhost程序!

4.系統背後的動作

為了更好地對系統背後的動作進行監測,我們再啟動Process Monitor,然後再重複上述的操作。

結果在Process Monitor裡監測發現,單擊“日期和時間”視窗右下側的“更改日期和時間”按鈕,發現由svchost程序(程序ID為1924)啟動consent.exe程序,這個consent.exe程序就是“使用者帳戶控制”對話框,如附圖所示。

Windows Vista安全原理深入探索

盆盆評注 在Windows Vista下,應該用Process Monitor代替Filemon和Regmon,Process Monitor除了可以監控系統資料庫和檔案活動外,還可以監控程序的活動,包括其堆棧資訊。

輕按兩下這條記錄,在打開的屬性對話框上切換到“stack”标簽頁。在其堆棧資訊中發現一個“appinfo.dll”子產品,其描述為“應用程式資訊服務”,如附圖所示。原來這就是Windows Vista系統的“Application Information”服務,當系統确認程序需要管理者權限時,就會由“Application Information”服務負責啟動consent程序,以便打開“使用者帳戶控制”對話框。

Windows Vista安全原理深入探索

在Process Explorer中打開consent程序的屬性對話框,在“Image”标簽頁也可以發現consent的父程序的程序ID為“1924”(svchost程序),如附圖所示。

Windows Vista安全原理深入探索

打開程序ID為1924的svchost程序的屬性對話框,并切換到“Services”标簽頁,可以看到其下有“Application Information”服務,該服務以“appinfo.dll”的形式運作在svchost程序中,如附圖所示。

Windows Vista安全原理深入探索

在“使用者帳戶控制”對話框上單擊“繼續”按鈕後,系統獲得來自使用者的确認資訊,接下來我們可以通過Process Monitor監測到由另一個svchost程序(程序ID為1376)加載dllhost的程序映像檔案,如附圖所示。

Windows Vista安全原理深入探索

輕按兩下這條記錄,在打開的屬性對話框上切換到“stack”标簽頁,在堆棧資訊中發現一個“rpcss.dll”子產品,其描述為“分布式COM服務”,如附圖所示。原來這就是Windows Vista系統的“DCOM Server Process Launcher”服務,由該服務負責啟動dllhost程序。

Windows Vista安全原理深入探索

在Process Explorer中輕按兩下打開程序ID為1376的svchost程序的屬性對話框,并切換到“Services”标簽頁,可以看到其下有“DCOM Server Process Launcher”服務,該服務以“rpcss.dll”的形式運作在svchost程序中,如附圖所示。

Windows Vista安全原理深入探索

盆盆評注 “Remote Procedure Call (RPC)”服務也是以“rpcss.dll”的形式運作在另外一個svchost程序中。但是兩個并沒有服務共享同一個svchost程序,這是因為這兩個服務的啟動帳戶不同。“Remote Procedure Call (RPC)”服務的啟動帳戶是NETWORK SERVICE,而“DCOM Server Process Launcher”服務的啟動帳戶是SYSTEM。

接下來在Process Monitor中,我們可以看到dllhost程序檢查HKCR\AppID\{9DF523B0-A6C0-4EA9-B5F1-F4565C3AC8B8}系統資料庫鍵值,如附圖所示。以便知道應該加載“Timedate.cpl”系統資料庫元件,并最終允許修改系統時間。

Windows Vista安全原理深入探索

5.比較前後通路令牌的SID清單

仔細觀察前後兩個程序(rundll32程序和dllhost程序)通路令牌中的SID清單,如附圖所示,會發現有以下兩個顯著的不同。

Windows Vista安全原理深入探索

(1) rundll32程序:Administrators組SID被标記為Deny,這表明該程序實際上

不屬于

管理者組。同時通路令牌裡隻有五個特權,其中并沒有“SeSystemTimePrivilege”特權。

通路令牌裡包含一個名為“Mandatory Label\Medium Mandatory Level”的标簽SID。

(2)dllhost程序:Administrators組SID被标記為Owner,這表明該程序

屬于

管理者組。同時通路令牌裡包含“SeSystemTimePrivilege”特權。

通路令牌裡包含一個名為“Mandatory Label\High Mandatory Level” 的标簽SID。

6.修改系統時區

大家知道,在Windows XP下,我們無法在标準使用者下修改系統時區。但是在Windows Vista卻可以,無需提升權限,不知道讀者朋友有沒有考慮過這個問題。

原來這是因為Windows Vista的标準使用者多了一個“SeTimeZonePrivilege”(更改時區)特權,是以無需提升權限,就可以修改系統的時區,這給标準使用者帶來友善。

進一步研究發現,在打開“日期和時間”對話框時,其宿主程序rundll32的通路令牌中,雖然有“SeTimeZonePrivilege”,但是其狀态為“Disabled”(如上圖所示)。

而隻有在單擊“更改時區”按鈕時,rundll32程序的“SeTimeZonePrivilege”特權才會被激活,如附圖所示。

Windows Vista安全原理深入探索
實驗結論

1.UAC的實質

當管理者登入時,Explorer程序會獲得一個“縮水”的通路令牌,也叫标準使用者(Standard User)通路令牌。由于使用者程序大多數都是由Explorer啟動,是以這些程序會自動繼承這份“縮水”的通路令牌(如本例的rundll32程序)。

憑借縮水的通路令牌,使用者可以完成絕大多數工作,同時由于使用者權限被大大縮小,這樣使用者程序就不會有意無意破壞系統的完整性,這樣就可以大大減少受攻擊面。

如果需要執行管理任務,系統會提醒使用者進行确認,一旦認可,将會獲得完全版本的管理者通路令牌(如本例的dllhost程序)。

使用者帳戶控制好比給Windows Vista穿上一件鐵布衫,有了它的庇護,Windows系統不再奉行“不抵抗”政策,惡意網頁膽敢再來“騷擾”,将被毫不猶豫地阻止。同時最終使用者不再需要接受額外的教育訓練,一切都由系統自動完成,隻需要做出選擇即可,您就沒事偷着樂吧!

2.标簽SID

至于前後兩個程序的通路令牌中新出現的标簽SID,其中一個是“Mandatory Label\Medium Mandatory Level”,另一個是“Mandatory Label\High Mandatory Level”。這兩個帳戶,既不能用來登入,似乎也不能用來設定安全權限,那麼到底派什麼用場呢?

原來這是用來标記通路令牌,這樣系統看到通路令牌中包含“Mandatory Label\Medium Mandatory Level”的标簽SID,馬上就可以知道該令牌屬于标準使用者通路令牌;同樣如果令牌中包含“Mandatory Label\High Mandatory Level”的标簽SID,馬上就知道其屬于完全的管理者通路令牌。

那麼,為什麼不在通路令牌中新增一個标志位?例如等于0時就是标準使用者令牌,等于1時就是完全權限令牌?這樣的話,就不需要新增标簽SID了。也許是為了相容性,畢竟增加一個标志位,就等于要修改通路令牌的資料結構,這可不是一個好主意,而添加幾個SID,則相對簡單得多。

标簽SID的作用很大,當程序需要管理者權限時,系統會根據其父程序的标簽SID,來判定是否需要彈出“使用者帳戶控制”對話框。如果其父程序的标簽SID是“Mandatory Label\Medium Mandatory Level”,系統就會彈出“使用者帳戶控制”對話框。如果父程序的标簽SID是“Mandatory Label\High Mandatory Level”,就不會彈出“使用者帳戶控制”對話框,而是直接運作該目标程序。

由于絕大多數使用者程序的父程序是Explorer,是以會彈出“使用者帳戶控制”對話框。

除此之外, Windows本機安全性授權還用标簽SID來幫助判斷一個程序是否可以通路特定的資源對象,是否可以通路某個特定的程序。

盆盆評注 有關标簽SID的詳細作用,可以參考盆盆發表在ITECN部落格上的文章《Windows Vista有趣的标簽SID》:[url]http://blogs.itecn.net/blogs/ahpeng/archive/2007/02/27/labelsid.aspx[/url]

繼續閱讀