本文翻譯於MSDN文章,名稱爲:Understanding and Working in Protected Mode Internet Explorer。
Url:http://msdn.microsoft.com/zh-cn/library/bb250462(en-us,VS.85).aspx
譯序:看英文的文章老是覺得隔一層紗,此次下定決定翻譯一篇英文文檔,以提升自己英文閱讀能力,也方便網友的閱讀,如下便是文章,有翻譯不當之處,敬請指正。
理解在保護模式下Internet Explorer的工作方式
Marc Silbey,
Peter Brundrett
Microsoft Corporation
2006 年 1 月
最後更新:2009年 2 月
適用於: Windows Internet Explorer 7 在 Windows Vista 和以後的系統中
摘要
在Windows Vista中,Internet Explorer 7 運行在保護模式下,保護模式能夠幫助用戶保護來自大大限制特權的運行中Internet Explorer 進程的攻擊。保護模式顯著減少寫、更換、在用戶機器上毀壞數據或植入惡意代碼攻擊的可能性。
這篇文章介紹保護模式,描述用來實現保護模式的Windows Vista的特性,展示如何開發在保護模式中工作的擴展組件,提出開發更具安全性程序的指導方針。
目錄
l 理解保護模式
n 保護模式簡介
n 理解Windows Vista的完整性機制
n 理解保護模式
n 配置保護模式
l 在保護模式下運行
n 尋找低完整性可寫路徑
n 保存文件到用戶屬性中
n 在保護模式下創建進程
n 在程序中允許拖拽功能
n 允許程序接收Windows消息
n 運行和導向保護模式進程
n 使用應用程序兼容性工具包調試程序
l 開發安全擴展組件
n 從擴展組件中安裝軟件
n 運行低完整性級別的進程
n 降低資源的完整性
n 確定進程的完整性級別
l 常見問題
理解保護模式
保護模式是Internet Explorer(IE)的一個重要的進步;它使用限制權限幫助用戶在Windows Vista中保護IE 進程。而保護模式並不保護所有的攻擊,它顯著減少寫、更換、在用戶機器上毀壞數據或植入惡意代碼攻擊的可能性。
保護模式簡介
對於Windows Xp Service Pack 2 大多數Internet Explorer 7 的安全特性都是可用的,而保護模式僅僅在Vista中奏效,因爲它基於Windows Vista 新的安全特性。
n 用戶賬戶控制(UAC)在沒有管理員權限下可以很容易使得程序運行。當用戶在限制權限下運行,他們比運行在管理員權限下更安全,因爲Windows 能夠限制惡意代碼執行破壞性操作。
n 完整性機制通過較低完整性進程,限制安全對象的寫訪問,同樣的,同一個組的用戶賬戶限制用戶訪問系統敏感組件的權限。
n 用戶界面特權隔離(UIPI)阻止進程向更高完整性的進程發送Windows消息和USER APIs。
當需要代扣特權來靜默安裝程序或更改敏感系統數據時。Windows Vista安全特性允許保護模式提供訪問網頁的權限。
這個段落幫助你理解保護模式,描述了Windows Vista完整性訪問級別,總結了Internet Explorer擴展的兼容性影響。
理解Windows Vista的完整性機制
Windows Vista包含一個額外的訪問控制安全機制,通過將進程和其他安全對象標籤一個完整性級別。面向Internet的程序比其他程序更高風險,因爲他們通過未知的源下載不值得信任的內容。相比於其他程序,使用更少的權限或更低的完整性級別來運行這些程序,將會減小更改系統或毀壞用戶數據文件的可能性。
保護模式使用Windows Vista的完整性機制在低完整性下運行Internet Explorer進程。完整性機制在Windows Vista中主要的特點如下:
l 安全對象,如文件和註冊表鍵值,或者需要權限級別來寫訪問的對象,擁有定義了完整性級別的安全描述符。完整性級別在系統訪問控制列表(SACL)中定義了新的強制訪問控制條目(ACE)。新的強制訪問控制條目(ACE)叫做強制描述符。沒有強制描述符的對象被指定爲默認中完整性級別。
l 擁有完整性級別的進程定義在安全訪問令牌中。在保護模式下,Internet Explorer擁有低完整性級別。從開始菜單運行的程序擁有中完整性級別。需要管理員權限運行的進程擁有高完整性級別。
l 低完整性級別的進程不能獲得高完整性級別進程的寫訪問權限,即使用戶的SID在自主訪問控制列表(DACL)中被賦予了寫訪問權限。完整性級別檢測先於用戶訪問權限檢測。
在Windows Vista中所有文件和註冊表鍵值擁有默認中等完整度級別。低完整性進程,像保護模式中的Internet Explorer,當它們嘗試去更改已經存在的文件時,將收到訪問拒絕錯誤。
一些目錄擁有低強制完整度級別。一個低完整度級別的進程,例如運行在保護模式的Internet Explorer,只能創建和修改處於低完整度級別目錄中的文件。例如,Internet 臨時文件目錄中有一個叫做Low的目錄,這就是低完整性級別目錄。在低完整性級別進程中,Windows Vista 完整性機制自動爲安全對象分配低強制完整度級別表示符。因此,由保護模式中的Internet Explorer或其他低完整性級別進程所創建的文件和其他對象被自動賦予低完整性級別標示。默認情況下,由低完整性級別進程所創建的子進程也將用低完整性級別來運行。保護模式允許被創建的進程擁有高完整性。更詳細的信息,參見在保護模式下創建進程章節。
如下表格展示了被支持的完整性訪問級別和被授予的權限
完整性訪問級別(IL) |
系統權限 |
高 |
管理員(進程能夠安裝文件到Program 文件夾和寫像HKEY_LOCAL_MACHINE一樣的註冊表敏感鍵值) |
中 |
用戶(進程能夠創建和更改在用戶Documents目錄下的文件和寫用戶特定的註冊表鍵值,如HKEY_CURRENT_USER) |
低 |
不信任的(進程僅僅能夠寫低完整性地方,如Temporary Internet Files/Low文件夾或HKEY_CURRENT_USER/Software/LowRegistry鍵值) |
理解保護模式
保護模式基於新的完整性機制,限制安全對象的寫訪問,像擁有高完整性級別進程、文件、和註冊表鍵值。當運行在保護模式中,Internet Explorer是一個低完整性級別的進程;它不能獲得文件和用戶配置或系統路徑註冊表的寫訪問權限。
低完整性進程僅僅能夠被寫入賦予了強制低完整性標示的目錄、文件和註冊表鍵值。因此,運行在保護模式中的Internet Explorer和擴展組件僅僅能夠寫低完整性級別目錄,例如新的低完整性Internet臨時目錄、歷史文件夾、Cookie文件夾、收藏夾和Windows 臨時文件夾。更詳細的列表,參見常見問題(FAQ)章節。
因此,保護模式僅僅能夠發送指定的Windows消息到更高完整性級別的進程。更多信息,請參見開發者在權限受限環境中的最佳方法和指導方針(Developer Best Practices and Guidelines for Applications in a Least Privileged Environment)中的用戶界面特權隔離(UIPI)章節。
當然,這些防禦措施也限制在更高完整性路徑合法的更改。因此,爲了減少對現存擴展組件的影響,保護模式提供一個兼容層,顯示在如下圖表中。
l 兼容層處理許多現存擴展組件的需要。它攔截中等完整度級別資源的寫操作,例如在用戶屬性下的Document文件夾和HKEY_CURRENT_USER註冊表。然而,它卻不攔截諸如Program Files和 HKEY_LOCAL_MACHINE的寫操作。這個兼容層使用Windows兼容片來自動將這些操作轉發到如下的低完整性級別路徑。
n Documents and Settings/%userprofile%/LocalSettings/TemporaryInternet Files/Virtualized
n HKEY_CURRENT_USER/Software/Microsoft/InternetExplorer/InternetRegistry
l 兩個更高權限的調用者進程允許Internet Explorer和擴展組件在用戶的允許下以高權限操作。例如,用戶權限調用者(IEUser.exe)進程提供一系列的函數讓用戶保存文件到低完整性路徑的外部。 另外,一個管理員權限調用者(IEInstal.exe)進程允許Internet Explorer安裝ActiveX組件。更多信息,請參見在保護模式下運行。
配置保護模式
保護模式能夠在Internet Explorer的Internet屬性對話框中配置。爲了配置保護模式,點擊安全Tab選項,選中該區域的安全級別,並且改變“開啓安全模式”複選框狀態。默認,對於Internet、Interanet、和被限制的站點安全模式是開啓的。爲了確認Internet Explorer是否運行在保護模式下,查看“保護模式:開啓”提示是否在Internet Explorer的狀態欄中。
保護模式將被配置當Windows Vista轉移URLACTION_LOWRIGHTS (0x00002500) URL操作。更多信息,請參見URL 安全區域概述。
在保護模式下運行
這個章節展示在保護模式中擴展組件能夠怎樣進行常用操作;它解釋了怎樣找到低完整性對象路徑,在低完整性目錄外保存文件,提升進程實質脫離保護模式,和調試保護模式訪問失敗。
尋找低完整性可寫路徑
在Windows Vista,在創建他們和他們的容器之間,安全對象自動繼承較低的完整性級別。這意味着,一個低完整性進程能夠獲得他們創建的對象的寫訪問權限。然而,一個低完整性進程不能獲得用戶屬性中中等或高完整性目錄或文件的寫訪問權限。
在寫入低完整性位置前,通過調用函數 IEIsProtectedModeProcess 擴展組件能夠檢測Internet Explorer是否運行在保護模式。當運行在保護模式,擴展組件能夠寫文件到低於用戶屬性的文件夾,典型的 %userprofile%/AppData/LocalLow。使用標識 FOLDERID_LocalAppDataLow 調用函數 SHGetKnownFolderPath 來獲得展開文件夾名稱。
注意 保護模式更改IE的環境變量。結果,當保護模式開啓時函數GetTempPath()返回%Temp/Low%。
低完整性進程能夠在註冊表中創建和寫入低完整性子鍵,例如,HKEY_CURRENT_USER/Software/AppDataLow。然而,運行在保護模式中的擴展組件進程僅僅能夠寫入指定的低完整性位置,並且需要使用IEGetWriteableHKCU來獲得低完整性註冊表位置。
安全警告 小心避免混合完整性級別。低完整性對象的存儲要與中等或高完整性對象分開。另外,中等和搞完整性程序在沒有合適的理由的前提下,要避免打開低完整性對象。
保存文件到用戶屬性中
爲了用戶或程序較遲發現這個文件,一些擴展組件需要保存文件到特定的位置。如下步驟展示怎樣將文件保存到地完整性之外的位置。
1) 在 %userprofile%/AppData/LocalLow 創建一個臨時文件。當文件成功刪除後,別忘記刪除這個臨時文件。
2) 使用用戶屬性路徑調用IEShowSaveFileDialog函數提示用戶保存文件到不同的路徑。如果用戶接受保存文件對話框,IEShowSaveFileDialog返回用戶選擇的目的文件夾。
3) 使用在第一步中的臨時路徑調用IESaveFile。
當你這樣做之後,保護模式的用戶調用者從臨時路徑拷貝文件到被用戶選中的路徑。
爲了獲得中完整性對象的寫訪問,使用特定的調用者進程,並且提升你的中間進程到中等權限進程。當運行與中等權限進程中,調用者對象能夠訪問中等完整新對象。更多信息,請參見在保護模式下創建進程。
保護模式下創建進程
通常的,擴展組件應該儘可能的在低完整性進程中運行。這提供了對惡意攻擊最好的保護。然而,有時候擴展組件也需要訪問中或高完整性對象。
爲了完成這個任務,創建一個調用者進程來訪問更高完整性對象,並且使用較高的完整性級別運行這個調用者進程。默認的,如下的屏幕截圖所示,Internet Explorer將提示用戶確定中等完整度進程權限提升。
你能夠通過創建提升策略來靜默的提升你的調用者進程到中等完整度,這是一系列告訴保護模式怎樣爲特定調用者提升的操作的註冊表鍵值。提升策略必須有一個全局唯一標示符(UUID)與他們關聯。使用 CreateGuid 來爲你的策略創建新的 GUID 。接下來,添加鍵值到指定的位置。
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Internet Explorer/Low Rights/ElevationPolicy
設置新鍵值的名稱爲你的策略所創建的GUID,並且加入如下設置。
1. Policy(DWORD)暗示保護模式怎樣運行調用者。如下表格描述了支持的值。
值 |
結果 |
3 |
保護模式使用中等完整性靜默運行調用者。 |
2 |
保護模式提示用戶允許運行進程。如果用戶同意,進程將用中等完整性運行。 |
1 |
保護模式使用低完整性靜默運行調用者。 |
0 |
保護模式阻止運行進程。 |
2. 如果你的調用者是一個可執行文件,加入如下設置到你的策略中。
n AppName(REG_SZ)是你的調用可執行調用者文件的文件名。
n AppPath(REG_SZ)是用戶選中的可執行調用者文件的安裝路徑。
3. 如果你的擴展組件運行一個沒有在 HKEY_CLASSES_ROOT 註冊的 COM 服務,並且動態通過 COM 註冊並通過 CoCreateInstance 調用,添加一個叫做 CLSID 的 REG_SZ 值包含 COM 服務的 CLSID,並且加入如下設置到策略中。
n CLSID(REG_SZ)包含你的擴展組件的 CLSID。
爲了模擬,如下的策略將靜默提升一個虛擬的叫做contoso.exe的調用者到中等完整性級別中。
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Internet Explorer/Low Rights/ElevationPolicy/{0002df01-0000-0000-c000-000000000046}
AppName="Contoso.exe"
AppPath="C:/%USERPROFILE%/Application Data/Contoso"
Policy=(DWORD) 00000003
注意 出於安全考慮,處於保護模式中的Internet Explorer忽略改變工作路徑的函數CreateProcess、CreateProcessAsUser和其他相關函數的參數。如果進程必須接受參數,使用邏輯XOR操作來添加0x80000到爲你的程序設置策略的鍵值中。請意識到這能夠創建一個安全風險,結果是災難性的。
如果微軟確定一個程序有弱點,並且爲用戶帶來危險,微軟保留任何時候移除這個程序提升策略的權利。
你也能創建能夠訪問高完整性對象的調用者。更多的描述關於怎樣運行搞完整性級別的調用者進程,請參見開發者在權限受限環境中的最佳方法和指導方針(Developer Best Practices and Guidelines for Applications in a Least Privileged Environment)中的管理員用戶程序指導方針(Guidelines for Administrative User Applications)。注意,你不需要創建一個提升策略,因爲 UAC 將管理這個提升。
如果你存在使用rundll32.exe作爲宿主.DLL 庫的擴展組件,你能夠通過添加庫的文件名到指定的鍵值來使用低完整性靜默調用rundll32.exe進程。
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Internet Explorer/Low Rights/RunDll32Policy
如下例子展示使用rundll32.exe低完整性靜默調用虛擬的contoso.dll庫的設置。
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Internet Explorer/Low Rights/RunDll32Policy/contoso.dll
注意 最好的方式是創建一個特定的exe作爲宿主DLL,而不是使用rundll32.exe.
在程序中允許拖拽功能
默認情況下,在允許網頁內容拷貝到更高完整性的進程中時,保護模式提示用戶允許操作。
你能夠創建拖拽策略來註冊你的程序來避免這個提示,並且靜默接受網頁拖拽功能。拖拽策略必須有全局唯一標示符(GUID)與之關聯。使用 CreateGuid 來爲你的策略創建一個新的 GUID。接下來,將鍵值加入如下位置。
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Internet Explorer/Low Rights/DragDrop
設置新鍵值的名稱爲你的策略所創建的GUID,並且加入如下設置。
1. Policy(DWORD)應該被設置爲 3,這表明保護模式允許網頁內容靜默的拷貝到你的程序進程中。
2. 如果你的程序是一個可執行文件,添加如下的設置到你的策略中。
n AppName(REG_SZ)是你的調用可執行調用者文件的文件名。
n AppPath(REG_SZ)是用戶選中的可執行調用者文件的安裝路徑。
3. 如果你的擴展組件運行一個沒有在 HKEY_CLASSES_ROOT 註冊的 COM 服務,並且動態通過 COM 註冊並通過 CoCreateInstance 調用,添加一個叫做 CLSID 的 REG_SZ 值包含 COM 服務的 CLSID,並且加入如下設置到策略中。
n CLSID(REG_SZ)包含你的擴展組件的 CLSID。
如下例子展示了所有的網頁內容將被靜默拷貝到虛擬的contoso.exe程序中的設置。
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Internet Explorer/Low Rights/DragDrop
AppName="contose.exe"
AppPath="C:/%USERPROFILE%/Application Data/Contoso"
Policy=(DWORD) 00000003
允許程序接收Windows消息
如上所述,UIPI 層將 Window 消息從低發到更高完整性進程。如果你的擴展組件運行在保護模式,並且需要使用Window 消息與一個提升權限的程序交互,你可以調用 ChangeWindowMessageFilter() 來使程序到允許特定消息。
注意 如果你需要與保護模式交互,最好的方式是在低完整性級別中運行你的程序。否則僅僅使用進程間通信(IPC)安全的方式,例如遠過程調用(RPC),來在保護模式和更高完整性級別進程中交互。
運行和導向保護模式進程
如果你的程序使用 CreateProcess 來運行IE,而在 Vista 中需要調用 IELaunchURL。這將確認你的程序獲得正確的返回值,和 IE 運行在保護模式中對於保護模式奏效的站點來說。如果你在運行一個 URL 之前需要確定一個指定的 URL 是否運行在低(保護模式)或中完整性 IE 進程中,調用 IEIsProtectedModeURL。注意,使用管理員權限運行的高完整性 IE 進程中的保護模式將被關閉。如果你想運行在你的高完整性進程中運行保護模式,你可以首先創建一箇中等完整性級別的進程,這個進程將調用你的高完整性進程和 IE。
如果你的程序使用 CoCreateInstance 來運行 Internet Explorer,並且當 IE 運行後需要繼續控制轉向,你可以使用 IWebBrowser2 來編程的轉向 Internet Explorer。如果你的程序與 IE 進程有同樣的完整性級別,當 IE 運行時你僅僅能夠繼續控制轉向。當你的程序轉向不同完整性 IE 進程,你將不能使用其他的轉向操作。你應該讓 IE 瀏覽框架可見。
如下例子展示怎樣使用 C++ 來完成這一功能。
hr = CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER,
IID_IWebBrowser2,(LPVOID*)&pIWebBrowser2);
hr = pIWebBrowser2->Navigate(bstrUrl, &vEmpty, &vEmpty, &vEmpty, &vEmpty);
hr = pIWebBrowser2->put_Visible(VARIANT_TRUE);
如下例子展示 JScript 版本。
var ie = new ActiveXObject("InternetExplorer.Application");
ie.Navigate("http://www.msn.com");
ie.visible = true;
使用應用程序兼容性工具包調試程序
保護模式使用在 Windows Xp Service Pack 2 中引入的微軟程序兼容工具箱來運行。
當保護模式中的 Internet Explorer 或者它的擴展組件嘗試寫安全對象,應用程序兼容日誌包含描述操作和結果。如下的列表解釋在日誌表單中的各個值。
l ModuleName 是運行這個進程並且訪問安全對象的文件名。
l VirtualizationAction 指示寫操作和如下的結果。
n InterceptedWrite 指示這個操作被兼容層攔截了。
n WriteIgnored 指示這個操作被保護模式忽略,由於調用進程是較高的調用者。
n CreateVirtualCopy 指示兼容層做了一個虛擬位置對象的拷貝。
n CreateNew 指示兼容層在虛擬位置創建了一個新的對象。
l ObjectType 是文件或註冊表。
l APIName 說明嘗試做這個操作的函數,例如,CreateFile 或 RegOpenKey。
l RegObjectPath 是操作嘗試改變的對象的位置。如果對象沒有路徑,則這是空的。
l 當寫操作成功,NewObjectPath 指示被這個操作更改的對象。
l APIResult 指示這個 API 函數嘗試寫操作的結果。
l LastError 是 API 函數收到的最終錯誤。
當嘗試着確定爲什麼沒有按照期望工作時,這個消息是無法被估計的。
開發安全擴展組件
爲保護模式開發 Internet Explorer 安全擴展組件跟爲開發 Windows Vista 安全程序沒有太大不同。另外這個知道方針在開發者在權限受限環境中的最佳方法和指導方針(Developer Best Practices and Guidelines for Applications in a Least Privileged Environment) 和 ActiveX 安全:改善和最好的實踐(ActiveX Security: Improvements and Best Practices),擴展組件開發人員需要理解怎樣在擴展組件中安裝軟件、運行低完整性級別的進程、降低資源完整性級別、和確定進程完整性級別。這個章節暫時怎樣執行這些操作。
從擴展組件中安裝軟件
當運行在保護模式中,ActiveX 控件和其他擴展組件不能安裝軟件。如果你的擴展組件需要更改高完整性對象,如Program Files文件夾或在HKEY_LOCAL_MACHINE下的註冊表鍵值,你應該創建獨立的運行在管理員權限下的安裝程序。
爲了在管理員權限下運行你的程序,你能夠包含一個程序manifest,詳細描述描述在開發者在權限受限環境中的最佳方法和指導方針(Developer Best Practices and Guidelines for Applications in a Least Privileged Environment)。安裝完成之後,你的擴展組件運行在保護模式中可以創建中完整級別的程序,而不是高完整性級別的。這將可以保護用戶,因爲運行用戶權限下而不是管理員權限。
如果你添加了提升策略,你必須關閉和重啓所有Internet Explorer 進程。IEUser.exe 不會自動檢測對提升策略的更改。
運行低完整性級別的進程
默認情況下,子進程繼承父進程的完整性級別。調用 CreateProcessAsUser 來在保護模式下運行低完整性級別的進程。爲了在一箇中完整性繼承中開啓一個低完整性級別的進程,你必須使用低完整性明顯的開啓一個新的進程。這需要三個步驟。
1、複製這個中等完整性級別進程的句柄。
2、使用 SetTokenInformation 將進程句柄來降低至低完整性。
3、使用 CreateProcessAsUser 和這個低完整性句柄來創建新的進程。
如下示例模擬了這個過程。
#include <sddl.h>
void CreateLowProcess()
{
BOOL bRet;
HANDLE hToken;
HANDLE hNewToken;
// Notepad is used as an example
WCHAR wszProcessName[MAX_PATH] = L"C://Windows//System32//Notepad.exe";
// Low integrity SID
WCHAR wszIntegritySid[20] = L"S-1-16-4096";
PSID pIntegritySid = NULL;
TOKEN_MANDATORY_LABEL TIL = {0};
PROCESS_INFORMATION ProcInfo = {0};
STARTUPINFO StartupInfo = {0};
ULONG ExitCode = 0;
if (OpenProcessToken(GetCurrentProcess(),MAXIMUM_ALLOWED, &hToken))
{
if (DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL,
SecurityImpersonation, TokenPrimary, &hNewToken))
{
if (ConvertStringSidToSid(wszIntegritySid, &pIntegritySid))
{
TIL.Label.Attributes = SE_GROUP_INTEGRITY;
TIL.Label.Sid = pIntegritySid;
// Set the process integrity level
if (SetTokenInformation(hNewToken, TokenIntegrityLevel, &TIL,
sizeof(TOKEN_MANDATORY_LABEL) + GetLengthSid(pIntegritySid)))
{
// Create the new process at Low integrity
bRet = CreateProcessAsUser(hNewToken, NULL,
wszProcessName, NULL, NULL, FALSE,
0, NULL, NULL, &StartupInfo, &ProcInfo);
}
LocalFree(pIntegritySid);
}
CloseHandle(hNewToken);
}
CloseHandle(hToken);
}
}
注意 你也可以通過設置註冊表鍵值在保護模式下運行低完整性級別的進程。更多信息,請參見創建進程(Starting Processes from Protected Mode)
降低資源的完整性
通常情況下,更高級別的進程將輸入或者資源與更低完整性進程共享,不是一個好且安全的方式。這兒的風險是低完整性進程可以嘗試惡意的行爲。然而,如果要這樣設計,有幾個步驟。
注意 將輸入或者資源與更低完整性進程共享的程序需要假設由更低完整性進程提供的數據時不可信的,並且需要採取認證措施。例如,保護模式顯示從Internet Explorer 用戶調用者進程中的另存爲對話框;這允許用戶確認使用一個比保護模式更高權限的進程來保存文件。
由於低完整性程序僅僅能夠寫入低完整性資源,你需要降低共享資源的完整性級別。
1、創建一個定義了低強制性標識符的 SDDL 安全描述符。
2、將 SDDL 字符串轉換爲安全描述符。
3、將低完整性屬性賦給安全描述符。
4、將安全描述符賦給共享資源。
如下實例演示這個過程。
#include <sddl.h>
#include <AccCtrl.h>
#include <Aclapi.h>
void SetLowLabelToFile()
{
// The LABEL_SECURITY_INFORMATION SDDL SACL to be set for low integrity
#define LOW_INTEGRITY_SDDL_SACL_W L"S:(ML;;NW;;;LW)"
DWORD dwErr = ERROR_SUCCESS;
PSECURITY_DESCRIPTOR pSD = NULL;
PACL pSacl = NULL; // not allocated
BOOL fSaclPresent = FALSE;
BOOL fSaclDefaulted = FALSE;
LPCWSTR pwszFileName = L"Sample.txt";
if (ConvertStringSecurityDescriptorToSecurityDescriptorW(
LOW_INTEGRITY_SDDL_SACL_W, SDDL_REVISION_1, &pSD, NULL))
{
if (GetSecurityDescriptorSacl(pSD, &fSaclPresent, &pSacl, &fSaclDefaulted))
{
// Note that psidOwner, psidGroup, and pDacl are
// all NULL and set the new LABEL_SECURITY_INFORMATION
dwErr = SetNamedSecurityInfoW((LPWSTR) pwszFileName,
SE_FILE_OBJECT, LABEL_SECURITY_INFORMATION,
NULL, NULL, NULL, pSacl);
}
LocalFree(pSD);
}
}
程序進程僅僅能夠設置那些相等或更低的進程的安全對象的完整性級別。
Windows Vista 允許擁有者更改安全對象的完整性訪問級別。這些更改將不會更新審計日誌。
擁有 READ_CONTROL 權限的進程可以使用 GetNamedSecurity 來確認安裝對象的完整性級別。
注意 低完整性文件將被保護模式層重定向,除了常見問題中的已知位置
確定進程的完整性級別
在不同進程中運行的擴展組件或許想判斷一個進程是運行在低或中等完整級別,並且根據狀況更改表現形式。如下步驟展示怎樣確定一個進程的完整性級別。
1、打開當前進程的句柄。
2、獲得令牌(Token)的完整性級別。
3、將這個完整性級別與系統預定義的完整性級別進行比較。
如下的例子展示如何做到這一點
void ShowProcessIntegrityLevel()
{
HANDLE hToken;
HANDLE hProcess;
DWORD dwLengthNeeded;
DWORD dwError = ERROR_SUCCESS;
PTOKEN_MANDATORY_LABEL pTIL = NULL;
LPWSTR pStringSid;
DWORD dwIntegrityLevel;
hProcess = GetCurrentProcess();
if (OpenProcessToken(hProcess, TOKEN_QUERY | TOKEN_QUERY_SOURCE, &hToken))
{
// Get the Integrity level.
if (!GetTokenInformation(hToken, TokenIntegrityLevel, NULL, 0, &dwLengthNeeded))
{
dwError = GetLastError();
if (dwError == ERROR_INSUFFICIENT_BUFFER)
{
pTIL = (PTOKEN_MANDATORY_LABEL)LocalAlloc(0, dwLengthNeeded);
if (pTIL != NULL)
{
if (GetTokenInformation(hToken, TokenIntegrityLevel, TIL, dwLengthNeeded, &dwLengthNeeded))
{
dwIntegrityLevel = *GetSidSubAuthority(pTIL->Label.Sid,
(DWORD)(UCHAR)(*GetSidSubAuthorityCount(pTIL->Label.Sid)-1));
if (dwIntegrityLevel < SECURITY_MANDATORY_MEDIUM_RID)
{
// Low Integrity
wprintf(L"Low Process");
}
else if (dwIntegrityLevel >= SECURITY_MANDATORY_MEDIUM_RID &&
dwIntegrityLevel < SECURITY_MANDATORY_HIGH_RID)
{
// Medium Integrity
wprintf(L"Medium Process");
}
else if (dwIntegrityLevel >= SECURITY_MANDATORY_HIGH_RID)
{
// High Integrity
wprintf(L"High Integrity Process");
}
}
LocalFree(pTIL);
}
}
}
CloseHandle(hToken);
}
}
常見問題
Q:UAC 文件和註冊表的虛擬化適用於保護模式嗎?
A:不,UAC 虛擬化不適用於保護模式,因此,向系統敏感區域寫數據將不會被重定向。對於系統區域,保護模式也不會寫重定向或者虛擬化。當他們向系統敏感區域寫入數據時,運行在保護模式下的擴展組件將獲得拒絕訪問錯誤。
Q:運行在Internet Explorer保護模式中的擴展組件可以寫 USER PROFILE 或者 HKEY_CURRENT_USER 註冊表這些特別的位置嗎?
A:可以,Internet Explorer 被限制在如下的 USER PROFILE 目錄。
Documents and Settings/%USER PROFILE%...
.../Local Settings/Temporary Internet Files
.../Local Settings/Temp
.../Local Settings/History .../%USER PROFILE%/Favorites .../%USER PROFILE%/Cookies
擴展組件可以寫如下位置。
Documents and Settings/%USER PROFILE%...
.../Local Settings/Temporary Internet Files/Low
.../Local Settings/Temp/Low
.../Local Settings/History/Low .../%USER PROFILE%/Favorites/Low .../%USER PROFILE%/Cookies/Low %USER PROFILE%/AppData/LocalLow
注意,擴展組件不能寫入如 Program Files 目錄或者 HKEY_CLASSES_ROOT、HKEY_LOCAL_MACHINE 子樹。
而且,擴展組件使用API函數去嘗試獲得寫訪問安全對象將獲得拒絕訪問錯誤。
actxprxy.dll |
ieui.dll |
mswsock.dll |
sensapi.dll |
Advapi32.dll |
iexplore.exe |
NAPINSP.dll |
Shdocvw.dll |
bcrypt.dll |
IMM32.dll |
ncrypt.dll |
SHLWAPI.dll |
BrowseUI.dll |
Inetcpl.cpl |
NETAPI32.dll |
SWEEPRX.dll |
clbcatq.dll |
IPHLPAPI.dll |
NLAapi.dll |
TAPI32.dll |
Comctl32.dll |
jscript.dll |
NSI.dll |
URLMon.dll |
Corpol.dll |
jsproxy.dll |
Ntdll.dll |
USERENV.dll |
CREDSSP.dll |
Kernel32.dll |
ntmarta.dll |
USP10.dll |
Crypt32.dll |
LPK.dll |
offprof.dll |
uxtheme.dll |
Cryptnet.dll |
mf.dll |
OLEACC.dll |
vbscript.dll |
dciman32.dll |
mlang.dll |
pnrpnsp.dll |
Wininet.dll |
ddraw.dll |
MPR.dll |
PSAPI.dll |
WINNSI.dll |
dhcpcsvc.dll |
MSASN1.dll |
rasadhlp.dll |
winrnr.dll |
dhcpcsvc6.dll |
mscms.dll |
rasapi32.dll |
WINSPOOL.DRV |
DNSAPI.dll |
MSCTF.dll |
rasdlg.dll |
winsta.dll |
dssenh.dll |
msfeeds.dll |
rasman.dll |
Wintrust.dll |
dwmapi.dll |
msfeedsbs.dll |
rpcrt4.dll |
ws2_32.dll |
Dxtmsft.dll |
Mshtml.dll |
rsaenh.dll |
wship6.dll |
Dxtrans.dll |
MSHTMLED.dll |
rtutils.dll |
wshtcpip.dll |
gpapi.dll |
msimg32.dll |
samlib.dll |
wsock32.dll |
Ieframe.dll |
msimtf.dll |
Schannel.dll |
wtsapi32.dll |
IEPeers.dll |
msls31.dll |
secur32.dll |
|
iertutil.dll |
Mstime.dll |
Secure32.dll |
|
Q:我怎樣才能從一個權限提升的 Internet Explorer 進程中停止工具欄?
A:許多工具欄安裝程序關閉所有正在運行的 Internet Explorer 實例,然後在運行一個新的,因此新的工具欄就是可見的了。這個問題是,新的Internet Explorer 從一個被提升的進程中調用的。工具欄可以通過關閉Internet Explorer然後重新運行來避免這個問題。更多信息,請參見運行低完整性級別的進程(Starting Low Integrity Processes)。