|
原文摘自ITECN Blog,作者:盆盆<Microsoft MVP>
原文地址: 點擊查看 ITECN Blog是由近40位微軟MVP和MCT、還有微軟員工組成,旨在宣傳微軟IT Pro技術(shù) 本文以Windows Vista Build 5231為例,就“Date and Time”控制面板組件,在consent前后的進程訪問令牌的變化,來試圖探秘UAC功能的精妙之處。文章不但描述standard user和Full Privilege User之間的訪問令牌的差異,同時揭示了這種差異應用到本例的實質(zhì)(SeSystemTimePrivilege特權(quán))。最后,文章還嘗試解釋Windows Vista最新引入的兩個SID(Medium Mandatory Level和High Mandatory Level)的作用。 為了讓讀者諸公更好地享用后面的“正餐”,這里先呈上“開胃酒”─簡單介紹一下UAC的功能。UAC(用戶帳戶控制)可以說是采用逆向思維的典范: 傳統(tǒng)的安全規(guī)則告誡用戶必須工作在受限帳戶下,大多數(shù)用戶會困惑于為什么無法安裝應用程序,為什么無法修改系統(tǒng)時間─并沒有必然的理由要求用戶花時間學習runas的用法,他們有權(quán)專注于本職工作,而不是和這些令人生厭的命令打交道。 而UAC則是鼓勵用戶工作在管理員帳戶下,只是這個管理員帳戶經(jīng)過特殊的“降級”處理─多數(shù)情況下,用戶并不會有掣肘之感。如果要運行需要高特權(quán)的管理任務,系統(tǒng)會自動偵測到這種請求,在得到用戶確認后,會自動提升到高級特權(quán)環(huán)境,以便順利完成管理任務。 大家知道,要用“日期和時間”組件修改系統(tǒng)日期或者時間,當前帳戶必須具備“更改系統(tǒng)時間”特權(quán)(該特權(quán)的內(nèi)部名稱為SeSystemTimePrivilege)。本文以“日期和時間”組件為例進行實驗,查看其進程訪問令牌的前后變化(主要是SeSystemTimePrivilege特權(quán)的變化),來簡單剖析UAP功能的實質(zhì)。 實驗約定 本實驗在Windows Vista Build 5231上進行,測試帳戶為TestAdmin,是管理員組成員。為了查看進程的訪問令牌,需要借助聰明人Mark所提供的Process Explorer工具(這個工具實在太好了,我們經(jīng)常用它來查看IE瀏覽器所加載的dll文件,以便進行排錯─且按下不表),下載地址如下: http://www./Utilities/ProcessExplorer.html 實驗記錄 1.準備工作 鼠標右鍵單擊Process Explorer程序圖標,然后執(zhí)行“Run Elevated”菜單命令,以便在完全權(quán)限下運行Process Explorer,這樣我們就可以不受限制地查看任意進程的訪問令牌。啟動以后,單擊Options→Difference Highlight Duration,設置變化時間為5秒。 2.查看rundll32進程的訪問令牌 單擊任務欄通知區(qū)域的時鐘圖標,然后單擊“Date and Time Settings”,即可打開“時間和日期”窗口。正如您所預料的,現(xiàn)在還不能對系統(tǒng)時間進行任何修改。同時可以在Process Explorer窗口中看到新增一個進程rundll32(綠色顯示),如下圖所示。 雙擊該rundll32進程,即可打開其屬性對話框。在“Image”標簽頁的“Command Line”文本框里可以看到timedate.cpl(“時間和日期”的控制面板擴展文件),如下圖所示。這說明該rundll32進程就是“時間和日期”組件的宿主進程。 切換到“Security”標簽頁里,就可以看到經(jīng)過特殊降級處理后的訪問令牌,可以看到在下方的特權(quán)列表里,只有少得可憐的三個特權(quán),而并沒有SeSystemTimePrivilege特權(quán)!這就是為什么在缺省情況下,無法在TestAdmin環(huán)境下修改系統(tǒng)時間的原因。而在老的系統(tǒng)例如Windows XP,rundll32進程具有SeSystemTimePrivilege特權(quán),如下圖所示。 3.查看dllhost進程的訪問令牌 要能夠修改系統(tǒng)時間,只需單擊“時間和日期”窗口右下側(cè)的“Unlock”按鈕,即可打開如下圖所示的對話框,同時可以看到系統(tǒng)啟動了一個consent進程。單擊“I want to complete this action”選項,現(xiàn)在應該可以修改系統(tǒng)時間了。看來這個consent進程負責傳遞消息,以便系統(tǒng)確認提升操作權(quán)限。其本質(zhì)應該是修改相關(guān)進程的訪問令牌,對于本例來說,應該是在相關(guān)進程的安全令牌里添加SeSystemTimePrivilege特權(quán)。 按照這樣的推斷,從理論上來說,現(xiàn)在rundll32進程的訪問令牌里應該已經(jīng)添加SeSystemTimePrivilege特權(quán),以便我們可以修改系統(tǒng)時間,那么果真是這樣嗎? 結(jié)果很讓人沮喪,重新打開rundll32進程的屬性對話框,發(fā)現(xiàn)其訪問令牌沒有任何改變(并沒有新增SeSystemTimePrivilege特權(quán))!這是怎么回事? 反復重新做實驗后,終于發(fā)現(xiàn),單擊“I want to complete this action”選項后,系統(tǒng)會新增一個dllhost進程(在Process Explorer中綠色顯示),在dllhost進程屬性對話框的“Image”標簽頁的“Command Line”文本框里可以看到“/Processid: {9DF523B0-A6C0-4EA9-B5F1-F4565C3AC8B8}”參數(shù)。搜索注冊表得知,{9DF523B0-A6C0-4EA9-B5F1-F4565C3AC8B8}就是timedate.cpl的AppID,如下圖所示。 接下來的步驟不說也知道,切換到“Security”標簽頁,不出所料,dllhost進程的訪問令牌里果然有SeSystemTimePrivilege特權(quán),如下圖所示。 現(xiàn)在真相大白了,原來Windows Vista表面上讓rundll32進程“明修棧道”,背地里卻讓dllhost進程“暗渡陳倉”,真正讓我們可以修改系統(tǒng)時間的是dllhost進程! 4.比較前后訪問令牌的SID列表 仔細觀察前后兩個進程(rundll32進程和dllhost進程)訪問令牌中的SID列表,會發(fā)現(xiàn)有以下兩個顯著的不同: (1) rundll32進程:Administrators組SID被標記為Deny only,其含義類似于Windows XP/2003中Restricted Token。這表明Administrators組可以訪問的資源,和我們無關(guān),而Administrators拒絕訪問的資源,我們也不能訪問。 訪問令牌里包含一個名為“Medium Mandatory Level”的古怪帳戶(SID為S-1-16-8192)。 (2)dllhost進程:包含一個名為“High Mandatory Level”的“古怪”帳戶(SID為S-1-16-12288)。 實驗結(jié)論 1.UAP的實質(zhì) 非Administrator的管理員登錄時,Explorer進程會獲得一個“縮水”的訪問令牌,也叫標準用戶(Standard User)訪問令牌。由于其他進程大多數(shù)都是由Explorer啟動,所以這些進程會自動拷貝這份“縮水”的訪問令牌(如本例的rundll32進程)。憑借這份“縮水”的訪問令牌,用戶可以完成絕大多數(shù)工作,如果需要執(zhí)行管理任務,系統(tǒng)會提醒用戶進行確認,一旦認可,將會獲得完全版本的訪問令牌(如本例的dllhost進程)。 進一步驗證發(fā)現(xiàn),本例的rundll32進程由explorer進程啟動,所以默認會獲得一份“縮水”令牌;而dllhost進程則由某個svchost進程啟動。 2.古怪帳戶的作用猜測 至于前后兩個進程的訪問令牌中新出現(xiàn)的“古怪”帳戶(一個是“Medium Mandatory Level”,另一個是“High Mandatory Level”)。這兩個帳戶,既不能用來登錄,似乎也不能用來對資源的ACL賦值,到底用來做什么? 個人的猜測是用來標記訪問令牌,這樣系統(tǒng)看到訪問令牌中包含SID為S-1-16-8192的帳戶(Medium Mandatory Level),馬上就可以知道該令牌屬于標準用戶令牌;同樣如果令牌中包含SID為S-1-16-12288的帳戶(High Mandatory Level),馬上就知道其屬于完全權(quán)限的令牌。 那么為什么不在訪問令牌中新增一個標志位,例如等于0時就是標準用戶令牌,等于1時就是完全權(quán)限令牌?個人猜測是為了兼容性,畢竟增加一個標志位,就等于要修改訪問令牌的數(shù)據(jù)結(jié)構(gòu),這可不是一個好主意,而添加幾個SID,則相對簡單得多。 3.有趣的任務管理器 在實驗中,還發(fā)現(xiàn),如果右鍵單擊任務欄空白區(qū)域,打開任務管理器(其父進程是Explorer),則任務管理器運行在標準用戶的訪問令牌下;而按下Ctrl+Shift+Esc組合鍵打開的任務管理器(其父進程是Winlogon),則運行在完全權(quán)限的訪問令牌下。 最后小結(jié) UAP好比給Windows Vista穿上一件鐵布衫,有了它的庇護,像IE這樣的進程不再奉行“不抵抗”政策,惡意網(wǎng)頁膽敢再來“騷擾”,將被毫不猶豫地阻止。同時最終用戶不再需要接受額外的培訓,一切都由系統(tǒng)自動完成,只需要做出選擇即可,你就沒事偷著樂吧! 提示 1.有關(guān)UAC的官方資料,請參考Windows Vista開發(fā)組工程師Chen Yu先生的帖子: http://blogs./blogs/yuchen/archive/2005/10/19/994.aspx 2. 有關(guān)SeSystemTimePrivilege特權(quán)的相關(guān)內(nèi)容,參考了微軟知識庫文章編號KB 300022和《Windows Internals 4Edition》(Chapter 8 Security)中的相關(guān)內(nèi)容。有興趣的朋友可以閱讀這些資料了解相關(guān)背景知識。 3. 有關(guān)帳戶特權(quán)的更詳細信息,可以參考以下微軟官方網(wǎng)頁(Windows XP Resource Kit): http://www.microsoft.com/resourc ... s/prnd_urs_mhnn.asp 【ITECN技術(shù)專欄】之 Windows Vista的UAC功能淺析(二)
原文摘自ITECN Blog,作者:盆盆<Microsoft MVP>
原文地址: 點擊查看 ITECN Blog是由近40位微軟MVP和MCT、還有微軟員工組成,旨在宣傳微軟IT Pro技術(shù) 命令行程序的權(quán)限提升 看過《關(guān)閉計算機中惱人的beep噪音》一文的朋友,在對Windows Vista進行操作的時候需要格外注意! 由于Windows Vista默認啟用UAC功能,CMD Shell以Standard User的身份啟動,我們無法采用sc命令對beep服務進行配置(會收到Access is Denied的錯誤消息)。 這時候必須右鍵單擊開始菜單上的“Command Prompt”,選擇“Run as administrator”,以Highest Privilege運行CMD Shell,這樣SC命令才能拿到足夠特權(quán)完成相應的管理工作。如下圖所示,淡青底色的CMD Shell以Standard User身份運行(結(jié)果SC命令運行失敗),而紅底色的CMD Shell則以Highest Privilege運行(結(jié)果SC命令運行成功)。 提示 有關(guān)Windows Vista中CMD Shell的UAC功能“失靈”的另一個實例,可以參考MVP Smallfrog的帖子: http://blogs./blogs/sma ... 006/02/26/1832.aspx UAC的兩大要素 那么,為什么說在當前CTP Build的Windows Vista中,CMD Shell的UAC功能是“失靈”的? 竊以為,真正意義上的UAC,必須至少同時滿足以下兩個條件: ? 用戶進程運行standard user安全環(huán)境下,這點CMD Shell可以做到。 ? 當系統(tǒng)"識別"出目標進程需要高級特權(quán)才能完成,就會自動彈出提升特權(quán)確認對話框(consent進程),得到確認后,會以最高特權(quán)運行目標進程。 只有自動識別、自動提升特權(quán),才能算是UAC的精髓! 否則在Windows XP一樣可以讓用戶進程運行在Standard User環(huán)境(可以參考筆者的《IE瀏覽器,我想你安全、再安全些》),但是這充其量只能算是LUA(最小帳戶特權(quán)),而不夠格稱為UAC(用戶帳戶控制)! 修改UAC兼容性設置 能不能修改SC命令的兼容性設置,讓系統(tǒng)知道它需要管理員權(quán)限? 但是打開SC命令的屬性對話框,發(fā)現(xiàn)其兼容性設置被鎖死,如下圖所示,原因是SC命令屬于系統(tǒng)內(nèi)置的組件,這和Windows XP的情況一樣。 這里嘗試修改注冊表,試圖繞過這個限制,把SC命令添加到系統(tǒng)的兼容性數(shù)據(jù)庫中: (1) 打開regedit注冊表編輯器,定位到以下注冊表項: HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers (2) 新增一個字符串鍵值: 名稱必須設置為“C:\Windows\system32\sc.exe” 并將其數(shù)值數(shù)據(jù)設置為“RUNASADMIN” 提示 該注冊表修改完全等效于如圖2所示的兼容性設置,只是繞開了UI的限制。 現(xiàn)在打開一個Standard User的CMD Shell,再嘗試運行SC命令,系統(tǒng)也會彈出consent確認對話框,如下圖所示。 確認后系統(tǒng)會自動打開一個新的CMD窗口運行SC命令,只是該窗口會一閃而過,讓人來不及反應,但是SC命令確實是在高特權(quán)下運行的。 顯然上述的注冊表修改法并不是解決問題的良藥,實際上這只是強行把“皮球”踢給Explorer Shell(GUI)罷了,執(zhí)行的結(jié)果也并不理想,更何況數(shù)百個命令行工具,逐個修改的話,簡直是一場噩夢! Windows Vista區(qū)別對待不同的進程 同樣是系統(tǒng)內(nèi)置的組件,例如regedit、mmc等GUI組件,其兼容性設置也被鎖死,但是為什么系統(tǒng)會主動詢問是否提升權(quán)限?難道命令行工具是后媽養(yǎng)的,Windows Vista有意給它穿小鞋? 用記事本(或者其他編輯器)打開分別打開regedit.exe和sc.exe,進行仔細對比查看,發(fā)現(xiàn)了秘密所在: regedit.exe和SC.exe的內(nèi)容分別如下圖所示。 從圖中可以看出: QUOTE:
在SC.exe中有如下xml格式的語句:
level="asInvoker" regedit.exe中有如下xml格式的語句: level="highestAvailable" 原來UAC有一種機制,可以由應用程序的manifest(程序清單)來指定該應用程序的運行級別,可以在manifest中指定以下三種級別: ? asInvoker:繼承父進程的訪問令牌,這就是為什么SC.exe默認運行在standard User環(huán)境下,因為繼承了CMD Shell的訪問令牌。 ? highestAvailable:進程可以獲得它所能得到的最高級別的訪問令牌。 ? requireAdministrator:進程必須由管理員組成員啟動,并且必須獲得完全級別的訪問令牌。 唯一遺憾的是,只能由Microsoft自己對SC.exe的manifest信息進行修改,如果企圖借助Winhex等工具直接修改SC.exe中的Manifest信息(例如試圖將其RunLevel修改為"highestAvailable"),結(jié)果就會鬧和筆者一樣的笑話,收到“side by side”的出錯消息──都是不懂開發(fā)給整的~ 這里多說一句:如果病毒等惡意程序,也利用manifest信息在其代碼里添加特權(quán)標記,會不會誤導最終用戶? 應該不會: 從Build 5308開始,Windows Vista會自動檢查程序代碼中的數(shù)字簽名,并且在consent對話框里提供相應的警告信息。如果試圖運行一個沒有合法簽名的程序,Windows Vista會警告說該程序沒有合法的“身份證”,若要運行,后果自負。 要了解更多的有關(guān)manifest的信息,可以參考以下的微軟官方文檔: http://msdn.microsoft.com/librar ... html/AccProtWindows Vista.asp 實驗查驗Mandatory Label SID的作用 當系統(tǒng)嘗試啟動標記為高特權(quán)的進程時,Windows Vista并非不分青紅皂白,一味地彈出consent對話框要求確認。 其實這個問題在筆者的拙作《Windows Vista的UAC功能淺析(一)》中曾經(jīng)提到過Windows Vista新引入了幾個“古怪的SID(在本文,這些SID統(tǒng)稱為Mandatory Label SID): ? Medium Mandatory Level:其SID為S-1-16-8192。 ? High Mandatory Level:其SID為S-1-16-12288 ? System Mandatory Level:其SID為S-1-16-16384 ? Low Mandatory Level:該標志主要用于保護模式的IE瀏覽器等進程 這三個“古怪”帳戶SID,實際上就是專門用來標記訪問令牌的,這些帳戶既不能用于登錄,也不能用于安全權(quán)限分配。 筆者在Windows Vista CTP 5308虛擬機上,分別做以下三個實驗: (1) 直接運行regedit,會彈出consent對話框確認提升權(quán)限,這時候的父進程為explorer.exe,其Mandatory Label SID為“Medium Mandatory Level”。 (2) 以“Run as administrator”方式打開一個CMD Shell,這時候CMD進程的Mandatory Label SID為“High Mandatory Level”,在其下可以打開regedit,而無需確認。 (3) 按下ctrl+alt+del組合鍵,在Winlogon Desktop上單擊“Start Task Manager”按鈕,即可彈出如下圖所示的窗口,實際上就是一個taskmgr.exe進程,其Mandatory Label SID為“Medium Mandatory Level”,這里在Process Explorer里記下其PID(假設為2272): 在該窗口上單擊“All programs on this computer”按鈕,即可彈出一個consent對話框要求確認權(quán)限的提升。確認后即可彈出任務管理器,這時候原來的taskmgr進程(PID為2272)就會被自動殺死,現(xiàn)在我們在Process Explorer里打開新啟動的taskmgr進程的屬性對話框,可以看到其父進程就是那個已經(jīng)被殺死的PID為2272的進程!如下圖所示。難怪需要確認是否提升權(quán)限。 根據(jù)實驗結(jié)果,我們可以得出以下的結(jié)論: 當我們嘗試啟動某個標記為需要高特權(quán)的進程時,Windows Vista會檢查其“父進程”的訪問令牌,并根據(jù)訪問令牌里的Mandatory Label SID進行相應的判斷: ? 如果是Medium Mandatory Level:則彈出consent對話框要求確認權(quán)限的提升。 ? 如果是High Mandatory Level:則直接以完全權(quán)限打開目標進程,而無需確認。 ? 如果是System Mandatory Level:則直接以完全權(quán)限打開目標進程,而無需確認。 這里需要注意的是,在Build 5231的Windows Vista版本里,如果按下“ctrl+alt+del”組合鍵,會直接彈出一個擁有完全權(quán)限的任務管理器,因為這時候任務管理器的父進程是winlogon,其Mandatory Label SID為“System Mandatory Level”。 饅頭版的UAC 之所以沒有給命令行添加所謂的UAC功能,猜想Microsoft考慮到使用命令行的用戶大多是IT Pro,在命令行中屏蔽UAC功能,可以有效防止最終用戶無意之中運行高危險的命令,例如format、BCDEDIT等,從而避免對系統(tǒng)的毀滅性打擊。 盡管如此,筆者還是期待能夠看到適用于預命令行的UAC,這里筆者“效顰”胡戈同志的“饅頭”巨著,設計一個命令行版本的UAC工作界面,聊搏讀者諸公一笑耳。 【ITECN技術(shù)專欄】Windows Vista UAC安全功能深入剖析系列之(三) 原文摘自ITECN Blog,作者:盆盆<Microsoft MVP>
原文地址: 點擊查看 ITECN Blog是由近40位微軟MVP和MCT、還有微軟員工組成,旨在宣傳微軟IT Pro技術(shù) 難度 Level300 簡介 本文詳細介紹了UAC的應用程序標識、安全桌面和虛擬重定向等底層原理,并給出不能禁用UAC的若干理由。更重要的是,本文還將就用戶廣為關(guān)心的文件操作問題提出比較巧妙的解決方案(既能解決文件操作的麻煩,又能保留UAC的安全性);同時本文還為討厭UAC功能的朋友提供了兩個妥協(xié)折衷的方法,可以臨時擺脫UAC功能的“嘮叨”,而不需要因噎廢食、禁用UAC功能。 我們現(xiàn)在已經(jīng)知道,在Windows Vista中,使用管理員帳戶登錄系統(tǒng),當Winlogon進程收集帳戶憑據(jù)并交由LSA驗證后。LSA會查看該帳戶的訪問令牌,如果發(fā)現(xiàn)里面包含某些高級特權(quán)(例如“修改系統(tǒng)時間”)或者高級SID(例如管理員組SID),就會自動創(chuàng)建兩個訪問令牌,一個是管理員訪問令牌(Full Token),另一個是標準用戶訪問令牌(UAC Token)。 由Winlogon啟動的初始化進程userinit鏈接到標準用戶訪問令牌,所以由userninit進程啟動的Explorer進程也鏈接到標準用戶訪問令牌。同樣由Explorer啟動的用戶進程也會自動鏈接到標準用戶訪問令牌,由此大大減少受攻擊面,極大地提升系統(tǒng)安全性。 如果某個進程需要以更高權(quán)限運行,則系統(tǒng)會彈出一個權(quán)限提升對話框,確認后即可以更高權(quán)限運行該進程,該進程鏈接到管理員訪問令牌。 提示 要了解有關(guān)UAC進程創(chuàng)建的流程,可以參考MVP Smallfrog的《Windows Vista UAC 模式下的進程創(chuàng)建實戰(zhàn)的故事》。 五種標識權(quán)限提升的方法 Windows Vista并沒有一種與生俱來的魔力,可以未卜先知某個應用程序是否應該運行在更高安全級別上。應用程序必須自己想辦法通知Windows Vista它需要更高權(quán)限。有以下五種方法,讓Windows Vista明白該應用程序需要提升權(quán)限: (1) Windows Vista可以智能識別安裝程序,例如根據(jù)安裝程序的文件名(包含install或者setup),還可以智能識別msi發(fā)布的安裝包等等。可以做一個實驗,如果修改其他某個應用程序的名字,例如將QQ.exe重命名為QQInstall.exe,運行它就會自動觸發(fā)權(quán)限提升,原來UAC以為這是一個安裝程序。 (2) 在可執(zhí)行文件的屬性對話框、兼容性標簽頁里勾選“以管理員身份啟動該程序”復選框。這等效于在HKCU \Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers注冊表分支下添加鍵值,也相當于修改C:\Windows\AppPatch下的sysmain.sdb兼容性數(shù)據(jù)庫。 (3) 在程序的manifest文件或者內(nèi)嵌的manifest信息里加入“l(fā)evel=highestAvaible”或者“l(fā)evel requireAdministrator”安全級別。 (4) 鼠標右鍵單擊應用程序,選擇“用管理員帳戶運行”菜單項。 (5) 利用ACT(應用程序兼容性工具)為特定應用程序創(chuàng)建兼容性數(shù)據(jù)庫,以便IT部門可以方便地在企業(yè)里部署兼容性設置。 提示 其中(2)和(3)可以參考筆者的《Windows Vista UAC安全功能深入剖析系列之二》。 毀譽參半的安全桌面 大概是從5365 Build起,當系統(tǒng)彈出“用戶帳戶控制”提升權(quán)限對話框時(實際上是consent進程),桌面背景會呈暗色顯示,這可能導致某些顯示器彈出“無信號”的錯誤消息,正好可能擋住consent對話框,讓這些用戶感到非常不便。 1.原理簡析 其實這個功能的本意是非常好的,可以增加UAC功能的安全度。原來這個暗色的背景實際上是安全桌面,也就是我們按“Ctrl+Alt+Del”組合鍵時所看到的藍色的特殊桌面(上面有類似啟動任務管理器等命令)。為什么看到的是暗色的當前桌面呢?原來這是微軟為了保持用戶體驗的一致性,特地對當前桌面做了一個“快照”,將其作為安全桌面的“墻紙”。 由于consent對話框?qū)嶋H運行在安全桌面上(安全桌面運行在session 0上,而用戶進程都運行在session 1或者更高的session上),所以安全性非常好。除了少數(shù)系統(tǒng)進程外,任何用戶進程都無法和consent對話框進行通信,所以惡意程序無法仿冒提升權(quán)限對話框以便誘使用戶點擊。 由于安全桌面的安全性非常好,所以連我們自己都無法直接監(jiān)控UAC背后發(fā)生了什么,同時甚至無法按PrintScreen鍵進行截圖(剪貼板程序無法獲得鍵盤輸入)。 2.如何監(jiān)控UAC底層變化 用常規(guī)方法無法對UAC背后的變化進行監(jiān)控,因為這時候提升權(quán)限對話框運行在安全桌面上,用戶進程無法與之進行通信,所以我們必須另辟蹊徑。 聯(lián)想到Longhorn Server也具有UAC功能(默認禁用),所以我們可以利用Longhorn Server搭建一個實驗環(huán)境,用管理員帳戶登錄進入Session 1,然后借助遠程桌面,以另外一個管理員身份登錄到這臺實驗機,進入Session 2。 我們在Session 1里試圖運行一個管理任務,這時候系統(tǒng)會提示權(quán)限提升。由于安全桌面的原因,這時候無法在Session 1下用Process Explorer訪問consent進程的詳細信息。 這時候我們可以在遠程桌面窗口(Session 2)下打開Process Explorer,可以很方便地查看consent進程的詳細信息,如附圖所示,我們可以發(fā)現(xiàn)consent進程的父進程是svchost(本例的PID是1008),查看這個PID 1008的svchost進程,發(fā)現(xiàn)是“Application Information Service”服務的宿主進程。所以可以推測是“Application Information Service”服務啟動了consent進程。同時還可以看到consent進程本身運行在Session 1,而不是Session 0。 3.禁用安全桌面 可以用以下方法禁用安全桌面: (1) 運行secpol.msc,打開“本地安全策略”管理單元窗口。 (2) 在左側(cè)的控制臺樹中依次展開本地策略、安全選項,在右側(cè)的詳細窗格里雙擊“用戶帳戶控制:提示提升時切換到安全桌面”策略項。 (3) 在打開的對話框里選中“已禁用”選項,如附圖所示。 讓UAC停薪留職 不少讀者朋友非常討厭UAC,有時候UAC就像是一位喋喋不休的MM,時不時地打斷我們的正常工作。為什么那么多朋友都無法容忍UAC?用戶對UAC功能的抱怨大概集中在以下兩個方面: (1) 我已經(jīng)是管理員了,為什么不直接允許我執(zhí)行管理任務?如果是第三方應用軟件倒也罷了,為什么Windows自帶的工具軟件都要阻止我?為什么不能讓防火墻一樣設置規(guī)則,讓UAC下次不要再提醒? (2) 為什么轉(zhuǎn)移、刪除一個文件都要那么麻煩? 有不少朋友安裝好Windows Vista后,第一件事情就是禁用UAC!其實這是一種非常不值得的做法,至少有如下五大理由: (1) UAC功能是Windows Vista中最大的賣點之一,花費不菲購買了Windows Vista,卻把其中最值錢的功能特性給禁用了,這很有點“買櫝還珠”的意思。 (2) 如果禁用UAC,則會同時禁用IE保護模式等安全特性,這將大大降低系統(tǒng)的安全性。 (3) 在企業(yè)環(huán)境里,如果啟用UAC,可以減少約40%的桌面相關(guān)成本。 (4) 如果禁用了UAC,則當以普通用戶登錄系統(tǒng)時,無法享受UAC帶來的便利(無法方便地安裝程序和執(zhí)行管理任務,也無法享受UAC為遺留應用程序準備的兼容性幫助)。 (5) 強烈推薦正在追MM的GGDD們啟用UAC,這可以幫助您提前訓練對MM嘮叨的抵抗力。 其實從Build 5308、Beta 2,一直到當前最新的5472,UAC功能的進步是有目共睹的,現(xiàn)在UAC的惱人提示已經(jīng)減少了很多,也增加了很多人性化的改進,UAC功能已經(jīng)變得越來越平易近人,更多時候,UAC就像一位站在不遠處用慈祥目光注視著我們的母親,而不再是一個在您耳邊不停斥責咆哮的上司。 如果您確實討厭UAC,推薦不要徹底禁用它,而是用以下兩種方法將其臨時禁用,需要時可以即時恢復。 1.臨時擺脫UAC的嘮叨—瘋狂的石頭 (1) 打開任務管理器,切換到“進程”標簽頁,然后結(jié)束“Explorer”進程。 (2) 這時候再單擊“顯示所有用戶的進程”按鈕,即可讓任務管理器運行在管理員的級別上。 (3) 切換到“應用程序”標簽頁,單擊“新任務”按鈕,啟動“Explorer”進程,現(xiàn)在新啟動的“Explorer”進程運行在管理員級別下。 現(xiàn)在雖然在安全中心里顯示UAC啟用,如附圖所示。但是實際上由于Windows系統(tǒng)的Shell進程Explorer此刻連接的訪問令牌是管理員級別的,所以在Windows里啟動的任何應用程序都自動繼承管理員級別的訪問令牌,不受UAC的限制,包括執(zhí)行管理任務和文件操作。 這時候的UAC功能,光憑“肉眼”很難辨別真?zhèn)?,說它是假的,安全中心里明明顯示啟用;說它是真的,但是卻不會受到任何限制…… ——這不就是瘋狂的石頭嗎? 那么如何才能重新回到UAC狀態(tài)呢?聰明的您一定想到了,那就是用標準用戶權(quán)限重新啟動Explorer進程: (1) 首先在任務管理器里中止Explorer進程[記?。哼@時候任務管理器具有管理員權(quán)限],然后關(guān)閉任務管理器。 (2) 按“Ctrl+Alt+Del”組合鍵呼出安全桌面,點擊其上的“啟動任務管理器”,即可以標準用戶權(quán)限啟動任務管理器,并新建Explorer進程,好了,現(xiàn)在UAC又回來了! 提示 只有在萬不得已的情況才使用這種方法,而且推薦僅在該環(huán)境里運行管理任務或者進行文件操作時,才用這種方法,至于IE等進程,最好在之前就啟動。不過該方法總比徹底禁用UAC功能要好。 2.讓UAC閉嘴 如果既希望啟用UAC功能,又希望讓UAC閉嘴,那么可以通過以下方法修改本地安全策略: (1) 運行secpol.msc,打開“本地安全策略”管理單元窗口。 (2) 在左側(cè)的控制臺樹中依次展開本地策略、安全選項,在右側(cè)的詳細窗格里雙擊“用戶帳戶控制:管理審批模式中管理員的提示提升行為”策略項。 (3) 在打開的對話框里選中“無提示”選項,如附圖所示。 這時候UAC的功能還是保持啟用狀態(tài)(可以在安全中心里進行驗證),但是當執(zhí)行管理任務時,系統(tǒng)不再提示確認,而是直接運行。當進行文件操作時,如果遇到權(quán)限問題,還是會發(fā)出提示,如附圖所示,但是單擊其上的“繼續(xù)”按鈕,并不會彈出“用戶帳戶控制”的確認對話框,而是直接完成文件操作。 這種方法的安全性要強于禁用UAC,因為至少這時候IE保護模式等功能還是可以使用的。但是如果一個惡意軟件被標記為需要提升權(quán)限,那么它同樣可以被直接執(zhí)行。所以為了保證安全性,可以再啟用一條比較嚴厲的策略“用戶帳戶控制:只提升簽名并認證的可執(zhí)行文件?!边@樣沒有合法數(shù)字簽名的應用程序?qū)⒕芙^執(zhí)行。 提示 僅推薦忍耐力比較差的朋友們使用。 文件操作的噩夢與福音 UAC最為人詬病的就是文件操作的不方便,網(wǎng)上曾流傳著這樣一個笑話:要徹底刪除一個文件,需要花費七個步驟。 其實平心而論,這本不是UAC所造成的問題,恰恰相反,如果理解UAC的本質(zhì)原理,還會發(fā)現(xiàn)UAC其實對文件操作是有幫助的。 何以見得? 原來在Windows安全體系中,用戶對文件能夠進行什么操作,主要是看Explorer進程的訪問令牌和文件的訪問控制列表。如果該文件的訪問控制列表里規(guī)定只有管理員才能執(zhí)行刪除操作,那么處于UAC環(huán)境下的用戶當然不能直接刪除該文件,這是因為這時候Explorer進程的訪問令牌中,管理員組的SID被過濾掉了。 這就好比,一個普通用戶無法在分區(qū)根目錄下新建文件,道理是一樣的。更何況UAC還給我們提供一個機會提升權(quán)限,以便可以進行適當?shù)奈募僮鳌?br> 1.到底誰幫助我們提升了權(quán)限? 這里面就帶來一個問題(筆者最初也曾疑惑不解),既然文件操作主要是看Explorer進程,但是提升權(quán)限后,并沒有發(fā)現(xiàn)Explorer進程的訪問令牌有什么變化,這是為什么?難道這個權(quán)限是從天上飛下來的? 經(jīng)過檢查發(fā)現(xiàn),當權(quán)限提升以后,系統(tǒng)會啟動一個Dllhost進程,該進程的訪問令牌是管理員級別的,如附圖所示,由這個Dllhost進程代替我們完成文件操作。 2.巧妙解決文件操作問題 在5456、5472這些Build里,文件操作的UAC權(quán)限提升已經(jīng)得到很大程度上的改善,例如現(xiàn)在按Shift+Del組合鍵,提升權(quán)限后,就可以直接徹底刪除文件,而不會像以前版本那樣,還需要花N多步驟清空回收站。 如果您還是對現(xiàn)在的UAC文件操作不滿意,那么以下的解決方法可能堪稱完美: (1) 首先打開“文件夾選項”對話框,切換到“查看”標簽頁,確保選中“在單獨的進程中打開文件夾窗口”,如附圖所示。 Windows默認只能啟動一個Explorer進程。而這個設置確??梢源蜷_兩個獨立的Explorer進程,以便我們給新的Explorer進程鏈接管理員的訪問令牌。 (2) 要想進行文件操作,只需右鍵單擊“Windows資源管理器”菜單項,選擇“用管理員帳戶運行”,現(xiàn)在就可以打開一個以管理員權(quán)限運行的資源管理器窗口,在這里我們可以任意進行文件操作,當然前提條件是文件允許管理員組這樣做,不會再出現(xiàn)UAC權(quán)限提升的提示。 為了方便起見,還可以為這個資源管理器添加一個開始菜單項: (1) 把Explorer.exe從%windir%中復制到“文檔”里,然后在屬性對話框、“兼容性”標簽頁里勾選“以管理員身份啟動該程序”復選框。 (4) 鼠標右鍵單擊其Explorer.exe,選擇“附到[開始]菜單”命令,即可在開始菜單里添加菜單項,可以將菜單項重命名為“管理員:Windows資源管理器”。 如果打開Process Explorer,就可以發(fā)現(xiàn),現(xiàn)在系統(tǒng)里有了兩個Explorer進程,其中一個進程被標識為“中強制級別”(Mandatory Integrity Level為中級),這個就是系統(tǒng)的Shell進程。另一個進程被標識為“高強制級別”,這就是以管理員身份運行的“Windows資源管理器”,如附圖所示。 這種方法既可以完美地解決文件操作的麻煩,又可以保留UAC功能。當我們在開始菜單或者快速啟動欄里啟動IE時,IE照樣受UAC和IE保護模式的控制,而不會運行在管理員級別下。這是因為,這時候IE的父進程是“中強制級別”的那個Explorer進程。 虛擬重定向 和IE保護模式一樣,UAC也利用兼容重定向?qū)崿F(xiàn)對遺留應用程序的兼容性,不過兩者采用的是彼此獨立、互不干涉的兩套機制。其原理大致如下: 某個遺留應用程序由于設計上的原因,需要在管理員權(quán)限,這些程序往往可能需要在一些“全局”的位置寫文件或者注冊表位置,這些“全局”的位置包括C:\Windows、C:\Program Files,還有HKEY_LOCAL_MACHINE注冊表分支。 由于UAC的作用,這些遺留應用程序運行在標準用戶權(quán)限下,所以沒有權(quán)限往這些“全局”的位置寫入內(nèi)容。這時候虛擬重定向功能就起作用了,它可以把這些“全局”位置重定向到per-user的路徑,這樣就可以欺騙遺留應用程序,讓它可以順利運行在標準用戶狀態(tài)。 1.實例介紹 本文簡單介紹文件夾虛擬重定向的實現(xiàn)方法,以記事本為例,此處假設當前登錄帳戶為Admin,Windows Vista安裝在D盤。 (1) 首先必須選擇Windows 2000/XP下的記事本,而不是Windows Vista內(nèi)置的記事本工具。 (2) 打開Windows XP版本的記事本程序, 先確認一下記事本進程的訪問令牌,確實是工作在標準用戶權(quán)限下,如附圖所示,也就是說按照道理,記事本不可能對D:\Windows目錄有寫入權(quán)限。 (3) 輸入一段內(nèi)容,然后單擊文件、保存,把保存路徑設置為D:\Windows,文件名為TestUAC.txt。非常奇怪,保存操作居然沒有報錯“拒絕訪問”。 (4) 打開“我的電腦”,進入D:\Windows文件夾,里面并沒有發(fā)現(xiàn)TestUAC.txt文件,不過我們在工具欄的最右側(cè)看到了一個“兼容性”按鈕。 (5) 單擊“兼容性”按鈕,即可進入“D:\Users\Admin\AppData\Local\VirtualStore\Windows”目錄,可以發(fā)現(xiàn)這個目錄下有一個TestUAC.txt文件,如附圖所示。 在這個過程中,如果用File Monitor進行監(jiān)控,就會發(fā)現(xiàn),當記事本嘗試往D:\Windows目錄寫入文件時,UAC應該會捕獲拒絕訪問的權(quán)限錯誤,然后自動啟用重定向機制,把這個文本文件重定向(保存)到D:\Users\Admin\AppData\Local\VirtualStore\Windows目錄中,如附圖所示。 也就是說,UAC會自動把“全局”文件夾位置重定向到“%LocalAppData%\VirtualStore\”目錄,這是一個per-user的目錄,很顯然不同的用戶,重定向的目錄也有所不同。用戶A無法看到用戶B的重定向文件。這種隔離對大多數(shù)應用程序來說沒有什么問題,但是對某些應用程序來說可能存在一些問題,例如某些游戲軟件可能要求把游戲得分記錄保存在一個公共的位置,以便比較各個玩家的成績,但是UAC可能會讓每個玩家認為只有自己才是最棒的。 據(jù)微軟的調(diào)查結(jié)果,UAC的這種兼容性大概能夠使得約92%的遺留應用程序可以正常工作在Windows Vista環(huán)境下。 2.原理簡析 從File Monitor截圖中我們還能看到一個熟悉的單詞“REPARSE”(重解析),難道它和NTFS文件系統(tǒng)的重解析屬性有什么相關(guān)嗎?其實UAC的兼容重定向是借助一個文件系統(tǒng)的篩選驅(qū)動程序(Filter Driver)來實現(xiàn)的,這個驅(qū)動的名字是luafv.sys,作為SYSTEM進程的線程在內(nèi)核模式中加載,如附圖所示。 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)里添加以下安全級別信息,如附圖所: 再啟動QQ后,發(fā)現(xiàn)其虛擬重定向標記為“No”,如附圖所示。 可以在本地安全策略里指定Windows Vista是否啟用虛擬重定向功能,方法是禁用“用戶帳戶控制:將文件和注冊表寫入錯誤指定到每個用戶位置”策略項。 提示 可以訪問以下鏈接,以查閱《Windows Vista的UAC功能淺析(一)》: http://www./thread-36186-1-1.html |
|
|