查看單個文章
舊 2006-09-17, 06:28 PM   #90 (permalink)
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設

Windows Vista用戶帳戶控制深度剖析
文章作者 盆盆
技術難度 Level300
內容簡介 本文詳細介紹了用戶帳戶控制(UAC)的應用程式標識、安全桌面和虛擬重定向等深層原理。詳細描述了用戶帳戶控制對用戶的價值,並且總結為什麼不能禁用UAC的若干理由。更重要的是,本文還就用戶廣為詬病的UAC問題提出比較巧妙的解決方案,既能盡可能規避UAC所帶來的麻煩,又能保留UAC的安全性。
原始鏈接 http://blogs.itecn.net/blogs/winvist.../09/UACV3.aspx


我們現在已經知道,在Windows Vista中,使用管理員帳戶登入系統,當Winlogon工作行程收集帳戶憑據並交由LSA驗證後。LSA會檢視該帳戶的訪問令牌,如果發現裡面包含某些高階特權(例如「修改系統時間」)或者高階SID(例如管理員組SID),就會自動創建兩個訪問令牌,一個是管理員訪問令牌(Full Token),另一個是標準用戶訪問令牌(UAC Token)。
由Winlogon啟動的初始化工作行程userinit鏈接到標準用戶訪問令牌,所以由userninit工作行程啟動的Explorer工作行程也鏈接到標準用戶訪問令牌。同樣由Explorer啟動的用戶工作行程也會自動鏈接到標準用戶訪問令牌,由此大大減少受攻擊面,極大地提升系統安全性。如附圖所示。
http://blogs.itecn.net/photos/ahpeng/images/3161/original.aspx

如果某個工作行程需要以更高權限執行,則系統會彈出一個權限提升交談視窗,確認後即可以更高權限執行該工作行程,該工作行程鏈接到管理員訪問令牌
提示
要瞭解有關UAC工作行程創建的流程,可以參考MVP Smallfrog的《Windows Vista UAC 模式下的工作行程創建實戰的故事》
五種標識權限提升的方法
Windows Vista並沒有一種與生俱來的魔力,可以未卜先知某個應用程式是否應該執行在更高安全級別上。應用程式必須自己想辦法通知Windows Vista它需要更高權限。有以下五種方法,讓Windows Vista明白該應用程式需要提升權限:
(1) Windows Vista可以智慧式識別安裝程式,例如根據安裝程式的文件名(包含install或者setup),還可以智慧式識別msi發佈的安裝包等等。可以做一個實驗,如果修改其他某個應用程式的名字,例如將QQ.exe重命名為QQInstall.exe,執行它就會自動觸發權限提升,原來UAC以為這是一個安裝程式。
(2) 在可執行文件的內容交談視窗、相容性標籤頁裡勾選「以管理員身份啟動該程式」復選框。這等效於在HKCU \Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers註冊表分支下新增鍵值,也相當於修改C:\Windows\AppPatch下的sysmain.sdb相容性資料庫。
(3) 在程式的manifest文件或者內嵌的manifest訊息裡加入「level=highestAvaible」或者「level requireAdministrator」安全級別。
(4) 滑鼠右鍵單擊應用程式,選擇「用管理員帳戶執行」表菜單項。
(5) 利用ACT(應用程式相容性工具)為特定應用程式創建相容性資料庫,以便IT部門可以方便地在企業裡部署相容性設置。
提示
其中(2)和(3)可以參考筆者的Windows VistaUAC安全功能深入剖析系列之二》
毀譽參半的安全桌面
大概是從5365 Build起,當系統彈出「用戶帳戶控制」提升權限交談視窗時(實際上是consent工作行程),桌面背景會呈暗色顯示,這可能導致某些顯示器彈出「無信號」的錯誤消息,正好可能擋住consent交談視窗,讓這些用戶感到非常不便。
1.原理簡析
其實這個功能的本意是非常好的,可以增加UAC功能的安全度。原來這個暗色的背景實際上是安全桌面,也就是我們按「Ctrl+Alt+Del」組合鍵時所看到的藍色的特殊桌面(上面有類似啟動任務管理器等命令)。為什麼看到的是暗色的當前桌面呢?原來這是微軟為了保持用戶體驗的一致性,特地對當前桌面做了一個「快照」,將其作為安全桌面的「牆紙」。
由於consent交談視窗實際執行在安全桌面上(安全桌面執行在session 0上,而用戶工作行程都執行在session 1或者更高的session上),所以安全性非常好。除了少數系統工作行程外,任何用戶工作行程都無法和consent交談視窗進行通信,所以惡意程式無法仿冒提升權限交談視窗以便誘使用戶點擊。
由於安全桌面的安全性非常好,所以連我們自己都無法直接監控UAC背後發生了什麼,同時甚至無法按PrintScreen鍵進行抓圖(剪貼板程式無法獲得鍵盤輸入)。
2.如何監控UAC底層變化
用一般方法無法對UAC背後的變化進行監控,因為這時候提升權限交談視窗執行在安全桌面上,用戶工作行程無法與之進行通信,所以我們必須另闢蹊徑。
聯想到Longhorn Server也具有UAC功能(預定禁用),所以我們可以利用Longhorn Server搭建一個實驗環境,用管理員帳戶登入進入Session 1,然後借助遠端桌面,以另外一個管理員身份登入到這台實驗機,進入Session 2。
我們在Session 1里試圖執行一個管理任務,這時候系統會提示權限提升。由於安全桌面的原因,這時候無法在Session 1下用Process Explorer訪問consent工作行程的詳細訊息。
這時候我們可以在遠端桌面視窗(Session 2)下打開Process Explorer,可以很方便地檢視consent工作行程的詳細訊息,如附圖所示,我們可以發現consent工作行程的父工作行程是svchost(本例的PID是1008),檢視這個PID 1008的svchost工作行程,發現是「Application Information Service」服務的宿主工作行程。所以可以推測是「Application Information Service」服務啟動了consent工作行程。同時還可以看到consent工作行程本身執行在Session 1,而不是Session 0。

http://photo.bababian.com/20060812/5EF1636B17414855DE4667519A76FB38.jpg

3.禁用安全桌面
可以用以下方法禁用安全桌面:
(1) 執行secpol.msc,打開「本機安全策略」管理單元視窗。
(2) 在左側的控制台樹中依次展開本機策略、安全選項,在右側的詳細視窗內裡雙擊「用戶帳戶控制:提示提升時切換到安全桌面」策略項。
(3) 在打開的交談視窗裡選中「已禁用」選項,如附圖所示。
http://blogs.itecn.net/photos/ahpeng/images/3149/original.aspx

UAC停薪留職
不少讀者朋友非常討厭UAC,有時候UAC就像是一位喋喋不休的MM,時不時地打斷我們的正常工作。為什麼那麼多朋友都無法容忍UAC?用戶對UAC功能的抱怨大概集中在以下兩個方面:
(1) 我已經是管理員了,為什麼不直接允許我執行管理任務?如果是第三方應用軟件倒也罷了,為什麼Windows自帶的工具軟件都要阻止我?為什麼不能讓防火牆一樣設置規則,讓UAC下次不要再提醒?
(2) 為什麼轉移、刪除一個文件都要那麼麻煩?
有不少朋友安裝好Windows Vista後,第一件事情就是禁用UAC!其實這是一種非常不值得的做法,至少有如下五大理由:
(1) UAC功能是Windows Vista中最大的賣點之一,花費不菲購買了Windows Vista,卻把其中最值錢的功能特性給禁用了,這很有點「買櫝還珠」的意思。
(2) 如果禁用UAC,則會同時禁用IE保護模式等安全特性,這將大大降低系統的安全性。
(3) 在企業環境裡,如果啟用UAC,可以減少約40%的桌面相關成本。
(4) 如果禁用了UAC,則當以普通用戶登入系統時,無法享受UAC帶來的便利(無法方便地安裝程式和執行管理任務,也無法享受UAC為遺留應用程式準備的相容性幫助)。
(5) 強烈推薦正在追MM的GGDD們啟用UAC,這可以幫助您提前訓練對MM嘮叨的抵抗力。
其實從Build 5308、Beta 2,一直到當前最新的5472,UAC功能的進步是有目共睹的,現在UAC的惱人提示已經減少了很多,也增加了很多人性化的改進,UAC功能已經變得越來越平易近人,更多時候,UAC就像一位站在不遠處用慈祥目光注視著我們的母親,而不再是一個在您耳邊不停斥責咆哮的上司。
如果您確實討厭UAC,推薦不要徹底禁用它,而是用以下兩種方法將其臨時禁用,需要時可以即時恢復。
1.臨時擺脫UAC的嘮叨瘋狂的石頭
(1) 打開任務管理器,切換到「工作行程」標籤頁,然後結束「Explorer」工作行程。
(2) 這時候再單擊「顯示所有用戶的工作行程」按鍵,即可讓任務管理器執行在管理員的級別上。
(3) 切換到「應用程式」標籤頁,單擊「新任務」按鍵,啟動「Explorer」工作行程,現在新啟動的「Explorer」工作行程執行在管理員級別下。
現在雖然在安全中心裡顯示UAC啟用,如附圖所示。但是實際上由於Windows系統的Shell工作行程Explorer此刻連接的訪問令牌是管理員級別的,所以在Windows裡啟動的任何應用程式都自動繼承管理員級別的訪問令牌,不受UAC的限制,包括執行管理任務和文件操作。
http://photo.bababian.com/20060812/A0BC8E8A4E00B9B6ACACDEC30CC2AFB0.jpg

這時候的UAC功能,光憑「肉眼」很難辨別真偽,說它是假的,安全中心裡明明顯示啟用;說它是真的,但是卻不會受到任何限制……
——這不就是瘋狂的石頭嗎?
那麼如何才能重新回到UAC狀態呢?聰明的您一定想到了,那就是用標準用戶權限重新啟動Explorer工作行程:
(1) 首先在任務管理器裡中止Explorer工作行程[記住:這時候任務管理器具有管理員權限],然後關閉任務管理器。
(2) 按「Ctrl+Alt+Del」組合鍵呼出安全桌面,點擊其上的「啟動任務管理器」,即可以標準用戶權限啟動任務管理器,並新增Explorer工作行程,好了,現在UAC又回來了!
提示
只有在萬不得已的情況才使用這種方法,而且推薦僅在該環境裡執行管理任務或者進行文件操作時,才用這種方法,至於IE等工作行程,最好在之前就啟動。不過該方法總比徹底禁用UAC功能要好。
2.讓UAC閉嘴
如果既希望啟用UAC功能,又希望讓UAC閉嘴,那麼可以通過以下方法修改本機安全策略:
(1) 執行secpol.msc,打開「本機安全策略」管理單元視窗。
(2) 在左側的控制台樹中依次展開本機策略、安全選項,在右側的詳細視窗內裡雙擊「用戶帳戶控制:管理審批模式中管理員的提示提升行為」策略項。
(3) 在打開的交談視窗裡選中「無提示」選項,如附圖所示。
http://photo.bababian.com/20060812/DCCBBF806285BEE122C6F75FFEF08443.jpg


這時候UAC的功能還是保持啟用狀態(可以在安全中心裡進行驗證),但是當執行管理任務時,系統不再提示確認,而是直接執行。當進行文件操作時,如果遇到權限問題,還是會發出提示,如附圖所示,但是單擊其上的「繼續」按鍵,並不會彈出「用戶帳戶控制」的確認交談視窗,而是直接完成文件操作。
http://photo.bababian.com/20060812/7650F515F0B0F91AF31AE0FCFE0B51BA_500.jpg

這種方法的安全性要強於禁用UAC,因為至少這時候IE保護模式等功能還是可以使用的。但是如果一個惡意軟件被標記為需要提升權限,那麼它同樣可以被直接執行。所以為了保證安全性,可以再啟用一條比較嚴厲的策略「用戶帳戶控制:只提升簽名並認證的可執行文件。」這樣沒有合法數位簽名的應用程式將拒絕執行。
提示
僅推薦忍耐力比較差的朋友們使用。
文件操作的噩夢與福音
UAC最為人詬病的就是文件操作的不方便,網上曾流傳著這樣一個笑話:要徹底刪除一個文件,需要花費七個步驟。
其實平心而論,這本不是UAC所造成的問題,恰恰相反,如果理解UAC的本質原理,還會發現UAC其實對文件操作是有幫助的。
何以見得?
原來在Windows安全體系中,用戶對文件能夠進行什麼操作,主要是看Explorer工作行程的訪問令牌和文件的訪問控制列表。如果該文件的訪問控制列表裡規定只有管理員才能執行刪除操作,那麼處於UAC環境下的用戶當然不能直接刪除該文件,這是因為這時候Explorer工作行程的訪問令牌中,管理員組的SID被過濾掉了。
這就好比,一個普通用戶無法在分區根目錄下新增文件,道理是一樣的。更何況UAC還給我們提供一個機會提升權限,以便可以進行適當的文件操作。
1.到底誰幫助我們提升了權限?
這裡面就帶來一個問題(筆者最初也曾疑惑不解),既然文件操作主要是看Explorer工作行程,但是提升權限後,並沒有發現Explorer工作行程的訪問令牌有什麼變化,這是為什麼?難道這個權限是從天上飛下來的?
經過檢查發現,當權限提升以後,系統會啟動一個Dllhost工作行程,該工作行程的訪問令牌是管理員級別的,如附圖所示,由這個Dllhost工作行程代替我們完成文件操作。
http://blogs.itecn.net/photos/ahpeng/images/3138/original.aspx

2.巧妙解決文件操作問題
在5456、5472這些Build裡,文件操作的UAC權限提升已經得到很大程度上的改善,例如現在按Shift+Del組合鍵,提升權限後,就可以直接徹底刪除文件,而不會像以前版本那樣,還需要花N多步驟清空資源回收筒。
如果您還是對現在的UAC文件操作不滿意,那麼以下的解決方法可能堪稱完美:
(1) 首先打開「資料夾選項」交談視窗,切換到「檢視」標籤頁,確保選中「在單獨的工作行程中開啟文件夾視窗」,如附圖所示。
http://blogs.itecn.net/photos/ahpeng/images/3140/original.aspx

Windows預定只能啟動一個Explorer工作行程。而這個設置確保可以打開兩個獨立的Explorer工作行程,以便我們給新的Explorer工作行程鏈接管理員的訪問令牌。
(2) 要想進行文件操作,需要事先關閉桌面上已有的資料夾視窗,然後右鍵單擊「Windows視窗檔案總管」表菜單項,選擇「用管理員帳戶執行」,現在就可以打開一個以管理員權限執行的視窗檔案總管視窗,在這裡我們可以任意進行文件操作,當然前提條件是文件允許管理員組這樣做,不會再出現UAC權限提升的提示。
為了方便起見,還可以為這個視窗檔案總管新增一個開始表菜單項:
(1) 把Explorer.exe從%windir%中複製到「文檔」裡,然後在內容交談視窗、「相容性」標籤頁裡勾選「以管理員身份啟動該程式」復選框。
(2) 滑鼠右鍵單擊其Explorer.exe,選擇「附到[開始]表菜單」命令,即可在開始表菜單裡新增表菜單項,可以將表菜單項重命名為「管理員:Windows視窗檔案總管」。
如果打開Process Explorer,就可以發現,現在系統裡有了兩個Explorer工作行程,其中一個工作行程被標識為「中強制級別」(Mandatory Integrity Level為中級),這個就是系統的Shell工作行程。另一個工作行程被標識為「高強制級別」,這就是以管理員身份執行的「Windows視窗檔案總管」,如附圖所示。
http://blogs.itecn.net/photos/ahpeng/images/3142/original.aspx

這種方法既可以完美地解決文件操作的麻煩,又可以保留UAC功能。當我們在開始表菜單或者快速啟動欄裡啟動IE時,IE照樣受UAC和IE保護模式的控制,而不會執行在管理員級別下。這是因為,這時候IE的父工作行程是「中強制級別」的那個Explorer工作行程。
虛擬重定向
和IE保護模式一樣,UAC也利用相容重定向實現對遺留應用程式的相容性,不過兩者採用的是彼此獨立、互不干涉的兩套機制。其原理大致如下:
某個遺留應用程式由於設計上的原因,需要在管理員權限,這些程式往往可能需要在一些「全局」的位置寫文件或者註冊表位置,這些「全局」的位置包括C:\Windows、C:\Program Files,還有HKEY_LOCAL_MACHINE註冊表分支。
由於UAC的作用,這些遺留應用程式執行在標準用戶權限下,所以沒有權限往這些「全局」的位置寫入內容。這時候虛擬重定向功能就起作用了,它可以把這些「全局」位置重定向到per-user的路徑,這樣就可以欺騙遺留應用程式,讓它可以順利執行在標準用戶狀態。
1.實例介紹
本文簡單介紹資料夾虛擬重定向的實現方法,以記事本為例,此處假設當前登入帳戶為Admin,Windows Vista安裝在D盤。
(1) 首先必須選擇Windows 2000/XP下的記事本,而不是Windows Vista內置的記事本工具。
(2) 打開Windows XP版本的記事本程式, 先確認一下記事本工作行程的訪問令牌,確實是工作在標準用戶權限下,如附圖所示,也就是說按照道理,記事本不可能對D:\Windows目錄有寫入權限。
http://blogs.itecn.net/photos/ahpeng/images/3143/original.aspx

(3) 輸入一段內容,然後單擊文件、儲存,把儲存路徑設置為D:\Windows,文件名為TestUAC.txt。非常奇怪,儲存操作居然沒有報錯「拒絕訪問」。
(4) 打開「我的電腦」,進入D:\Windows資料夾,裡面並沒有發現TestUAC.txt文件,不過我們在工具欄的最右側看到了一個「相容性」按鍵。
(5) 單擊「相容性」按鍵,即可進入「D:\Users\Admin\AppData\Local\VirtualStore\Windows」目錄,可以發現這個目錄下有一個TestUAC.txt文件,如附圖所示。
http://blogs.itecn.net/photos/ahpeng/images/3144/original.aspx

在這個過程中,如果用File Monitor進行監控,就會發現,當記事本嘗試往D:\Windows目錄寫入文件時,UAC應該會捕獲拒絕訪問的權限錯誤,然後自動啟用重定向機制,把這個文本文件重定向(儲存)到D:\Users\Admin\AppData\Local\VirtualStore\Windows目錄中,如附圖所示。
http://blogs.itecn.net/photos/ahpeng/images/3145/original.aspx

也就是說,UAC會自動把「全局」資料夾位置重定向到「%LocalAppData%\VirtualStore\」目錄,這是一個per-user的目錄,很顯然不同的用戶,重定向的目錄也有所不同。用戶A無法看到用戶B的重定向文件。這種隔離對大多數應用程式來說沒有什麼問題,但是對某些應用程式來說可能存在一些問題,例如某些遊戲軟件可能要求把遊戲得分記錄儲存在一個公共的位置,以便比較各個玩家的成績,但是UAC可能會讓每個玩家認為只有自己才是最棒的。
據微軟的調查結果,UAC的這種相容性大概能夠使得約92%的遺留應用程式可以正常工作在Windows Vista環境下。
2.原理簡析
從File Monitor抓圖中我們還能看到一個熟悉的單詞「REPARSE」(重解析),難道它和NTFS文件系統的重解析內容有什麼相關嗎?其實UAC的相容重定向是借助一個文件系統的篩選驅動程式(Filter Driver)來實現的,這個驅動的名字是luafv.sys,作為SYSTEM工作行程的線程在內核模式中載入,如附圖所示。
http://blogs.itecn.net/photos/ahpeng/images/3146/original.aspx

3.配置虛擬重定向
有讀者朋友肯定早就想問,為什麼這個實驗必須借助Windows XP下的記事本?為什麼不能用Windows Vista自帶的記事本工具?原來Windows Vista自帶的記事本工具實際上專門為UAC設計的,不能算是遺留應用程式,所以Windows Vista不會為它開啟虛擬重定向功能,如果嘗試向「全局」位置寫入文件,會直接受到拒絕訪問的錯誤消息。
那麼標準到底是什麼?Windows Vista憑什麼不給自帶的記事本開啟虛擬重定向相容特性?
原來秘密就在於程式的manifest訊息,Windows Vista自帶的記事本程式裡嵌入了manifest訊息,指定了其安全級別為「asInvoker」,Windows Vista將這類定義了安全級別manifest訊息的應用程式,一律視作合格的應用程式,不再對此應用虛擬重定向。
用Process Explorer可以查出,Windows Vista自帶的記事本的虛擬重定向標記為「No」,而Windows XP記事本的虛擬重定向標記為「Yes」。再例如QQ原本是可以啟用虛擬重定向的,但是在manifest文件(QQ.exe.manifest)裡新增以下安全級別訊息,如附圖所示
http://blogs.itecn.net/photos/ahpeng/images/3156/original.aspx

再啟動QQ後,發現其虛擬重定向標記為「No」,如附圖所示。
http://photo.bababian.com/20060812/8953F97364131CFA438504C427AC72FE.jpg


可以在本機安全策略裡指定Windows Vista是否啟用虛擬重定向功能,方法是禁用「用戶帳戶控制:將文件和註冊表寫入錯誤指定到每個用戶位置」策略項。
參考資料

http://www.microsoft.com/technet/windowsvista/security/uac.mspx
__________________
http://bbsimg.qianlong.com/upload/01/08/29/68/1082968_1136014649812.gif
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
回覆時引用此帖