瞭解並執行 Internet Explorer 保護模式
來源:http://www.microsoft.com/china/msdn/library/webservices/WebApp/ProtectedMode.mspx?mfr=true
Marc Silbey
Peter Brundrett
Microsoft Corporation
適用於: Windows Vista 及更新版本中的 Microsoft Internet Explorer 7
注意: 本文件是預備文件,隨時可能變更。
摘要 在 Microsoft Windows Vista 中,Microsoft Internet Explorer 7 以“保護模式”執行,該模式通過以嚴格限制的許可權執行 Internet Explorer 程序,有助於保護使用者免受攻擊。 “保護模式”明顯降低了對使用者機器上的資料進行寫入、改寫或破壞或者安裝惡意程式碼的可能性。
本部分將介紹保護模式,描述用於實現保護模式的 Windows Vista 功能,說明如何開發可與保護模式配合使用的一些擴充套件程式,並提供開發更安全應用程式的指南。
瞭解保護模式
“保護模式”是 Internet Explorer (IE) 安全性方面的一項重大的進步;在 Windows Vista 上,通過以嚴格限制的許可權執行 IE 程序來保護使用者免受攻擊。 儘管“保護模式”不能防止所有形式的攻擊,但它明顯降低了對使用者機器上的資料進行寫入、改寫或破壞或安裝惡意程式碼等攻擊的可能性。
保護模式簡介
雖然大多數 Internet Explorer 7 安全功能都將在 Windows XP Service Pack 2 的 Internet Explorer 7 中提供,但“保護模式”僅適用於 Windows Vista,因為它是建立於 Windows Vista 的新增安全功能。
• |
使用者帳戶控制 (UAC) 可以輕鬆地執行而無需具備管理員許可權。 與使用管理員許可權執行相比,使用者使用受限制的使用者許可權執行程式時更不容易受到攻擊,因為 Windows 可以限制惡意程式碼進行具有破壞性的操作。 |
• |
完整性機制通過降低完整性程序限制對 securable objects 的寫入許可權,這與使用者帳戶組成員身份限制使用者訪問敏感系統元件許可權的方式十分相似。 |
• |
使用者介面特權隔離 (UIPI) 可防止程序將選定的視窗訊息和其他 USER API 傳送到以更高完整性執行的程序。 |
Windows Vista 安全基礎結構使“保護模式”可以為 Internet Explorer 提供瀏覽 Web 所需的許可權,同時還可限制無提示安裝程式或修改敏感系統資料所需的許可權。
本節將幫助您瞭解“保護模式”,介紹 Windows Vista 完整性訪問級別,並概括說明 Internet Explorer 擴充套件程式的相容性影響。
瞭解 Windows Vista 的完整性機制
Windows Vista 增加了 Windows 訪問控制安全機制,可使用完整性級別對程序和其他安全物件進行標記。 面向 Internet 的程式相對於其他程式來說受到攻擊的風險性更高,因為它們可能會從未知來源下載不可靠的內容。 與其他程式相比,用更少的許可權或以更低的完整性級別執行這些程式,會降低修改系統或損害使用者資料檔案的可能性。
“保護模式”利用 Windows Vista 完整性機制以低完整性執行 Internet Explorer 程序。 Windows Vista 完整性級別機制的主要功能如下:
• |
Securable objects,如檔案和登錄檔項,擁有定義完整性級別或物件寫入許可權所需許可權級別的安全描述符。 此完整性級別由系統訪問控制列表 (SACL) 中新的強制性訪問控制項 (ACE) 定義。 此新的強制性 ACE 稱為強制標籤。 沒有強制標籤的物件表明屬於預設的中等完整性級別。 |
• |
安全訪問令牌對程序的完整性級別進行了定義。 在“保護模式”下,Internet Explorer 的完整性級別為低階。 從“開始”選單執行的應用程式的完整性級別為中級。 需要管理員許可權的應用程式以高完整性級別執行。 |
• |
即使使用者的 SID 在自由訪問控制列表 (DACL) 中獲得了寫入許可權,低完整性程序也無法獲得對高完整性級別物件的寫入許可權。 在檢查使用者訪問許可權之前,先執行完整性級別檢查。 |
Windows Vista 中所有檔案和登錄檔項的預設完整性級別均為“中”。 低完整性程序,如保護模式下的 Internet Explorer,將在試圖修改現有檔案時收到拒絕訪問錯誤。
有些資料夾具有低完整性強制標籤。 低完整性程序,如保護模式下的 Internet Explorer,可以在低完整性資料夾中建立和修改檔案。 例如,“Internet 臨時檔案”資料夾包含名為“Low”的資料夾,即為低完整性資料夾。 Windows Vista 完整性機制會自動為低完整性程序建立的安全物件分配低完整性強制標籤。 其結果就是,保護模式下 Internet Explorer 建立的所有檔案和其他物件,或者其他任何低完整性程序都會自動分配低完整性強制標籤。 預設情況下,由低完整性程序啟動的子程序也將以低完整性級別執行。 保護模式允許用更高的完整性建立程序。 有關詳細資訊,請參閱從保護模式啟動程序章節內容。
下表列出了所支援的完整性訪問級別及其所授予的許可權。
完整性 訪問級別 (IL) |
系統許可權 |
高 |
管理許可權(程序可以將檔案安裝到“Program Files”資料夾,並寫入敏感登錄檔區域,如 HKEY_LOCAL_MACHINE。) |
中 |
使用者許可權(程序可在使用者的“文件”資料夾建立和修改檔案,並寫入使用者指定的登錄檔區域,如 HKEY_CURRENT_USER。) |
低 |
不受信任許可權(程序只能寫入低完整性位置,例如 Temporary Internet Files\Low 資料夾或 HKEY_CURRENT_USER\Software\LowRegistry key) |
瞭解保護模式
保護模式建立於新的完整性機制之上,以限制對安全物件(如,具有更高完整性級別的程序、檔案和登錄檔項)的寫入許可權。 當以保護模式執行時,Internet Explorer 是一個低完整性程序;因此它無法獲得對使用者配置檔案或系統位置中檔案和登錄檔項的寫入許可權。
低完整性程序只能寫入已經分配低完整性強制標籤的資料夾、檔案和登錄檔項。 因此,以“保護模式”執行的 Internet Explorer 和擴充套件程式只能寫入低完整性位置,例如,新的低完整性“Internet 臨時檔案”資料夾、歷史記錄資料夾、Cookie 資料夾、收藏夾資料夾和 Windows 臨時檔案資料夾。 有關完整列表,請參閱常見問題(FAQ)章節內容。
此外,Windows Vista 投入市場時“保護模式”程序以低完整性級別執行,這樣可防止其將特定的視窗訊息傳送到完整性更高的程序。 有關詳細資訊,請參閱 Developer Best Practices and Guidelines for Applications in a Least Privileged Environment 中的“User Interface Privilege Isolation Overview”部分。
通過阻止對使用者系統敏感區域進行未經授權的訪問,“保護模式”可限制由受損 IE 程序造成的損失程度。 例如,攻擊者無法悄無聲息地將擊鍵記錄程式安裝到使用者的“啟動”資料夾。 同樣,受損的程序也無法通過視窗訊息操作桌面上的應用程式。
當然,這些防禦措施也限制了對更高完整性位置的合法更改。 因此,“保護模式”提供了可降低對現有擴充套件程式影響的相容性體系結構,如下圖所示。
圖 1.保護模式相容性體系結構
• |
“相容層”處理許多現有擴充套件程式的需求。 並擷取對中等完整性資源(如使用者配置檔案中的“文件”資料夾和 HKEY_CURRENT_USER 登錄檔配置單元)的寫入嘗試。 相容層使用 Windows 相容性修補程式將這些操作自動重新定向到下列低完整性位置。
|
||||
• |
兩個具有更高許可權的代理程式程序允許 Internet Explorer 和擴充套件程式執行經使用者許可的提升操作。 例如,使用者許可權代理程式 (IEUser.exe) 程序提供一組允許使用者將檔案儲存到低完整性區域之外區域的功能。 另外,管理員許可權代理程式 (IEInstal.exe) 程序允許 Internet Explorer 安裝 ActiveX 控制元件。 |
有關詳細資訊,請參閱使用保護模式。
配置保護模式
保護模式可在 Internet Explorer 的 Internet 選項對話方塊中配置。 要配置“保護模式”,請單擊“Security”(安全性)選項卡,選擇 Web 內容區域,然後更改“Enable Protected Mode”(啟用保護模式)複選框。 預設情況下,Internet、Intranet 和“受限站點”區域啟用“保護模式”。 要驗證 Internet Explorer 是否以保護模式執行,請在 Internet Explorer 狀態列中顯示的 Web 內容區域旁 查詢文字“保護模式:開”。
如果 Windows Vista 通過 URLACTION_LOWRIGHTS (0x00002500)URL 操作交付,可通過組策略配置“保護模式”。 有關詳細資訊,請參閱 URL 安全區域簡介。
返回頁首使用保護模式
此部分說明擴充套件程式如何在“保護模式”下執行常見任務;介紹如何查詢低完整性物件位置、將檔案儲存在低完整性檔案位置之外、取消程序的保護模式以及除錯保護模式訪問故障。
查詢低完整性寫入位置
在 Windows Vista 中,安全物件會自動繼承那些建立此物件及其容器的完整性級別中較低的那一個程序的完整性。 因此,在保護模式下建立的檔案或登錄檔項具有低完整性。 這意味著低完整性程序可以獲得對其所建立物件的寫入許可權。 但是,低完整性程序無法獲得對使用者配置檔案中的中等或高完整性資料夾或檔案的寫入許可權。
在寫入低完整性位置前,擴充套件程式可通過呼叫IEIsProtectedModeProcess 函式確定 Internet Explorer 是否在“保護模式”下執行。 處於“保護模式”下時,擴充套件程式可將檔案寫入使用者 UserProfile 資料夾下的資料夾中,通常是 %userprofile%\AppData\LocalLow。 使用 SHGetKnownFolderPath 函式和 FOLDERID_LocalAppDataLow 標誌以獲得擴充套件的資料夾名稱。
SHGetKnownFolderPath(FOLDERID_LocalAppDataLow, 0, NULL, szPath, ARRAYSIZE(szPath));
注意 保護模式會修改 IE 的環境變數。 因此,GetTempPath() 函式在保護模式活動狀態下被呼叫時返回 %Temp%\Low。
低完整性程序可以建立並寫入登錄檔的低完整性子項,例如 HKEY_CURRENT_USER\Software\LowRegistry。 使用IEGetWriteableHKCU 函式可獲得低完整性登錄檔位置。
安全警報 小心避免混淆完整性級別。 應將低完整性物件與中等或高完整性物件分別進行儲存。 另外,中等和高完整性應用程式不應開啟未經適當驗證的低完整性物件。
將檔案儲存到使用者配置檔案
有些擴充套件程式需要將檔案儲存到特定位置,以便使用者或應用程式以後可以找到該檔案。 下列步驟展示如何將檔案儲存到低完整性位置之外。
1. |
在 %userprofile%\AppData\LocalLow 中建立檔案的臨時版本。 不要忘記在檔案成功儲存後刪除臨時檔案。 |
2. |
以使用者配置檔案資料夾的位置呼叫 IEShowSaveFileDialog 來提示使用者將檔案儲存到其他位置。 如果使用者接受“另存為”對話方塊,IEShowSaveFileDialog 返回所選的目標資料夾。 |
3. |
用步驟 1 中儲存的臨時檔案位置呼叫 IESaveFile。 |
執行此操作時,“保護模式”的使用者代理程式會將檔案從臨時位置複製到使用者選擇的位置。
要獲得對其他中等完整性物件的寫入許可權,請使用自定義代理程式程序,然後將您的代理程式提升至中級程序。 作為中級程序執行時,代理程式物件可以訪問中等完整性物件。 有關詳細資訊,請參閱從保護模式啟動程序。
從保護模式啟動程序
通常,擴充套件程式應儘可能作為低完整性程序執行。 這可提供防禦惡意攻擊的最佳保護。 不過,有時擴充套件程式可能需要訪問中等甚至高完整性物件。
因此,先建立一個代理程式程序來訪問完整性更高的物件,然後以更高的完整性級別啟動代理程式程序。 預設情況下,Internet Explorer 將提示使用者確認中等完整性提升程序,如下列螢幕快照所示。
圖 1.保護模式提升確認提示
可通過建立提升策略將您的代理程式程序自動提升至中等完整性級別,該策略包含一組告訴“保護模式”如何處理特定代理程式提升的登錄檔項和值。 提升策略必須擁有一個與其關聯的全域性唯一識別符號 (GUID)。 使用CreateGuid 為策略建立新的 GUID。 然後,將登錄檔項新增至以下位置。
HKEY_LOCAL_MACHINE SOFTWARE Microsoft Internet Explorer Low Rights ElevationPolicy
將新登錄檔項的名稱設定為針對策略所建立的 GUID,然後將以下設定新增到登錄檔項中。
1. |
Policy(DWORD) 指示“保護模式”應如何啟動代理程式。 下表說明了所支援的值。
|
||||||||||
2. |
如果代理程式是可執行檔案,請將以下設定新增到策略中。
|
||||||||||
3. |
如果您的擴充套件程式啟動未在 HKEY_CLASSES_ROOT 註冊的 COM 伺服器,那麼可通過 COM 動態註冊該伺服器並通過 CoCreateInstance 啟動,再新增名為 CLSID(包含 COM 伺服器的 CLSID)的 REG_SZ 值,然後將以下設定新增到您的策略中。
|
為便於說明,以下策略會將名為 contoso.exe 的虛擬代理程式自動提升至中等完整性級別。
HKEY_LOCAL_MACHINE SOFTWARE Microsoft Internet Explorer LowRights ElevationPolicy {0002df01-0000-0000-c000-000000000046} AppName="Contoso.exe" AppPath="C:\%USERPROFILE%\Application Data\Contoso" Policy=(DWORD) 00000003
如果 Microsoft 確定某個應用程式存在漏洞並對終端使用者構成威脅,Microsoft 會保留隨時將該應用程式從提升策略中刪除的權利。
您也可以建立代理程式程序來訪問高完整性物件。 有關介紹如何以高完整性級別啟動代理程式程序的資訊,請參閱 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 LowRights RunDll32Policy
下例展示了使用 rundll32.exe 預設以低完整性載入虛擬 contoso.dll 庫的設定。
HKEY_LOCAL_MACHINE SOFTWARE Microsoft Internet Explorer LowRights RunDll32Policy contoso.dll
注意 最好的方法是建立一個自定義 exe 來託管 DLL,而不使用 rundll32.exe。
允許在應用程式中進行拖放操作
預設情況下,“保護模式”在允許將 Web 內容複製到完整性更高的程序前會提示使用者。
要避免出現該提示,可以對應用程式進行註冊,然後通過建立 DragDrop 策略以拖放操作預設接受 Web 內容。 DragDrop 策略必須擁有一個與其關聯的全域性唯一識別符號 (GUID)。 使用 CreateGuid 為策略建立新的 GUID。 然後,將登錄檔項新增至以下位置。
HKEY_LOCAL_MACHINE SOFTWARE Microsoft Internet Explorer LowRights DragDrop
將新登錄檔項的名稱設定為針對策略所建立的 GUID,然後將以下設定新增到登錄檔項中。
1. |
Policy(DWORD) 應設定為 3,以通知“保護模式”允許將 Web 內容自動複製到應用程式程序。 |
||||
2. |
如果應用程式是可執行檔案,請將以下設定新增到策略中。
|
||||
3. |
如果您的擴充套件程式啟動未在 HKEY_CLASSES_ROOT 註冊的 COM 伺服器,那麼可通過 COM 動態註冊該伺服器並通過 CoCreateInstance 啟動,再新增名為 CLSID(包含 COM 伺服器的 CLSID)的 REG_SZ 值,然後將以下設定新增到您的策略中。
|
以下示例展示了將所有 Web 內容預設複製到虛擬 contoso.exe 應用程式的設定
HKEY_LOCAL_MACHINE SOFTWARE Microsoft Internet Explorer LowRights DragDrop AppName="contose.exe" AppPath="C:\%USERPROFILE%\Application Data\Contoso" Policy=(DWORD) 00000003
允許應用程式接收 Window 訊息
如上文所述,UIPI 會阻止視窗訊息從低完整性程序傳送至具有更高完整性的程序。 如果運行於“保護模式”下的擴充套件程式需要通過視窗訊息與提升的應用程式通訊,則可以從提升的應用程式呼叫ChangeWindowMessageFilter() 以傳送特定的訊息。
注意 如果要與“保護模式”通訊,最佳的做法是以低完整性執行應用程式。 否則,請只使用程序間通訊 (IPC) 的安全形式,例如遠端過程呼叫 (RPC),在“保護模式”和完整性較高的程序之間進行通訊。
啟動和導航保護模式程序
如若應用程式使用 IWebBrowser2 啟動 Internet Explorer 並以程式設計方式導航,應使 IE Frame 在導航後可見。
以下示例介紹瞭如何使用 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 引入的 Microsoft 應用程式相容性工具包。
Internet Explorer 或其擴充套件程式嘗試在“保護模式”下寫入安全物件時,應用程式相容性日誌所包含的條目可描述該操作及其結果。 以下列表介紹了日誌條目中的值。
• |
ModuleName是啟動訪問安全物件的程式的檔名。 |
||||||||
• |
VirtualizationAction指示寫操作的結果,為下列值之一。
|
||||||||
• |
ObjectType為“檔案”或“登錄檔”。 |
||||||||
• |
APIName指定嘗試進行操作的函式,例如 CreateFile 或 RegOpenKey。 |
||||||||
• |
ReqObjectPath是操作物件試圖修改的物件位置。 對於沒有路徑的物件來說,該值為空。 |
||||||||
• |
寫操作成功完成後,NewObjectPath指定已被操作修改的物件。 |
||||||||
• |
APIResult指示嘗試寫操作的 API 函式所返回的結果。 |
||||||||
• |
LastError是某個 API 函式接收到的上一個錯誤。 |
當嘗試確定操作未按預期運轉的原因時,此資訊非常有用。
返回頁首設計安全擴充套件程式
從擴充套件程式安裝軟體
在“保護模式”下執行時,ActiveX 控制元件和其他擴充套件程式無法安裝軟體。 如果您的擴充套件程式需要修改高完整性物件,例如 Program files 或 HKEY_LOCAL_MACHINE 下的登錄檔項,則應建立一個可使用管理員許可權執行的獨立安裝應用程式。
要使用管理員許可權啟動應用程式,可按 Developer Best Practices and Guidelines for Applications in a Least Privileged Environment 中提供的詳細資訊構成一個應用程式清單。 安裝後,運行於“保護模式”下的擴充套件程式能夠以中等完整性啟動應用程式,而不是以高完整性將其從安裝應用程式啟動。 這樣有助於保護使用者,因為此時應用程式以使用者許可權執行,而不是管理員許可權。
啟動低完整性程序
預設情況下,子程序會繼承父程序的完整性級別。 要從“保護模式”啟動低完整性程序,請呼叫 CreateProcessAsUser。 要從中等完整性程序啟動低完整性程序,則必須以低完整性顯式啟動新程序。 此程序包含三個步驟。
以下程式碼示例顯示了這一過程。
#include "winnt.h" BOOL b; HANDLE hToken; HANDLE hNewToken; PWSTR szProcessName = "LowClient"; // 例如 PWSTR szIntegritySid = "S-1-16-4096"; // 低完整性 SID PSID pIntegritySid = NULL; TOKEN_MANDATORY_LABEL TIL = {0}; PROCESS_INFORMATION ProcInfo = {0}; STARTUPINFO StartupInfo = {0}; ULONG ExitCode = 0; b = OpenProcessToken(GetCurrentProcess(), MAXIMUM_ALLOWED, &hToken); b = DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, SecurityImpersonation, TokenPrimary, &hNewToken); b = ConvertStringSidToSid(szIntegritySid, &pIntegritySid); TIL.Label.Attributes = SE_GROUP_INTEGRITY; TIL.Label.Sid = pIntegritySid; // 設定程序完整性級別 b = SetTokenInformation(hNewToken, TokenIntegrityLevel, &TIL, sizeof(TOKEN_MANDATORY_LABEL) + RtlLengthSid(pIntegritySid)); // 設定程序的 UI 許可權級別 b = SetTokenInformation(hNewToken, TokenIntegrityLevelDesktop, &TIL, sizeof(TOKEN_MANDATORY_LABEL) + RtlLengthSid(pIntegritySid)); // 以低完整性建立新程序 b = CreateProcessAsUser(hNewToken, NULL, szProcessName, NULL, NULL, FALSE, 0, NULL, NULL, &StartupInfo, &ProcInfo);
注意 也可通過設定登錄檔項從“保護模式”啟動低完整性程序。 有關詳細資訊,請參閱啟動程序。
降低資源完整性
通常,對於較高級別的程序而言,使用低完整性程序接受輸入或共享資源並不是一個很好的安全做法。 這存在低完整性程序可能嘗試惡意操作的風險。 不過,有時需要這樣設計。
注意 從完整性較低的程序接受輸入或共享資源的應用程式應假定完整性較低的程序所提供的資料不能信任,然後再執行適當的驗證。 例如,“保護模式”從 Internet Explorer 使用者代理程式程序顯示“另存為”對話方塊;這樣使用者可以確認他們是否想要使用以高於“保護模式”的許可權執行的程序來儲存檔案。
因為低完整性應用程式只能寫入低完整性資源,所以需要降低共享資源的完整性級別。
1. |
建立用於定義低強制標籤的 SDDL 安全描述符。 |
2. |
將 SDDL 字串轉換為安全描述符。 |
3. |
將低完整性屬性分配給安全描述符。 |
4. |
將安全描述符分配給共享資源。 |
以下程式碼示例顯示了這一過程。
#include <sddl.h> // 要對低完整性設定的 LABEL_SECURITY_INFORMATION SDDL SACL #define LOW_INTEGRITY_SDDL_SACL_W L"S:(ML;;NW;;;LW)" BOOL b = TRUE; DWORD dwErr = ERROR_SUCCESS; PSECURITY_DESCRIPTOR pSD = NULL; PACL pSacl = NULL; // 未分配 BOOL fSaclPresent = FALSE; BOOL fSaclDefaulted = FALSE; LPCWSTR pwszFileName = "Sample.txt"; b = ConvertStringSecurityDescriptorToSecurityDescriptorW( LOW_INTEGRITY_SDDL_SACL_W, SDDL_REVISION_1, &pSD, NULL); b = GetSecurityDescriptorSacl(pSD, &fSaclPresent, &pSacl, &fSaclDefaulted); // 請注意,psidOwner、psidGroup 和 pDacl 均為 NULL // 並設定新的 LABEL_SECURITY_INFORMATION dwErr = SetNamedSecurityInfoW((LPWSTR) pwszFileName, SE_FILE_OBJECT, LABEL_SECURITY_INFORMATION, NULL, NULL, NULL, pSacl);
應用程式程序只能將安全物件的完整性級別設定為此應用程式程序的完整性級別或低於此級別。
Windows Vista 允許物件所有者更改安全物件的完整性訪問級別。 此類更改不會更新稽核日誌。
安全物件中擁有 READ_CONTROL 許可權的程序可以使用 GetNamedSecurityInfo 來確定物件的完整性級別。
注意 甚至低完整性檔案也將被保護模式的相容性修補程式重新定向到常見問題中所提及的已知位置之外。
確定程序完整性級別
能夠在不同程序中執行的擴充套件程式,可能希望檢查程式碼是否運行於低完整性或中等完整性級別的程序中,並對行為進行相應的修改。 下列步驟展示瞭如何確定程序的完整性級別。