了解并运行 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 兼容性修补程序将这些操作自动重新定向到下列低完整性位置。

Documents and Settings\%userprofile%\LocalSettings\TemporaryInternet Files\Virtualized

HKEY_CURRENT_USER\Software\Microsoft\InternetExplorer\InternetRegistry

两个具有更高权限的代理程序进程允许 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) 指示“保护模式”应如何启动代理程序。 下表说明了所支持的值。

结果

3

“保护模式”自动将代理程序作为中等完整性进程启动。

2

“保护模式”提示用户输入启动进程的权限。 如果已授予权限,进程将作为中等完整性进程启动。

1

“保护模式”自动将代理程序作为低完整性进程启动。

0

保护模式将阻止进程启动。

2.

如果代理程序是可执行文件,请将以下设置添加到策略中。

AppName(REG_SZ) 是代理程序可执行文件的文件名。

AppPath(REG_SZ) 是代理程序可执行文件的用户指定安装位置。

3.

如果您的扩展程序启动未在 HKEY_CLASSES_ROOT 注册的 COM 服务器,那么可通过 COM 动态注册该服务器并通过 CoCreateInstance 启动,再添加名为 CLSID(包含 COM 服务器的 CLSID)的 REG_SZ 值,然后将以下设置添加到您的策略中。

CLSID(REG_SZ) 包含扩展程序的 CLSID。

为便于说明,以下策略会将名为 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.

如果应用程序是可执行文件,请将以下设置添加到策略中。

AppName(REG_SZ) 是应用程序可执行文件的文件名。

AppPath(REG_SZ) 是应用程序可执行文件的用户指定安装位置。

3.

如果您的扩展程序启动未在 HKEY_CLASSES_ROOT 注册的 COM 服务器,那么可通过 COM 动态注册该服务器并通过 CoCreateInstance 启动,再添加名为 CLSID(包含 COM 服务器的 CLSID)的 REG_SZ 值,然后将以下设置添加到您的策略中。

CLSID(REG_SZ) 包含扩展程序的 CLSID。

以下示例展示了将所有 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指示写操作的结果,为下列值之一。

InterceptedWrite指示操作被“兼容层”截取。

WriteIgnored指示操作因尝试进程为提升代理程序而被“保护模式”忽略。

CreateVirtualCopy指示“兼容层”在虚拟位置生成对象的副本。

CreateNew指示“兼容层”在虚拟位置创建了新对象。

ObjectType为“文件”或“注册表”。

APIName指定尝试进行操作的函数,例如 CreateFile 或 RegOpenKey。

ReqObjectPath是操作对象试图修改的对象位置。 对于没有路径的对象来说,该值为空。

写操作成功完成后,NewObjectPath指定已被操作修改的对象。

APIResult指示尝试写操作的 API 函数所返回的结果。

LastError是某个 API 函数接收到的上一个错误。

当尝试确定操作未按预期运转的原因时,此信息非常有用。

设计安全扩展程序

为“保护模式”开发安全的 Internet Explorer 扩展程序与为 Windows Vista 开发安全的应用程序没有什么不同。 除 Developer Best Practices and Guidelines for Applications in a Least Privileged Environment 和ActiveX Security: Improvements and Best Practices 中提供的指南之外,扩展程序的开发人员应了解如何从扩展程序安装软件、启动低完整性进程、降低资源完整性级别以及确定进程完整性级别。 本节将介绍如何执行这些任务。

从扩展程序安装软件

在“保护模式”下运行时,ActiveX 控件和其他扩展程序无法安装软件。 如果您的扩展程序需要修改高完整性对象,例如 Program files 或 HKEY_LOCAL_MACHINE 下的注册表项,则应创建一个可使用管理员权限运行的独立安装应用程序。

要使用管理员权限启动应用程序,可按 Developer Best Practices and Guidelines for Applications in a Least Privileged Environment 中提供的详细信息构成一个应用程序清单。 安装后,运行于“保护模式”下的扩展程序能够以中等完整性启动应用程序,而不是以高完整性将其从安装应用程序启动。 这样有助于保护用户,因为此时应用程序以用户权限运行,而不是管理员权限。

启动低完整性进程

默认情况下,子进程会继承父进程的完整性级别。 要从“保护模式”启动低完整性进程,请调用 CreateProcessAsUser。 要从中等完整性进程启动低完整性进程,则必须以低完整性显式启动新进程。 此进程包含三个步骤。

1.

重复中等完整性进程的处理。

2.

使用 SetTokenInformation 将进程处理降低为低完整性。

3.

使用 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 来确定对象的完整性级别。

注意 甚至低完整性文件也将被保护模式的兼容性修补程序重新定向到常见问题中所提及的已知位置之外。

确定进程完整性级别

能够在不同进程中运行的扩展程序,可能希望检查代码是否运行于低完整性或中等完整性级别的进程中,并对行为进行相应的修改。 下列步骤展示了如何确定进程的完整性级别。

1.

打开当前进程令牌的句柄。

2.

获取令牌的完整性级别。

3.

将完整性级别 SID 与系统定义的完整性级别 RID 进行比较。

以下代码示例显示了如何执行此操作。

BOOL b = TRUE;  
HANDLE hToken;  
HANDLE hProcess;  
DWORD dwLengthNeeded;  
DWORD dwError = ERROR_SUCCESS;  
PTOKEN_MANDATORY_LABEL pTIL = NULL;  
LPWSTR pStringSid;  
  
hProcess= GetCurrentProcess();  
b = OpenProcessToken(hProcess,   
  TOKEN_QUERY | TOKEN_QUERY_SOURCE, &hToken);  
  
// 获取完整性级别。  
b = GetTokenInformation(hToken,   
  TokenIntegrityLevel, NULL, 0, &dwLengthNeeded);  
  
if (!b)  
{  
  dwError = GetLastError();  
  if (dwError == ERROR_INSUFFICIENT_BUFFER)  
  {  
    pTIL = LocalAlloc(0, dwLengthNeeded);  
    if (pTIL == NULL)  
    {  
      b = FALSE;  
      dwError = ERROR_NOT_ENOUGH_MEMORY;  
      goto Cleanup;  
    }  
  
    b = GetTokenInformation(hToken, TokenIntegrityLevel,   
      pTIL, dwLengthNeeded, &dwLengthNeeded);  
    if (!b)  
    {  
      dwError = GetLastError();  
      goto Cleanup;  
    }  
  }  
  
  if (pTIL)   
  {  
    wprintf(L"完整性级别:\n");  
    b = ConvertSidToStringSid(pTIL-&>Label.Sid, &pStringSid);   
}

常见问题

问: UAC 文件和注册表虚拟化是否适用于“保护模式”?

答: 不,UAC 虚拟化不适用于“保护模式”,因此写入到敏感区域的“保护模式”扩展程序的写入权限不会重新定向。

“保护模式”也不具有对系统区域中重定向或虚拟存储的写入权限。 运行于“保护模式”下的扩展程序在其试图写入敏感系统区域时,会返回“拒绝访问”错误。

问: USER PROFILE 或 HKEY_CURRENT_USER 注册表位置中,是否存在 Internet Explorer 保护模式扩展程序无法写入的特定位置?

答: 有,在下列 USER PROFILE 文件夹中特定于 Internet Explorer 的位置。

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 函数获得对安全对象的写入权限,将会收到“拒绝访问”错误。

Internet Explorer 二进制

BrowseUI.dll

IEFrame.dll

MsHtmlEd.dll

ShDocVw.dll

DxtMsft.dll

InetCpl.dll

MsTime.dll

UrlMon.dll

DxTrans.dll

MsHtml.dll

Peers.dll

WinInet.dll

其他二进制

AdvApi.dll

CorPol.dll

NtDll.dll

WinTrust.dll

ComCtl32.dll

Crypt32.dll

SChannel.dll

ComDlg32.dll

Kernel32.dll

Secure32.dll

问: 如何防止工具栏启动提升的 Internet Explorer 进程?

答: 许多工具栏的安装都将关闭所有正在运行的 Internet Explorer 实例,并在安装完成后启动新的实例,因此可以看见新的工具栏。 问题在于新的 Internet Explorer 是从提升的进程启动,因此它也进行了提升。 通过关闭 Internet Explorer 并以较低的完整性级别重新启动工具栏,可以避免这一问题。 有关详细信息,请参阅启动低完整性进程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值