| Windows Vista用戶帳戶控制深度剖析文章作者 盆盆    
 由Winlogon啟動的初始化進(jìn)程userinit鏈接到標(biāo)準(zhǔn)用戶訪問令牌,所以由userninit進(jìn)程啟動的Explorer進(jìn)程也鏈接到標(biāo)準(zhǔn)用戶訪問令牌。同樣由Explorer啟動的用戶進(jìn)程也會自動鏈接到標(biāo)準(zhǔn)用戶訪問令牌,由此大大減少受攻擊面,極大地提升系統(tǒng)安全性。如附圖所示。 如果某個(gè)進(jìn)程需要以更高權(quán)限運(yùn)行,則系統(tǒng)會彈出一個(gè)權(quán)限提升對話框,確認(rèn)后即可以更高權(quán)限運(yùn)行該進(jìn)程,該進(jìn)程鏈接到管理員訪問令牌。 提示 要了解有關(guān)UAC進(jìn)程創(chuàng)建的流程,可以參考MVP Smallfrog的《Windows Vista UAC 模式下的進(jìn)程創(chuàng)建實(shí)戰(zhàn)的故事》。 五種標(biāo)識權(quán)限提升的方法 Windows Vista并沒有一種與生俱來的魔力,可以未卜先知某個(gè)應(yīng)用程序是否應(yīng)該運(yùn)行在更高安全級別上。應(yīng)用程序必須自己想辦法通知Windows Vista它需要更高權(quán)限。有以下五種方法,讓Windows Vista明白該應(yīng)用程序需要提升權(quán)限: (1) Windows Vista可以智能識別安裝程序,例如根據(jù)安裝程序的文件名(包含install或者setup),還可以智能識別msi發(fā)布的安裝包等等。可以做一個(gè)實(shí)驗(yàn),如果修改其他某個(gè)應(yīng)用程序的名字,例如將QQ.exe重命名為QQInstall.exe,運(yùn)行它就會自動觸發(fā)權(quán)限提升,原來UAC以為這是一個(gè)安裝程序。 (2) 在可執(zhí)行文件的屬性對話框、兼容性標(biāo)簽頁里勾選“以管理員身份啟動該程序”復(fù)選框。這等效于在HKCU \Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers注冊表分支下添加鍵值,也相當(dāng)于修改C:\Windows\AppPatch下的sysmain.sdb兼容性數(shù)據(jù)庫。 (3) 在程序的manifest文件或者內(nèi)嵌的manifest信息里加入“level=highestAvaible”或者“level requireAdministrator”安全級別。 (4) 鼠標(biāo)右鍵單擊應(yīng)用程序,選擇“用管理員帳戶運(yùn)行”菜單項(xiàng)。 (5) 利用ACT(應(yīng)用程序兼容性工具)為特定應(yīng)用程序創(chuàng)建兼容性數(shù)據(jù)庫,以便IT部門可以方便地在企業(yè)里部署兼容性設(shè)置。 提示 其中(2)和(3)可以參考筆者的《Windows Vista UAC安全功能深入剖析系列之二》。 毀譽(yù)參半的安全桌面 大概是從5365 Build起,當(dāng)系統(tǒng)彈出“用戶帳戶控制”提升權(quán)限對話框時(shí)(實(shí)際上是consent進(jìn)程),桌面背景會呈暗色顯示,這可能導(dǎo)致某些顯示器彈出“無信號”的錯(cuò)誤消息,正好可能擋住consent對話框,讓這些用戶感到非常不便。 1.原理簡析 其實(shí)這個(gè)功能的本意是非常好的,可以增加UAC功能的安全度。原來這個(gè)暗色的背景實(shí)際上是安全桌面,也就是我們按“Ctrl+Alt+Del”組合鍵時(shí)所看到的藍(lán)色的特殊桌面(上面有類似啟動任務(wù)管理器等命令)。為什么看到的是暗色的當(dāng)前桌面呢?原來這是微軟為了保持用戶體驗(yàn)的一致性,特地對當(dāng)前桌面做了一個(gè)“快照”,將其作為安全桌面的“墻紙”。 由于consent對話框?qū)嶋H運(yùn)行在安全桌面上(安全桌面運(yùn)行在session 0上,而用戶進(jìn)程都運(yùn)行在session 1或者更高的session上),所以安全性非常好。除了少數(shù)系統(tǒng)進(jìn)程外,任何用戶進(jìn)程都無法和consent對話框進(jìn)行通信,所以惡意程序無法仿冒提升權(quán)限對話框以便誘使用戶點(diǎn)擊。 由于安全桌面的安全性非常好,所以連我們自己都無法直接監(jiān)控UAC背后發(fā)生了什么,同時(shí)甚至無法按PrintScreen鍵進(jìn)行截圖(剪貼板程序無法獲得鍵盤輸入)。 2.如何監(jiān)控UAC底層變化 用常規(guī)方法無法對UAC背后的變化進(jìn)行監(jiān)控,因?yàn)檫@時(shí)候提升權(quán)限對話框運(yùn)行在安全桌面上,用戶進(jìn)程無法與之進(jìn)行通信,所以我們必須另辟蹊徑。 聯(lián)想到Longhorn Server也具有UAC功能(默認(rèn)禁用),所以我們可以利用Longhorn Server搭建一個(gè)實(shí)驗(yàn)環(huán)境,用管理員帳戶登錄進(jìn)入Session 1,然后借助遠(yuǎn)程桌面,以另外一個(gè)管理員身份登錄到這臺實(shí)驗(yàn)機(jī),進(jìn)入Session 2。 我們在Session 1里試圖運(yùn)行一個(gè)管理任務(wù),這時(shí)候系統(tǒng)會提示權(quán)限提升。由于安全桌面的原因,這時(shí)候無法在Session 1下用Process Explorer訪問consent進(jìn)程的詳細(xì)信息。 這時(shí)候我們可以在遠(yuǎn)程桌面窗口(Session 2)下打開Process Explorer,可以很方便地查看consent進(jìn)程的詳細(xì)信息,如附圖所示,我們可以發(fā)現(xiàn)consent進(jìn)程的父進(jìn)程是svchost(本例的PID是1008),查看這個(gè)PID 1008的svchost進(jìn)程,發(fā)現(xiàn)是“Application Information Service”服務(wù)的宿主進(jìn)程。所以可以推測是“Application Information Service”服務(wù)啟動了consent進(jìn)程。同時(shí)還可以看到consent進(jìn)程本身運(yùn)行在Session 1,而不是Session 0。  3.禁用安全桌面 可以用以下方法禁用安全桌面: (1) 運(yùn)行secpol.msc,打開“本地安全策略”管理單元窗口。 (2) 在左側(cè)的控制臺樹中依次展開本地策略、安全選項(xiàng),在右側(cè)的詳細(xì)窗格里雙擊“用戶帳戶控制:提示提升時(shí)切換到安全桌面”策略項(xiàng)。 (3) 在打開的對話框里選中“已禁用”選項(xiàng),如附圖所示。 讓UAC停薪留職 不少讀者朋友非常討厭UAC,有時(shí)候UAC就像是一位喋喋不休的MM,時(shí)不時(shí)地打斷我們的正常工作。為什么那么多朋友都無法容忍UAC?用戶對UAC功能的抱怨大概集中在以下兩個(gè)方面: (1) 我已經(jīng)是管理員了,為什么不直接允許我執(zhí)行管理任務(wù)?如果是第三方應(yīng)用軟件倒也罷了,為什么Windows自帶的工具軟件都要阻止我?為什么不能讓防火墻一樣設(shè)置規(guī)則,讓UAC下次不要再提醒? (2) 為什么轉(zhuǎn)移、刪除一個(gè)文件都要那么麻煩? 有不少朋友安裝好Windows Vista后,第一件事情就是禁用UAC!其實(shí)這是一種非常不值得的做法,至少有如下五大理由: (1) UAC功能是Windows Vista中最大的賣點(diǎn)之一,花費(fèi)不菲購買了Windows Vista,卻把其中最值錢的功能特性給禁用了,這很有點(diǎn)“買櫝還珠”的意思。 (2) 如果禁用UAC,則會同時(shí)禁用IE保護(hù)模式等安全特性,這將大大降低系統(tǒng)的安全性。 (3) 在企業(yè)環(huán)境里,如果啟用UAC,可以減少約40%的桌面相關(guān)成本。 (4) 如果禁用了UAC,則當(dāng)以普通用戶登錄系統(tǒng)時(shí),無法享受UAC帶來的便利(無法方便地安裝程序和執(zhí)行管理任務(wù),也無法享受UAC為遺留應(yīng)用程序準(zhǔn)備的兼容性幫助)。 (5) 強(qiáng)烈推薦正在追MM的GGDD們啟用UAC,這可以幫助您提前訓(xùn)練對MM嘮叨的抵抗力。 其實(shí)從Build 5308、Beta 2,一直到當(dāng)前最新的5472,UAC功能的進(jìn)步是有目共睹的,現(xiàn)在UAC的惱人提示已經(jīng)減少了很多,也增加了很多人性化的改進(jìn),UAC功能已經(jīng)變得越來越平易近人,更多時(shí)候,UAC就像一位站在不遠(yuǎn)處用慈祥目光注視著我們的母親,而不再是一個(gè)在您耳邊不停斥責(zé)咆哮的上司。 如果您確實(shí)討厭UAC,推薦不要徹底禁用它,而是用以下兩種方法將其臨時(shí)禁用,需要時(shí)可以即時(shí)恢復(fù)。 1.臨時(shí)擺脫UAC的嘮叨—瘋狂的石頭 (1) 打開任務(wù)管理器,切換到“進(jìn)程”標(biāo)簽頁,然后結(jié)束“Explorer”進(jìn)程。 (2) 這時(shí)候再單擊“顯示所有用戶的進(jìn)程”按鈕,即可讓任務(wù)管理器運(yùn)行在管理員的級別上。 (3) 切換到“應(yīng)用程序”標(biāo)簽頁,單擊“新任務(wù)”按鈕,啟動“Explorer”進(jìn)程,現(xiàn)在新啟動的“Explorer”進(jìn)程運(yùn)行在管理員級別下。 現(xiàn)在雖然在安全中心里顯示UAC啟用,如附圖所示。但是實(shí)際上由于Windows系統(tǒng)的Shell進(jìn)程Explorer此刻連接的訪問令牌是管理員級別的,所以在Windows里啟動的任何應(yīng)用程序都自動繼承管理員級別的訪問令牌,不受UAC的限制,包括執(zhí)行管理任務(wù)和文件操作。 這時(shí)候的UAC功能,光憑“肉眼”很難辨別真?zhèn)?,說它是假的,安全中心里明明顯示啟用;說它是真的,但是卻不會受到任何限制…… ——這不就是瘋狂的石頭嗎? 那么如何才能重新回到UAC狀態(tài)呢?聰明的您一定想到了,那就是用標(biāo)準(zhǔn)用戶權(quán)限重新啟動Explorer進(jìn)程: (1) 首先在任務(wù)管理器里中止Explorer進(jìn)程[記?。哼@時(shí)候任務(wù)管理器具有管理員權(quán)限],然后關(guān)閉任務(wù)管理器。 (2) 按“Ctrl+Alt+Del”組合鍵呼出安全桌面,點(diǎn)擊其上的“啟動任務(wù)管理器”,即可以標(biāo)準(zhǔn)用戶權(quán)限啟動任務(wù)管理器,并新建Explorer進(jìn)程,好了,現(xiàn)在UAC又回來了! 提示 只有在萬不得已的情況才使用這種方法,而且推薦僅在該環(huán)境里運(yùn)行管理任務(wù)或者進(jìn)行文件操作時(shí),才用這種方法,至于IE等進(jìn)程,最好在之前就啟動。不過該方法總比徹底禁用UAC功能要好。 2.讓UAC閉嘴 如果既希望啟用UAC功能,又希望讓UAC閉嘴,那么可以通過以下方法修改本地安全策略: (1) 運(yùn)行secpol.msc,打開“本地安全策略”管理單元窗口。 (2) 在左側(cè)的控制臺樹中依次展開本地策略、安全選項(xiàng),在右側(cè)的詳細(xì)窗格里雙擊“用戶帳戶控制:管理審批模式中管理員的提示提升行為”策略項(xiàng)。 (3) 在打開的對話框里選中“無提示”選項(xiàng),如附圖所示。 這時(shí)候UAC的功能還是保持啟用狀態(tài)(可以在安全中心里進(jìn)行驗(yàn)證),但是當(dāng)執(zhí)行管理任務(wù)時(shí),系統(tǒng)不再提示確認(rèn),而是直接運(yùn)行。當(dāng)進(jìn)行文件操作時(shí),如果遇到權(quán)限問題,還是會發(fā)出提示,如附圖所示,但是單擊其上的“繼續(xù)”按鈕,并不會彈出“用戶帳戶控制”的確認(rèn)對話框,而是直接完成文件操作。  這種方法的安全性要強(qiáng)于禁用UAC,因?yàn)橹辽龠@時(shí)候IE保護(hù)模式等功能還是可以使用的。但是如果一個(gè)惡意軟件被標(biāo)記為需要提升權(quán)限,那么它同樣可以被直接執(zhí)行。所以為了保證安全性,可以再啟用一條比較嚴(yán)厲的策略“用戶帳戶控制:只提升簽名并認(rèn)證的可執(zhí)行文件。”這樣沒有合法數(shù)字簽名的應(yīng)用程序?qū)⒕芙^執(zhí)行。 提示 僅推薦忍耐力比較差的朋友們使用。 文件操作的噩夢與福音 UAC最為人詬病的就是文件操作的不方便,網(wǎng)上曾流傳著這樣一個(gè)笑話:要徹底刪除一個(gè)文件,需要花費(fèi)七個(gè)步驟。 其實(shí)平心而論,這本不是UAC所造成的問題,恰恰相反,如果理解UAC的本質(zhì)原理,還會發(fā)現(xiàn)UAC其實(shí)對文件操作是有幫助的。 何以見得? 原來在Windows安全體系中,用戶對文件能夠進(jìn)行什么操作,主要是看Explorer進(jìn)程的訪問令牌和文件的訪問控制列表。如果該文件的訪問控制列表里規(guī)定只有管理員才能執(zhí)行刪除操作,那么處于UAC環(huán)境下的用戶當(dāng)然不能直接刪除該文件,這是因?yàn)檫@時(shí)候Explorer進(jìn)程的訪問令牌中,管理員組的SID被過濾掉了。 這就好比,一個(gè)普通用戶無法在分區(qū)根目錄下新建文件,道理是一樣的。更何況UAC還給我們提供一個(gè)機(jī)會提升權(quán)限,以便可以進(jìn)行適當(dāng)?shù)奈募僮鳌?/span> 1.到底誰幫助我們提升了權(quán)限? 這里面就帶來一個(gè)問題(筆者最初也曾疑惑不解),既然文件操作主要是看Explorer進(jìn)程,但是提升權(quán)限后,并沒有發(fā)現(xiàn)Explorer進(jìn)程的訪問令牌有什么變化,這是為什么?難道這個(gè)權(quán)限是從天上飛下來的? 經(jīng)過檢查發(fā)現(xiàn),當(dāng)權(quán)限提升以后,系統(tǒng)會啟動一個(gè)Dllhost進(jìn)程,該進(jìn)程的訪問令牌是管理員級別的,如附圖所示,由這個(gè)Dllhost進(jìn)程代替我們完成文件操作。 2.巧妙解決文件操作問題 在5456、5472這些Build里,文件操作的UAC權(quán)限提升已經(jīng)得到很大程度上的改善,例如現(xiàn)在按Shift+Del組合鍵,提升權(quán)限后,就可以直接徹底刪除文件,而不會像以前版本那樣,還需要花N多步驟清空回收站。 如果您還是對現(xiàn)在的UAC文件操作不滿意,那么以下的解決方法可能堪稱完美: (1) 首先打開“文件夾選項(xiàng)”對話框,切換到“查看”標(biāo)簽頁,確保選中“在單獨(dú)的進(jìn)程中打開文件夾窗口”,如附圖所示。 Windows默認(rèn)只能啟動一個(gè)Explorer進(jìn)程。而這個(gè)設(shè)置確保可以打開兩個(gè)獨(dú)立的Explorer進(jìn)程,以便我們給新的Explorer進(jìn)程鏈接管理員的訪問令牌。 (2) 要想進(jìn)行文件操作,需要事先關(guān)閉桌面上已有的文件夾窗口,然后右鍵單擊“Windows資源管理器”菜單項(xiàng),選擇“用管理員帳戶運(yùn)行”,現(xiàn)在就可以打開一個(gè)以管理員權(quán)限運(yùn)行的資源管理器窗口,在這里我們可以任意進(jìn)行文件操作,當(dāng)然前提條件是文件允許管理員組這樣做,不會再出現(xiàn)UAC權(quán)限提升的提示。 為了方便起見,還可以為這個(gè)資源管理器添加一個(gè)開始菜單項(xiàng): (1) 把Explorer.exe從%windir%中復(fù)制到“文檔”里,然后在屬性對話框、“兼容性”標(biāo)簽頁里勾選“以管理員身份啟動該程序”復(fù)選框。 (2) 鼠標(biāo)右鍵單擊其Explorer.exe,選擇“附到[開始]菜單”命令,即可在開始菜單里添加菜單項(xiàng),可以將菜單項(xiàng)重命名為“管理員:Windows資源管理器”。 如果打開Process Explorer,就可以發(fā)現(xiàn),現(xiàn)在系統(tǒng)里有了兩個(gè)Explorer進(jìn)程,其中一個(gè)進(jìn)程被標(biāo)識為“中強(qiáng)制級別”(Mandatory Integrity Level為中級),這個(gè)就是系統(tǒng)的Shell進(jìn)程。另一個(gè)進(jìn)程被標(biāo)識為“高強(qiáng)制級別”,這就是以管理員身份運(yùn)行的“Windows資源管理器”,如附圖所示。 這種方法既可以完美地解決文件操作的麻煩,又可以保留UAC功能。當(dāng)我們在開始菜單或者快速啟動欄里啟動IE時(shí),IE照樣受UAC和IE保護(hù)模式的控制,而不會運(yùn)行在管理員級別下。這是因?yàn)?,這時(shí)候IE的父進(jìn)程是“中強(qiáng)制級別”的那個(gè)Explorer進(jìn)程。 虛擬重定向 和IE保護(hù)模式一樣,UAC也利用兼容重定向?qū)崿F(xiàn)對遺留應(yīng)用程序的兼容性,不過兩者采用的是彼此獨(dú)立、互不干涉的兩套機(jī)制。其原理大致如下: 某個(gè)遺留應(yīng)用程序由于設(shè)計(jì)上的原因,需要在管理員權(quán)限,這些程序往往可能需要在一些“全局”的位置寫文件或者注冊表位置,這些“全局”的位置包括C:\Windows、C:\Program Files,還有HKEY_LOCAL_MACHINE注冊表分支。 由于UAC的作用,這些遺留應(yīng)用程序運(yùn)行在標(biāo)準(zhǔn)用戶權(quán)限下,所以沒有權(quán)限往這些“全局”的位置寫入內(nèi)容。這時(shí)候虛擬重定向功能就起作用了,它可以把這些“全局”位置重定向到per-user的路徑,這樣就可以欺騙遺留應(yīng)用程序,讓它可以順利運(yùn)行在標(biāo)準(zhǔn)用戶狀態(tài)。 1.實(shí)例介紹 本文簡單介紹文件夾虛擬重定向的實(shí)現(xiàn)方法,以記事本為例,此處假設(shè)當(dāng)前登錄帳戶為Admin,Windows Vista安裝在D盤。 (1) 首先必須選擇Windows 2000/XP下的記事本,而不是Windows Vista內(nèi)置的記事本工具。 (2) 打開Windows XP版本的記事本程序, 先確認(rèn)一下記事本進(jìn)程的訪問令牌,確實(shí)是工作在標(biāo)準(zhǔn)用戶權(quán)限下,如附圖所示,也就是說按照道理,記事本不可能對D:\Windows目錄有寫入權(quán)限。 (3) 輸入一段內(nèi)容,然后單擊文件、保存,把保存路徑設(shè)置為D:\Windows,文件名為TestUAC.txt。非常奇怪,保存操作居然沒有報(bào)錯(cuò)“拒絕訪問”。 (4) 打開“我的電腦”,進(jìn)入D:\Windows文件夾,里面并沒有發(fā)現(xiàn)TestUAC.txt文件,不過我們在工具欄的最右側(cè)看到了一個(gè)“兼容性”按鈕。 (5) 單擊“兼容性”按鈕,即可進(jìn)入“D:\Users\Admin\AppData\Local\VirtualStore\Windows”目錄,可以發(fā)現(xiàn)這個(gè)目錄下有一個(gè)TestUAC.txt文件,如附圖所示。  在這個(gè)過程中,如果用File Monitor進(jìn)行監(jiān)控,就會發(fā)現(xiàn),當(dāng)記事本嘗試往D:\Windows目錄寫入文件時(shí),UAC應(yīng)該會捕獲拒絕訪問的權(quán)限錯(cuò)誤,然后自動啟用重定向機(jī)制,把這個(gè)文本文件重定向(保存)到D:\Users\Admin\AppData\Local\VirtualStore\Windows目錄中,如附圖所示。  也就是說,UAC會自動把“全局”文件夾位置重定向到“%LocalAppData%\VirtualStore\”目錄,這是一個(gè)per-user的目錄,很顯然不同的用戶,重定向的目錄也有所不同。用戶A無法看到用戶B的重定向文件。這種隔離對大多數(shù)應(yīng)用程序來說沒有什么問題,但是對某些應(yīng)用程序來說可能存在一些問題,例如某些游戲軟件可能要求把游戲得分記錄保存在一個(gè)公共的位置,以便比較各個(gè)玩家的成績,但是UAC可能會讓每個(gè)玩家認(rèn)為只有自己才是最棒的。 據(jù)微軟的調(diào)查結(jié)果,UAC的這種兼容性大概能夠使得約92%的遺留應(yīng)用程序可以正常工作在Windows Vista環(huán)境下。 2.原理簡析 從File Monitor截圖中我們還能看到一個(gè)熟悉的單詞“REPARSE”(重解析),難道它和NTFS文件系統(tǒng)的重解析屬性有什么相關(guān)嗎?其實(shí)UAC的兼容重定向是借助一個(gè)文件系統(tǒng)的篩選驅(qū)動程序(Filter Driver)來實(shí)現(xiàn)的,這個(gè)驅(qū)動的名字是luafv.sys,作為SYSTEM進(jìn)程的線程在內(nèi)核模式中加載,如附圖所示。  3.配置虛擬重定向 有讀者朋友肯定早就想問,為什么這個(gè)實(shí)驗(yàn)必須借助Windows XP下的記事本?為什么不能用Windows Vista自帶的記事本工具?原來Windows Vista自帶的記事本工具實(shí)際上專門為UAC設(shè)計(jì)的,不能算是遺留應(yīng)用程序,所以Windows Vista不會為它開啟虛擬重定向功能,如果嘗試向“全局”位置寫入文件,會直接受到拒絕訪問的錯(cuò)誤消息。 那么標(biāo)準(zhǔn)到底是什么?Windows Vista憑什么不給自帶的記事本開啟虛擬重定向兼容特性? 原來秘密就在于程序的manifest信息,Windows Vista自帶的記事本程序里嵌入了manifest信息,指定了其安全級別為“asInvoker”,Windows Vista將這類定義了安全級別manifest信息的應(yīng)用程序,一律視作合格的應(yīng)用程序,不再對此應(yīng)用虛擬重定向。 用Process Explorer可以查出,Windows Vista自帶的記事本的虛擬重定向標(biāo)記為“No”,而Windows XP記事本的虛擬重定向標(biāo)記為“Yes”。再例如QQ原本是可以啟用虛擬重定向的,但是在manifest文件(QQ.exe.manifest)里添加以下安全級別信息,如附圖所示 可以在本地安全策略里指定Windows Vista是否啟用虛擬重定向功能,方法是禁用“用戶帳戶控制:將文件和注冊表寫入錯(cuò)誤指定到每個(gè)用戶位置”策略項(xiàng)。 | 
|  |