Vista UAC研究之一——UAC 相關的基本技術
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
NetRoc
拿到了MS的Windows Vista Developer Story,正在抽空仔細的看,這裏當作記一些筆記吧,順便把文檔作一些翻譯和歸納記錄一下,免得以後忘記了,呵呵。
Vista UAC和開發相關的新技術主要有下面一些:
1、 ActiveX Installer Service
ActiveX Installer Service爲標準用戶(standard users)提供Active控件安裝的服務,這項服務保證了常規的運行任務不會被失敗的ActiveX空間安裝影響。Vista爲IT專業人士提供了一些組安全策略,用於定義標準用戶可以安裝ActiveX控件的URL。ActiveX Installer Service包含一個Windows service、一組管理模板、以及IE的一些改變。這是一個可選的安裝組件,只會在安裝之後才發揮作用。
2、 Installer Detection
顧名思義,這個技術提供了對安裝程序的識別支持。在UAC環境下,某些傳統的安裝程序可能無法取得必須的權限執行安裝,Windows提供了這樣一種技術,使得安裝或者升級程序會自動被系統識別,並在運行時自動提示用戶以管理員權限運行安裝程序。
Installer Detection只作用於32位可執行程序、程序的Manifest內不包含requestedExecutionLevel元素、UAC環境下的以Standard User運行的交互式進程。
當32位進程創建後,會根據以下一些屬性判斷是否是一個安裝程序:
l 文件名包含關鍵字:”install”, “setup”,”update”等等。
l 在版本資源的以下字段內包含關鍵字:廠商(Vendor)、公司名(CompanyName)、產品名(ProductName)、文件說明(File Description)、初始文件名(Original Filename)、內部文件名(Internal Name)、導出名(Export Name)。
l 在可執行文件的manifest內包含關鍵字。
l 在鏈接到可執行文件的特定StringTable中包含關鍵字
l 鏈接到可執行文件的資源文件數據包含關鍵屬性。
l 可執行文件包含特定的字節序列。(這一項應該是識別現在的各種安裝包格式的特徵)
安裝程序識別技術默認打開,並且可以在安全管理器或者組管理器裏面修改設置。
3、 User Interface Privilege Isolation
這個不知道該怎麼翻譯,用戶權限隔離?呵呵
這東西對木馬或者病毒還是有些作用的。
User Interface Privilege Isolation用於將完全管理員權限的進程和同一桌面的其他權限較低的程序進行隔離。UIPI作用於窗口和圖形子系統,例如提供窗口和用戶界面控件的USER子系統。UIPI阻止低權限的進程通過Windows Message發送輸入到高權限進程,而高權限進程可以發送到低權限進程。
UIPI阻止低權限進程的如下行爲:
l 驗證高權限進程的句柄的有效性
l 調用SendMessage或者PostMessage發送消息到高權限進程。如果這樣使用,函數會返回成功,但是發送的消息會被丟棄掉。
l 使用線程鉤子(Threads hooks)附加到高權限進程。
l 使用日誌鉤子(Journal hooks)監控高權限進程。
l 對高權限進程進行dll注入。
在UIPI有效的情況下,進程間的以下資源是可以跨權限訪問的:
l 前臺的Desktop window。
l 桌面堆共享內存
l 全局的atom table
l 剪貼板
4、 Virtualization
Vista之前的系統,程序一般都使用Admin權限運行,所以可以自由的讀寫系統文件和註冊表。但是在UAC下,以標準用戶模式運行時,讀寫這些目標會失敗。爲了提高應用程序兼容性,Vista提供了一套虛擬訪問的機制。
Virtualization分爲文件Virtualization和註冊表Virtualization。僅作用於32bit的應用程序對系統文件/目錄、註冊表的讀寫。64位程序、非交互式程序、模擬程序(Processes that impersonate)、內核調用者、含有requestedExecutionLevel屬性的可執行文件不包含在Virtualization的作用範圍內。
當應用程序在目錄或者註冊表中枚舉資源的時候,Windows Vista會合並虛擬的和全局的文件/註冊表鍵到單個List中,在合併視圖中,全局(被保護的)資源也會和虛擬資源一起包含進去。
MS關於虛擬存儲的建議:
虛擬存儲只是爲了應用程序兼容性而存在,爲Vista創建的應用程序不應該訪問系統敏感數據,也不能依賴虛擬存儲來糾正程序的不正確行爲。當轉移代碼到Windows Vista時,應確定在運行時,應用程序只能在有ACL被適當設置的用戶目錄或者%alluserprofile%存儲數據。
當更多的應用程序移植到Vista 之後,MS可能在未來版本的Windows取消對虛擬存儲的支持。例如64位應用程序是禁用虛擬存儲的。
l 在適當的情況下爲應用程序的Manifest加入requestedExecutionLevel,這樣會禁用虛擬存儲。
l 不要使用註冊表作爲進程間通信的途徑,服務和應用程序擁有註冊表鍵的不同視圖。
l 在Vista下測試你的應用程序,確認當運行在標準用戶模式下時,不會向系統全局名字空間寫入數據。例如%systemroot%。
l 對於過濾驅動開發者:檢查驅動存在的層的範圍,確過濾驅動在FSFilter之上。
l 記住虛擬存儲的資源是每個用戶都對全局資源有一個Copy。
5、 File Virtualization
當程序向只允許Admin訪問的路徑寫入的時候,系統會將它重定向到一個用戶相關的虛擬目錄中,位於%LOCALAPPDATA%/VirtualStore。之後,應用程序再讀取這個文件時,就會從虛擬目錄中讀取。Virtualization使得程序認爲自己在讀寫保護資源,但實際上讀寫的是虛擬的資源。
例如一個用戶使用的某個程序是在標準用戶模式下運行,並且該程序經常讀寫在/Program files裏面的某個文件,那麼當用戶通過Explorer.exe尋找這個文件時,他在/Program files裏面看到的只是一個全局文件,他需要定位到虛擬存儲的位置,才能找到保存數據的真實文件。
6、 Registry Virtualization
註冊表的虛擬存儲和文件虛擬存儲類似,對HKEY_LOCAL_MACHINE/SOFTWARE的讀寫會被重新定向到HKEY_CLASSES_ROOT/VirtualStore/SOFTWARE。在這個主鍵下面,每個用戶都會有它自己對HKEY_LOCAL_MACHINE/SOFTWARE讀寫過的數據的複製。
註冊表虛擬存儲的概要:
l 可以被Software hive (程序集?)打開或者關閉。
l Reg.exe有新的主鍵級的FLAGS選項,允許遞歸的啓用或者禁用虛擬存儲和控制打開訪問權限策略(open access right policy)。
l ZwQueryKey:可編程查詢一個鍵的重定向標誌。
l 虛擬存儲發生在WOW64重定向之上。
l 存在64位和32位註冊表視圖:
HKEY_USERS/UserSID_Classes/VirtualStore/Machine/Software
以及
HKEY_USERS/UserSID_Classes/VirtualStore/Machine/Software/SYSWOW3264
l 大多數vista出現之前的應用程序都會使用32位視圖。
7、 Access Token Changes
關於Access Token的問題,Vista改變還是不少的,由於以前很少接觸到權限相關的東西(很少有人更改安全配置,所以一般程序裏面都沒有管這些問題),這部分的東西看起來有點頭痛,呵呵。
在以往版本的Windows中,當Logon進程爲管理員創建Access token時,這個token包含大多數的Windows特權和大部分的管理員SID(security identifiers)。但是在Vista添加UAC之後,這種方式有了更改。當一個管理員用戶登錄到Vista系統時,系統可能會創建兩個Access token:一個經過過濾的標準用戶令牌,一個擁有完全的管理員權限的令牌。登錄桌面(Explorer.exe進程)現在使用標準用戶令牌,而不是完全管理員令牌,所以Explorer的子進程繼承了這個令牌,一般都是以普通用戶權限運行的。
當用戶登錄到Vista系統時,系統會檢查該用戶擁有的管理員特權和Relative IDs (RIDs),以決定是否爲用戶創建兩個Access Token。當以下任意一個條件滿足時,就會創建兩個token:
l 用戶帳戶包含下面任意一個RIDs:
n DOMAIN_GROUP_RID_ADMINS
n DOMAIN_GROUP_RID_CONTROLLERS
n DOMAIN_GROUP_RID_CERT_ADMINS
n DOMAIN_GROUP_RID_SCHEMA_ADMINS
n DOMAIN_GROUP_RID_ENTERPRISE_ADMINS
n DOMAIN_GROUP_RID_POLICY_ADMINS
n DOMAIN_ALIAS_RID_ADMINS
n DOMAIN_ALIAS_RID_POWER_USERS
n DOMAIN_ALIAS_RID_ACCOUNT_OPS
n DOMAIN_ALIAS_RID_SYSTEM_OPS
n DOMAIN_ALIAS_RID_PRINT_OPS
n DOMAIN_ALIAS_RID_BACKUP_OPS
n DOMAIN_ALIAS_RID_RAS_SERVERS
n DOMAIN_ALIAS_RID_PREW2KCOMPACCESS
n DOMAIN_ALIAS_RID_NETWORK_CONFIGURATION_OPS
n DOMAIN_ALIAS_RID_CRYPTO_OPERATORS
l 用戶帳戶包含任何不屬於User權限的特權,屬於User的權限如下:
n SeChangeNotifyPrivilege
n SeShutdownPrivilege
n SeUndockPrivilege
n SeIncreaseWorkingSetPrivilege
n SeTimeZonePrivilege
另外,被過濾的那個Token包含的權限,是由原始的Token是否包含上面的被限制的特權決定的。如果該Token含有這些被限制的特權,除了以下幾個之外,都會被移除:
SeChangeNotifyPrivilege
SeShutdownPrivilege
SeUndockPrivilege
SeReserveProcessorPrivilege
SeTimeZonePrivilege
如果沒有包含被限制的特權,則只有以下的Token會被移除:
SeCreateTokenPrivilege
SeTcbPrivilege
SeTakeOwnershipPrivilege
SeBackupPrivilege
SeRestorePrivilege
SeDebugPrivilege
SeImpersonatePrivilege
SeRelabelPrivilege
第一個訪問令牌,稱爲限制訪問令牌(filtered access token),擁有標記爲USE_FOR_DENY_ONLY的在前面列出的RIDs,而未在前面列出的管理員權限則被移除。當用戶啓動應用程序時,默認使用限制訪問令牌,而未被更改的擁有完全權限的令牌,會附加到限制訪問令牌,用於在應用程序要求獲得完全權限時。