在家庭和公司环境中,使用标准用户帐户可以提高安全性并降低总体拥有成本。当用户使用标准用户权限(而不是管理权限)运行时,系统的安全配置(包括防病毒和防火墙配置)将得到保护。这样,用户将能拥有一个安全的区域,可以保护他们的帐户及系统的其余部分。对于企业部署,桌面 IT 经理设置的策略将无法被覆盖,而在共享家庭计算机上,不同的用户帐户将受到保护,避免其他帐户对其进行更改。但是,很久以来,Windows 的用户一直都在使用管理权限运行。因此,软件通常都开发为使用管理帐户运行,并且(通常无意间)依赖于管理权限。为了让更多软件能够使用标准用户权限运行,并且帮助开发人员编写能够使用标准用户权限正常运行的应用程序,Windows Vista 引入了用户帐户控制 (UAC)。UAC 集成了一系列技术,其中包括文件系统和注册表虚拟化、受保护的系统管理员 (PA) 帐户、UAC 提升权限提示,以及支持这些目标的 Windows 完整性级别。我在我的[url=http://www.microsoft.com/emea/spotlight/sessionh.aspx?videoid=360&UID=00067FFE86205DB5]会议演示文稿[/url]和 TechNet 杂志UAC 内部信息一文中详细讨论了这些内容。Windows 7 沿用了 UAC 的目标,基础技术相对未做改变。但是,它引入了 UAC 的 PA 帐户可以运行的两种新模式,以及某些内置 Windows 组件的自动提升机制。在此文章中,我将论述推动 UAC 技术发展的因素、重新探讨 UAC 和安全性之间的关系、描述这两种新模式,并介绍自动提升的具体工作方式。请注意,此文章中的信息反映了 Windows 7 预发布版本的行为,该行为在许多方面与 beta 版有所不同。
UAC 技术UAC 技术的最基本元素和直接效益在于它能使标准用户更方便地使用 Windows。演示示例展示了 Windows XP 和 Windows Vista 上有关设置时区的权限要求的不同之处。在 Windows XP 上,更改时区需要管理权限,实际上,即使是使用时间/日期控制面板小程序查看时区也需要管理权限。这是因为 Windows XP 未将更改时间(安全敏感的系统操作)与更改时区(只是影响时间的显示方式)区分开来。在 Windows Vista(和 Windows 7)中,更改时区不是一项管理操作,并且时间/日期控制面板小程序也将管理操作与标准用户操作进行了分隔。仅仅这一项更改就让许多企业能够为出差的用户配置标准用户帐户,因为用户将能够调整时区来反映他们的当前位置。Windows 7 进一步做出了改进,比如刷新系统的 IP 地址、使用 Windows Update 来安装可选的更新和驱动程序、更改显示 DPI,以及查看标准用户可访问的当前防火墙设置。文件系统和注册表虚拟化在后台工作,可以帮助许多无意间使用管理权限的应用程序在没有管理权限的情况下也能正常运行。对于不必要地使用管理权限而言,最常见的情况是将应用程序设置或用户数据存储在注册表或文件系统中系统所使用的区域内。举例来说,某些旧版应用程序将其设置存储在注册表的系统范围部分 (HKEY_LOCAL_MACHINE\Software),而不是每用户部分 (HKEY_CURRENT_USER\Software),而注册表虚拟化会将尝试写入系统位置的操作转到 HKEY_CURRENT_USER (HKCU) 中的位置,同时保持应用程序兼容性。设计 PA 帐户的目的是为了鼓励开发人员将应用程序编写为只需要标准用户权限,同时使尽可能多的在管理组件和标准用户组件之间共享状态的应用程序能够继续工作。默认情况下,Windows Vista 或 Windows 7 系统上的第一个帐户(在 Windows 的早期版本上为完全权限管理员帐户)是 PA 帐户。PA 用户执行的任何程序都使用标准用户权限运行,除非用户明确提升了应用程序,即授予应用程序管理权限。诸如安装应用程序和更改系统设置等用户活动会触发提升权限提示。这些提升权限提示是最显著的 UAC 技术,表现形式为切换到一个包含允许/取消对话框的屏幕,背景为灰色的桌面快照。在安装之后创建的帐户是标准用户帐户,默认情况下,这些帐户通过一个“即时权限提升”提示提供提升功能,该提示要求提供将用于授予管理权限的管理帐户的凭据。利用这一便捷功能,只要共享家庭计算机的家庭成员或更注重安全的使用标准用户帐户的用户知道管理帐户的密码,他们就能够用管理权限来运行应用程序,而不必手动切换到其他用户登录会话。此类应用程序的常见示例包括安装程序以及家长控制配置。在启用了 UAC 后,所有用户帐户(包括管理帐户)都将使用标准用户权限运行。这意味着,应用程序开发人员必须考虑他们的软件默认情况下将没有管理权限这一事实。这应会提醒他们将其应用程序设计为使用标准用户权限工作。如果应用程序或其功能的某些部分需要管理权限,它可以利用提升机制来允许用户解锁该功能。通常,应用程序开发人员只需进行少许更改就可让其应用程序使用标准用户权限正常工作。如有关 UAC 的 E7 博客文章所述,UAC 成功地改变了开发人员编写软件的方式。提升权限提示的另一个优点是:它们能够在软件想要对系统进行更改时“通知”用户,并使用户有机会来阻止这种情况。例如,如果用户不信任或不想允许修改系统的软件包要求管理权限,则它们可以拒绝提示。
提升和恶意软件安全性UAC 的主要目标是让更多用户能够使用标准用户权限运行。但是,其中一项 UAC 技术看起来像是安全功能:许可提示。许多人认为,因为软件必须要求用户授予其管理权限,因此他们能够防止恶意软件获得管理权限。提示是一种视觉暗示,它仅为其所述操作获取管理权限,除此之外,用户还可以切换到不同桌面来显示提升对话框,以及使用 Windows 完整性机制,包括用户界面特权隔离 (UIPI),这些都使人们更加坚信这一理念。正如在 Windows Vista 推出之前我们所谈到的,提升的主要目的不是安全性,而是其方便性:如果用户必须通过登录到管理帐户或通过“快速用户切换”切换到管理帐户,从而切换帐户以执行管理操作,则大多数用户都只会切换一次,而不会切换回来。更改应用程序开发人员进行设计所针对的环境将不会有进展。那么,安全桌面和 Windows 完整性机制的目的是什么?为提示切换到不同桌面的主要原因是:标准用户软件无法“欺骗”提升权限提示,例如,它们无法通过在对话框上的发布者名称上绘图来欺骗用户,让用户认为是 Microsoft 或另一个软件供应商(而不是这些软件)生成了提示,从而欺骗提升权限提示。这种替代桌面称为“安全桌面”,因为它是系统(而不是用户)所拥有的,就像系统显示 Windows 登录对话框的桌面一样。使用其他桌面还有一个重要目的,就是为了实现应用程序兼容性:在正在运行其他用户拥有的应用程序的桌面上,如果内置辅助功能软件(比如屏幕键盘)能够正常工作,那么此时就有一个第三方软件不能正常工作。当本地系统帐户拥有的提升对话框显示在用户拥有的桌面上时,该软件将无法正常工作。Windows 完整性机制和 UIPI 的设计目的是在提升的应用程序周围建立一道保护性屏障。它最初的目标其中之一是防止软件开发人员投机取巧,利用已经提升的应用程序来完成管理任务。使用标准用户权限运行的应用程序无法将合成鼠标或键盘输入发送到提升的应用程序中,以使应用程序执行其指令,也无法将代码注入提升的应用程序以执行管理操作。Windows 完整性机制和 UIPI 在 Windows Vista 中用于保护模式 Internet Explorer,使得感染 IE 的运行实例的恶意软件更难于修改用户帐户设置,例如,将本身配置为在每次用户登录时启动。尽管 Windows Vista 的一个早期设计目标是使用带有安全桌面的提升、Windows 完整性机制和 UIPI,在使用标准用户权限和管理权限运行的软件之间建立一个坚不可摧的屏障(称为安全边界),但由于以下两个原因,而导致该目标未能实现,并随之被放弃:可用性和应用程序兼容性。
图 3 可在新的 UAC 配置对话框中选择的两种新 UAC 操作模式。图 3 中显示的默认设置就是其中一个新级别。与位于滑块顶部并相当于 Windows Vista 中的默认模式的“始终通知”不同,只有当非 Windows 可执行文件请求提升时,Windows 7 才会默认提示用户;针对非 Windows 提升的行为与 Windows Vista 相同。下面接下来的滑块位置是第二个新设置,它的标签相同,只是后面附加了“(不降低桌面亮度)”。该模式和默认模式的唯一不同之处在于:提示将出现在用户的桌面(而不是安全桌面)上。这样的好处是:用户可以在提示处于活动状态的同时与桌面交互,但正如我之前提到的,将会出现第三方辅助功能软件可能无法在该提示对话框上正常工作的风险。最后,如果选择最底部的滑块位置,将会完全禁用 UAC 技术,这样,所有采用 PA 帐户运行的软件都将使用完全管理权限运行、文件系统和注册表虚拟化将被禁用,并且保护模式 IE 将被禁用。尽管采用此设置时将没有提示,但保护模式 IE 的损失是此模式的一个很大的弊端。
自动提升在采用中间两种设置时,之所以(大多数)Windows 可执行文件的提升不会产生提示,其原因在于系统“自动提升”了 Windows 可执行文件。首先,在此上下文中,Windows 对 Windows 可执行文件的定义是什么?答案取决于若干因素,但有两个条件必须得到满足:该可执行文件必须经过 Windows Publisher 的数字签名,Windows Publisher 是用于对 Windows 附带的所有代码进行签名的证书(仅由 Microsoft 进行签名是不够的,因此 Windows 未附带的 Microsoft 软件不包括在内);并且该可执行文件必须位于其中一个为数不多的“安全”目录中。安全目录是指标准用户无法修改的目录,并且它们包括 %SystemRoot%\System32(例如,\Windows\System32)及其大多数子目录、%SystemRoot%\Ehome,以及 %ProgramFiles% 下的少许目录(其中包括 Windows Defender 和 Windows 日记本)。同时,视可执行文件是普通 .exe、Mmc.exe 还是 COM 对象而定,自动提升还有一些附加规则。如果 .exe 种类的 Windows 可执行文件(如前面所定义)在其清单中指定了 autoElevate 属性,这些可执行文件将会自动提升。应用程序也将在该清单中向 UAC 指明它们需要管理权限。此处的 Sysinternals Sigcheck 实用工具通过命令“sigcheck –m %systemroot%\system32\taskmgr.exe”来转储任务管理器 (Taskmgr.exe) 的清单,该清单显示任务管理器已加入自动提升,如图 4 所示。
图 5 外壳注册表项要使 COM 对象能够自动提升,它还必须是 Windows 可执行文件,并且必须已由 Windows 可执行文件进行实例化。(不过,无需将实例化可执行文件标记为自动提升。)例如,当您使用资源管理器通过 PA 帐户在 %ProgramFiles% 目录中创建目录时,操作将会自动提升,因为 COM 对象请求了提升、对象的 DLL 是 Windows 可执行文件,并且资源管理器是 Windows 可执行文件。
自动提升与 UAC 的目标那么,所有特殊自动提升规则背后的原理是什么?选择要自动提升哪些程序以及不自动提升哪些程序是由以下问题确定的:“应用程序开发人员是否能够利用自动提升无意间或不费力地依赖于管理权限?”由于可以使用 Cmd.exe 通过命令行参数来执行批处理脚本,并且普通用户不需要以提升方式运行命令提示符(大多数用户甚至不知道命令提示符是什么),因此未将 Cmd.exe 列入自动提升的清单。同样,承载控制面板插件的可执行文件 Rundll32.exe 在 Windows 7 的最终版本中也未自动提升,因为对于任何常见管理任务而言,并不需要对其进行提升,并且,如果 Rundll32.exe 进行了自动提升,则它通过命令行承载任意 DLL 的能力将会导致开发人员要求使用管理员权限,而自己却未意识到。自 Windows Vista 测试版发布以来,最终用户一直在要求 Windows 提供一种向自动提升列表中添加任意应用程序的方法。经常被提及的原因是:他们常用的某个第三方应用程序强制他们不断单击提升权限提示,而这已经成为他们日常工作的一部分。就像 Windows Vista 一样,Windows 7 并未提供这种功能。我们理解这种操作非常繁琐,并且可能有这些应用程序无法在没有管理权限的情况下运行的合理原因,但开发人员将会避免将其代码修正为使用标准用户权限,而这样的风险太高。即使有关哪些应用程序进行自动提升的列表只能由管理员访问,但开发人员只需更改其要求一次性提升的应用程序安装程序,就可将其应用程序添加到列表中。作为替代,我们选择进行投资来进行培训并与应用程序开发人员密切合作,以确保其程序能够以标准用户身份正常工作。很多人发现,采用 PA 帐户通过标准用户权限运行的第三方软件可以利用自动提升来获取管理权限。例如,软件可以使用 WriteProcessMemory API 将代码注入资源管理器,并使用 CreateRemoteThread API 来执行该代码,这种技术称为 DLL 注入。由于代码在资源管理器(一种 Windows 可执行文件)中执行,因此它可以利用自动提升的 COM 对象(比如“复制”/“移动”/“重命名”/“删除”/“链接”对象)来修改系统注册表项或目录,并为软件授予管理权限。如果是这样,这些步骤将需要蓄意谋划,而且并非无关紧要,因此,与将其软件修正为使用标准用户权限来运行相比较,我们不相信正当的开发人员会选择进行这些步骤。事实上,我们建议任何应用程序开发人员不要依赖于系统中的提升行为,并且建议应用程序开发人员测试其软件在标准用户模式下运行的情况。接下来的发现是,恶意软件可以使用同样的技术获取管理权限。同样,情况确实如此,但正如我前面指出的,恶意软件也可以通过提示的提升来危害系统。从恶意软件的角度来看,Windows 7 的默认模式并不比“始终通知”模式(“Vista 模式”)安全多少,并且,采用管理权限的恶意软件在 Windows 7 的默认模式下运行时,将仍然会崩溃。
结论总而言之,UAC 是一组具有一个整体目标的技术:使用户能够以标准用户身份运行。因为对 Windows 进行了更改,使标准用户能够执行以前需要管理权限的更多操作,再结合文件和注册表虚拟化以及提示,从而共同实现了此目标。最终标准是:默认的 Windows 7 UAC 模式通过减少提示使 PA 用户的体验更加流畅、允许用户控制可以修改其系统的合法软件,并仍然实现 UAC 的目标,即让更多的软件能够在没有管理权限的情况下运行,并继续使软件生态系统转变为编写能够使用标准用户权限工作的软件。