如何在 Windows Vista 中实现完整性机制

Windows Vista 中以多种方式使用 Windows 完整性机制。 其main目的是限制在不太可信的同一用户帐户下运行的应用程序的访问权限。 该机制可防止不太可信的代码在更高级别上修改对象。 大多数受管理员组或系统控制的对象都有一个可自由支配的访问控制列表 (DACL) ,该列表通常向管理员和系统授予完全控制权限,以及向经过身份验证的用户授予读取和执行权限。 管理员组和系统控制的资源示例包括应用程序的 Program Files 目录或注册表的HKEY_LOCAL_MACHINE配置单元。 完整性机制无法增强已正确配置以限制不同用户帐户或组访问它们的对象的安全性。 完整性机制的主要用途是解决程序在同一用户安全主体的完全控制下访问资源的不同权限。

需要额外保护的同一用户安全主体控制的资源主要位于用户的配置文件 (C:\Users\<username> 目录下,注册表) 以及当前代表该用户运行的应用程序HKEY_CURRENT_USER配置单元。 Windows Vista 通过以下方式使用完整性机制。

  • 在 UAC 中,它限制使用标准用户特权运行的进程与在管理员审批模式下以完全管理权限运行的提升进程之间的访问。
  • COM 安全性知道完整性级别,不允许完整性较低的客户端绑定到在较高完整性级别运行的类实例。
  • 在默认安全设置中,它会限制对系统卷根文件夹的访问。
  • 在保护模式 Internet Explorer 中,它限制了在 Internet 浏览器中运行的代码修改用户数据或用户配置文件设置的能力。
  • 为了使以低完整性运行的应用程序具有可写文件位置,它会为用户配置文件中的特定文件夹分配低完整性级别。

完整性机制是 Windows Vista 安全体系结构的一部分。 随着时间的推移,处理不可信输入 (主要面向 Internet 的) 的特定应用程序会更新,以利用在低完整性级别运行的能力。 只要用户知道输入数据源,个人生产力应用程序即可在中等完整性级别运行。 对于大多数应用程序,完整性机制是完全透明的,不会干扰应用程序功能。 可以更新应用程序服务,以便为不同完整性级别的客户端进程更好地隔离服务器资源。

完整性级别和 UAC

使用管理员审批模式时,Windows Vista 中的 UAC 在同一桌面上以不同访问级别运行多个程序。 基于创建进程时分配给进程的安全访问令牌,程序具有不同的权限。 帐户为标准用户的用户在登录期间仅创建一个安全访问令牌。 为标准用户访问令牌分配中等完整性级别。 中等完整性标准用户访问令牌分配给用户运行的几乎所有应用程序进程。 特定应用程序(如保护模式 Internet Explorer)是一个例外,下文将进一步介绍。

具有管理员组成员帐户的用户在登录时创建两个安全访问令牌,这些令牌链接在一起。 一个访问令牌是分配有中等完整性级别的标准用户访问令牌,该令牌仅将管理员组用于拒绝访问检查,并删除某些管理权限。 第二个访问令牌是一个完全特权的提升访问令牌,该令牌分配了较高的完整性级别,因为访问令牌中存在管理员组和管理特权。 访问令牌是链接的,因为它们与该用户帐户的相同交互式登录相关。 这两个访问令牌具有相同的用户 SID 和 Active Directory (的全局组,但域和企业管理员) 的筛选组除外。

Windows 资源管理器 (也称为 shell) ,所有非管理员任务都分配有标准用户中等完整性访问令牌。 对于作为管理员组成员的用户帐户,几乎所有应用程序都使用中等完整性访问令牌运行。 NO_WRITE_UP完整性策略不限制中级进程的访问权限,以访问具有隐式媒体对象强制标签的对象。 完整性机制对于中等完整性级别的应用程序是透明的,除非它们旨在控制可能在更高特权级别运行的其他进程。 Windows UI 自动化是设计用于控制其他进程的应用程序的一个示例。

UAC 管理员 审批模式允许用户在提供完全特权提升访问令牌的同意后启动管理任务和应用程序。 操作系统必须限制低特权 (标准用户) 进程直接篡改在同一用户 SID 下运行的更高特权 (管理员) 进程的能力。 Windows 完整性机制限制中等完整性进程对高完整性进程可以拥有的访问权限。 进程管理器 (Windows 内核的一部分) 分配强制策略选项NO_READ_UP和NO_WRITE_UP,以限制低完整性进程打开高完整性进程进行读取或写入访问。

完整性较低的进程只有泛型执行访问权限。 泛型执行访问包括以下内容:

  • 同步,PROCESS_QUERY_LIMITED_INFORMATION
  • PROCESS_TERMINATE

对更高完整性进程的一般读取访问权限 (PROCESS_VM_READ访问进程的虚拟内存,并且限制PROCESS_QUERY_INFORMATION) 阻止低特权进程获取对可能包含密码数据或其他用于身份验证的密钥材料的内存的读取访问权限。 NO_WRITE_UP策略会阻止对更高完整性进程的常规写入访问。 通用写入进程访问权限包括:

  • PROCESS_CREATE_THREAD
  • PROCESS_VM_OPERATION
  • PROCESS_VM_WRITE
  • PROCESS_DUP_HANDLE
  • PROCESS_SET_QUOTA
  • PROCESS_SET_INFORMATION
  • PROCESS_SET_PORT

当前用户注册表配置单元

用户配置文件中的大多数对象未分配显式强制标签,因此具有媒体的隐式默认完整性级别。 这适用于注册表HKEY_CURRENT_USER (HKCU) 配置单元。 在 HKCU 下创建的密钥具有隐式中等完整性级别。 这意味着,对于属于管理员组成员的用户,HKCU 配置单元可由使用中等完整性标准用户访问令牌或高完整性完全管理员访问令牌运行的应用程序编写。 出于应用程序兼容性原因,必须如此。 回想一下,HKEY_LOCAL_MACHINE (HKLM) 配置单元具有默认的安全策略,可授予管理员和系统完全控制权,以及用户读取和执行访问权限。 只有分配有完全管理员访问令牌的提升进程才能修改 HKLM 配置单元。 HKLM 配置单元不受高强制标签的保护。

由于没有显式强制标签的对象的默认完整性级别为中等,因此,作为管理员组成员的用户显然可以在共享 HKCU 和用户配置文件数据的中高) (不同特权级别运行程序。 Windows Vista 不会在中等完整性与高完整性进程之间强制实施严格的边界。 允许“读取”高完整性进程。 对于使用完全特权、高完整性访问令牌运行的应用程序,从 HKCU 读取配置信息或接受影响高完整性进程行为的输入文件很常见。 以完全特权运行的应用程序应使用 HKLM 来存储仅可由管理员修改的配置信息。 在处理用户可修改文件之前,完全特权应用程序还需要验证用户输入数据的格式是否良好。

COM 可感知完整性

COM 是用于生成应用程序组件和对象服务的框架。 COM 基础结构知道调用 CoCreateInstance 的客户端和运行类实例的服务器进程的完整性级别。 完整性级别影响行为的 COM 功能领域包括:

  • COM 提升名字对象允许客户端在管理员同意或标准用户提供显式管理员凭据后,以高完整性级别启动提升的服务。
  • 在中等完整性级别之上运行的服务器类必须在 HKLM 注册表配置单元中定义 CLSID。
  • 除非服务器以编程方式允许从较低客户端访问较低完整性级别的服务器实例,否则 COM 会阻止较低完整性级别的客户端绑定到正在运行的服务器实例。

COM 提升名字对象允许处于低完整性或中等完整性级别的应用程序在运行具有提升权限的进程中启动 COM 服务。 提升名字对象允许特定任务,这些任务旨在运行提升的,而不是用于完全应用程序兼容性。 COM 提升与 UAC 提升集成。 为提升的 COM 服务器进程分配一个完全特权、具有高完整性的提升访问令牌。 COM 不允许较低级别的客户端绑定到更高完整性级别的服务器正在运行的实例。

如果 COM 服务器设计为支持来自较低完整性客户端的连接,则服务器可以编程方式修改 CLSID 注册表中的启动/激活权限,以允许从完整性较低的客户端进行绑定。 COM 使用强制标签 ACE 中的NO_EXECUTE_UP强制策略来控制是否允许客户端绑定到更高完整性级别的服务器实例。 COM 启动/激活访问权限映射到 COM 用于检查激活的GENERIC_MAPPING中的一般执行访问权限。 与 对象关联的必需标签中的完整性级别标识允许绑定到服务器的客户端的最低完整性级别。 与文件系统访问类似,默认隐式强制策略允许中等完整性客户端绑定到服务器。

对于旨在允许低完整性客户端绑定到服务器的实例的 COM 服务器,COM 激活权限由服务器代码设置。

允许低完整性客户端绑定到服务器

  1. 使用NO_EXECUTE_UP (NX) 策略定义强制标签,以降低完整性级别。 具有低完整性的强制标签策略的对象安全描述符的 SDDL 如下所示:

    O:BAG:BAD:(A;;0xb;;;WD)S:(ML;;NX;;;LW)

  2. 将字符串安全描述符转换为二进制安全描述符。

  3. 使用二进制安全描述符为服务器 CLSID 设置 CLSID 的启动权限。

COM 安全 UI(dcomcfg.exe)不支持完整性级别。

有关如何设置 COM 启动权限强制策略的代码示例,请参阅 Windows 完整性机制资源 ,详细了解 COM 和完整性级别支持。

为服务分配系统完整性级别

服务控制管理器 (SCM) 使用特殊服务帐户或用户名和密码启动服务进程。 特殊服务帐户为 LocalSystem、LocalService 和 NetworkService。 在这些服务帐户之一下运行的服务具有特殊权限,例如允许服务在模拟其他用户时执行操作的SE_IMPERSONATE_NAME特权。 Windows Vista 将系统完整性级别分配给在某个特殊服务帐户下运行的服务的进程对象。 下图显示了分配给特殊服务帐户的访问令牌的系统完整性级别。

图 6 服务的系统完整性级别

尽管服务进程具有系统完整性级别,但不会为这些主体创建的安全对象分配系统强制标签。 服务创建的对象 (子进程、线程、访问令牌和作业除外,) 具有隐式中等完整性级别。

Windows Vista 的服务更改描述了为提高安全性、可靠性和可管理性而对服务的更改。 服务的更改通过隔离会话 0 中的服务以及隔离服务可以使用服务 SID 访问的资源来提高系统安全性。 特殊服务帐户的系统完整性级别与服务隔离目标一致。 在系统完整性级别运行的服务进程受到较低完整性进程的保护,防止访问 。 低完整性进程可用于打开服务进程的进程访问权限仅限于以下各项:

  • SYNCHRONIZE
  • PROCESS_QUERY_LIMITED_INFORMATION
  • PROCESS_TERMINATE

某些应用程序使用多个协作进程进行设计,这些进程可能在一个或多个服务帐户中运行。 进程和服务之间的大多数进程间通信 (IPC) 机制(如 RPC)不受完整性级别限制。 服务需要特别小心来验证来自低完整性客户端的输入。

服务之间的重复句柄

使用多个进程的服务应用程序有时设计为在服务器进程之间复制对象(如文件)的句柄。 如果所有进程都在同一特殊服务帐户下运行,则服务进程的默认安全性不会引入限制。 在特殊服务帐户下运行的服务进程上的默认 DACL 不授予PROCESS_DUP_HANDLE访问权限,这是 DuplicateHandle 调用所必需的。 应用程序服务设计人员必须实现功能,以向共同进程使用的另一个用户帐户授予PROCESS_DUP_HANDLE对服务进程对象的访问权限,以便在不同用户帐户下运行的应用程序进程之间共享句柄。 但是,如果要将句柄复制到其中的服务是在系统完整性级别运行的特殊服务帐户,则由于强制标签策略,在高完整性级别或中等完整性级别运行的协同进程将无法获取PROCESS_DUP_HANDLE。 即使 DACL 授予PROCESS_DUP_HANDLE访问权限,强制标签策略也不允许低完整性调用方进行该访问。 如果这种情况影响服务应用程序设计,则需要更改应用程序服务代码,以便启动 DuplicateHandle 的进程的完整性级别高于作为句柄源的进程的完整性级别。 也就是说,完整性较高的服务可以将句柄复制到其自己的进程中,并将其作为目标从低完整性进程作为句柄源。

模拟策略

SE_IMPERSONATE_NAME特权允许服务器进程模拟客户端进程的安全上下文。 模拟特权是一种强大的特权。 完整性机制将模拟特权与具有较高或系统完整性级别的访问令牌相关联。 完整性机制强制实施策略,即仅当使用者具有“模拟”特权时,使用者才能在更高的完整性级别模拟客户端。

应用此策略限制的情况是,低完整性进程欺骗 UI 以说服管理员用户输入管理员凭据。 恶意代码使用凭据调用 LsaLogonUser 和 ImpersonateLoggedOnUser,以尝试以更高的特权级别启动进程。 模拟访问令牌的完整性机制策略是,LsaLogonUser 返回的访问令牌的完整性级别必须不高于调用进程的完整性级别。

高完整性级别的根文件夹

系统分区的根文件夹(通常 为 C:\ )在历史上一直用作存储程序或临时文件的方便位置,但不建议这样做。 需要管理员权限的安装程序通常会在启动之前复制到根文件夹。 根文件夹的默认安全策略旨在允许经过身份验证的用户在根文件夹下创建子文件夹,但仅允许管理员在根文件夹中创建文件。 此外,理想情况下,策略不允许非管理用户修改管理员创建的文件夹中的文件。 很难仅使用根文件夹的 ACL 来定义此策略。

通过设置适用于子对象(但不适用于子容器)的高完整性级别的强制标签,根文件夹的默认安全性符合此策略。 以中等完整性级别运行程序的标准用户不能修改管理员在根文件夹中创建的文件,即使 ACL 授予用户修改访问权限也是如此。 根文件夹具有高度完整性的可继承强制标签,该标签是对象继承的,并且不会传播到子文件夹。

下图显示了 C:\ 上的默认安全设置根文件夹(包括 对象)继承高度完整性的必需标签。 表 9 显示了图像中缩写的定义。

表 9 图像缩写

缩写 定义

(OI)

对象继承

(NP)

无传播

(IO)

仅继承

(NW)

无写

图 7 根文件夹上的必需标签

处于低完整性的受保护模式 Internet Explorer

Internet Explorer 是一个应用程序示例,旨在接受来自 Internet 的任意数据和可扩展代码。 由于 Internet 内容源很少 (签名) 进行身份验证,因此我们必须假设来自 Internet 的所有输入都不可信。 针对 Internet Explorer 或任何其他 Internet 浏览器的攻击表明,可从 Internet 获取的动态内容和数据具有不可信的性质。 从安全角度来看,我们假设 Internet Explorer 进程本身遭到入侵且不受信任,并且我们寻找能够限制对浏览器的攻击造成潜在损害的解决方案。 针对基于浏览器的攻击的一些建议解决方案尝试将 Web 浏览器与其他应用程序和数据完全隔离。 遗憾的是,浏览器的完全隔离会对用户的浏览体验产生重大影响,例如能够自动启动程序来读取各种文件类型,例如.pdf文件。 如果浏览器对用户数据文件没有读取访问权限,则完全隔离会妨碍常见的用户体验,例如将图片上传到网站。

保护模式 Internet Explorer 的目标是减少进程可用的访问权限,以限制在浏览器中运行的漏洞攻击创建不需要的启动文件、修改用户数据文件、对浏览器配置设置进行令人讨厌的更改或驱动桌面上运行的其他程序的行为的能力。 在低完整性进程中在受保护模式 Internet Explorer 中运行的所有代码都被视为不可信。 对象的默认中等完整性级别阻止浏览器打开任何目录、文件或注册表项进行写入访问,但那些以低完整性显式标记的目录、文件或注册表项除外。 UIPI 可防止低完整性浏览器代码将任何可能损坏的窗口消息发送到桌面上运行的其他应用程序。

以低完整性运行的浏览器对用户数据文件具有读取访问权限。 由于 Windows 完整性机制不强制实施机密性,因此不会限制信息流。 此过程还可以使用默认凭据来启动网络连接,例如,当需要身份验证才能连接到 Internet) 或网络打印机设备以打印网页时, (网络代理服务器。 低完整性进程还可以启动与其他网络服务的经过身份验证的连接,从而以当前用户的身份向这些服务器进行身份验证。

Internet Explorer 的应用程序设计需要进行一些重组才能在保护模式下以低完整性级别运行。 主要更改是,某些程序操作已移出到一个单独的进程(称为中转站进程)中,在中等完整性级别运行。 当用户单击 Internet Explorer 图标或 URL 链接时,代理进程在中等完整性级别启动。 中转站检查 URL 和区域策略,并在低完整性级别启动iexplore.exe子进程,以建立 Internet 连接并呈现网页。 进程资源管理器中的下图显示了ieuser.exe、中等完整性级别的代理进程和低完整性级别的iexplore.exe进程。

图 8 保护模式 Internet Explorer 进程

用户在 Internet Explorer Web 浏览器中体验的所有内容都是在低完整性进程中完成的。 一些特定操作(例如更改 Internet 选项设置或 另存为文件 对话框)由代理进程处理。 如果 URL 是受信任的站点,则根据默认区域策略设置,代理进程会在中等完整性进程中启动iexplore.exe的不同实例。 所有浏览器扩展和 ActiveX 控件都在低完整性进程中运行。 这样做的优点是,浏览器扩展的任何潜在攻击也以低完整性运行。

Internet Explorer 比其他应用程序复杂一些,因为它托管不是由 Microsoft 开发的浏览器扩展和 ActiveX 控件,它基于不同文件扩展名的 mime 类型启动其他应用程序,并且它将客户端窗口从单个父窗口框架中的不同应用程序集成。 用户还通过浏览器从 Internet 下载软件,并立即启动应用程序包或应用程序安装程序。 其中许多操作需要中转站进程的帮助,以在更高的完整性级别通过用户进行调解以确认操作。 否则,浏览器中运行的代码可能会在系统上安装恶意软件,并尝试修改或删除用户的数据。 ActiveX 控件的安装使用 UAC 启动的提升任务来执行,该任务需要管理员权限。

由于 Internet Explorer 支持浏览器和其他本地应用程序之间的各种用户交互, (复制和粘贴是) 的一个明显示例,因此限制对对象的写入访问权限的完整性机制并不是一种完整的隔离机制。 保护模式 Internet Explorer 的设计研究了许多不同的交互,并特别定制了代理的行为和低权限iexplore.exe流程,以保持最低特权功能,同时提供丰富、高度协作的用户体验。

有关保护模式 Internet Explorer 的详细信息,请参阅了解和在保护模式下工作 Internet Explorer (https://go.microsoft.com/fwlink/?LinkId=90931) 。