原文出处:http://www.win7china.com/html/10670.html
在家庭和公司环境中,使用标准用户帐户可以提高安全性并降低总体拥有成本。当用户使用标准用户权限(而不是管理权限)运行时,系统的安全配置(包括防病毒和防火墙配置)将得到保护。这样,用户将能拥有一个安全的区域,可以保护他们的帐户及系统的其余部分。对于企业部署,桌面 IT 经理设置的策略将无法被覆盖,而在共享家庭计算机上,不同的用户帐户将受到保护,避免其他帐户对其进行更改。
但是,很久以来,Windows 的用户一直都在使用管理权限运行。因此,软件通常都开发为使用管理帐户运行,并且(通常无意间)依赖于管理权限。为了让更多软件能够使用标准用户权限运行,并且帮助开发人员编写能够使用标准用户权限正常运行的应用程序,Windows Vista 引入了用户帐户控制 (UAC)。UAC 集成了一系列技术,其中包括文件系统和注册表虚拟化、受保护的系统管理员 (PA) 帐户、UAC 提升权限提示,以及支持这些目标的 Windows 完整性级别。我在我的会议演示文稿和 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 或Windows7系统上的第一个帐户(在 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,在使用标准用户权限和管理权限运行的软件之间建立一个坚不可摧的屏障(称为安全边界),但由于以下两个原因,而导致该目标未能实现,并随之被放弃:可用性和应用程序兼容性。
图 1 显示可执行文件的名称。
首先,考虑提升对话框本身。它显示将被授予管理权限的主要可执行文件的名称和发布者。遗憾的是,尽管越来越多的软件发布者为其代码添加了数字签名,但仍然有一些软件发布者没有这样做,并且还有许多未添加签名的旧版应用程序。对于未签名的软件而言,提升对话框只会显示可执行文件的文件名,因此,对于某些恶意软件(例如,已采用用户帐户运行并且正在监视未签名 Setup.exe 应用程序安装程序的提升)而言,将能够将可执行文件替换为恶意的 Setup.exe,而用户却一无所知(请参阅图 1)。
其次,该对话框不会告知用户可执行文件在启动时将会加载哪些 DLL。如果可执行文件位于用户可以控制的目录中,则使用用户标准权限运行的恶意软件将能够替换该位置中软件将使用的任何关联 DLL。此外,恶意软件可以使用并行功能,使可执行文件加载应用程序或系统 DLL 的恶意版本。并且,除非用户警惕地单击详细信息按钮,并仔细查看为提升可执行文件列出的文件路径,否则恶意软件可以将可执行文件复制到名称类似的位置,例如,\ProgramFiles\Vendor\Application.exe(注意应为“Program Files”的内容中缺少的空格),在该位置中,恶意软件将可控制应用程序加载哪些 DLL。在图 2 中,我已将 Microsoft 网络监视器的一个组件复制到用户创建的 C:\ProgramFiles 目录(用户可控制该目录),并启动了该组件。
图 2 已启动的 Microsoft 网络监视器组件的副本。
最后,为了实现应用程序兼容性,提升的应用程序与标准用户环境共享实质性状态,恶意应用程序可以使用该状态来影响提升的应用程序的行为。就这一点而言,最直观的示例就是用户的注册表配置文件 HKEY_CURRENT_USER (HKCU)。该配置文件是共享的,因为用户希望他们作为标准用户注册的设置和扩展能够在提升的应用程序中工作。恶意软件可以使用 HKCU 中注册的外壳扩展来加载到使用任何外壳浏览对话框(比如“打开文件”和“保存文件”)的已提升应用程序中。其他各种状态也是共享的,特别是基本命名对象命名空间,应用程序将在其中创建同步和共享内存对象。举例来说,恶意软件可以利用该共享来劫持提升的应用程序使用的共享内存对象,从而对应用程序和系统造成危害。
至于 Windows 完整性机制,由于我前面提到的提升问题,因此它作为屏障的有效性是有限的,而它还存在由于应用程序兼容性而导致的限制。举例来说,UIPI 不会阻止标准用户应用程序在桌面上绘图,这一点可能会被用来欺骗用户,采用为恶意软件授予管理权限的方式来与提升的应用程序交互。同时,Windows 完整性机制也不能跨网络应用。采用 PA 帐户运行的标准用户应用程序将能访问 PA 帐户具有管理权限的远程系统上的系统资源。如果解决这些限制,将会对应用程序兼容性造成很大影响。尽管如此,我们一直在探寻提高系统安全性(例如,改善保护模式 IE),同时解决应用程序兼容性问题并与软件开发人员密切配合的方法。
那么,当您在启用了 UAC 的情况下采用 Windows Vista PA 帐户运行时,您将得到什么程度的恶意软件防护?首先,请记住,要使任何这种情况发生,恶意软件首先必须进入系统并且开始执行。Windows 具有许多深层防御功能,其中包括数据执行保护 (DEP)、地址空间加载随机化 (ASLR)、保护模式 IE、IE 8浏览器 SmartScreen 筛选器,以及可以帮助防止恶意软件进入系统并运行的 Windows Defender。
至于恶意软件通过某种方式成功进入系统的情况,由于恶意软件作者(比如合法的开发人员)假设用户使用管理权限运行,因此大多数恶意软件将无法正常工作。仅这一点可以被视为一种安全优势。但是,已进入系统并且设计为可利用这些机会的恶意软件将能够在用户第一次提升时获得管理权限 — 但恶意软件甚至不需要等待“实际”提升,因为它可以促成提升,而这种提升甚至可以欺骗最注重安全的用户。我已经在我的 UAC 内部信息和 Windows 安全边界演示文稿中公开演示过恶意软件如何能够劫持提升过程(演示位于安全边界讨论的 1 分 03 秒处)。但是,请记住,如果恶意软件已经开始运行,它只需使用标准用户权限就可达到恶意软件想要达到的大部分目的,其中包括将本身配置为在每次用户登录时运行、窃取或删除所有用户的数据,或者甚至成为僵尸网络的一部分。
Windows 7 中的不同之处
我在前面提过,Windows 7 中的某些操作现在可由标准用户执行,但正如有关 UAC 的 E7 博客文章所述,我们还认识到,我们可以在不影响 UAC 的目标的情况下使 Windows 体验更加流畅。许多用户抱怨说,当他们执行常见的系统管理操作时,Windows Vista 本身会频繁地请求管理权限。使 Windows 能够针对标准用户环境正常工作对我们最有利,因为这样将为我们的客户带来利益。但是,提升权限提示并没有告诫或鼓励我们这样做,而是会强制用户在绝大多数用户都不理解的对话框中再次单击。因此,Windows 7开始从默认 Windows 体验中最大程度地减少这些提示,并使以管理员身份运行的用户能够控制其提示体验。
为此,我们进一步重构了系统,这样,拥有标准用户权限的用户将能执行更多任务,并且,我们减少了若干多提示方案(例如,在 IE 中安装 ActiveX 控件)中的提示数量。Windows 7 还引入了两种新的 UAC 操作模式,可以在新的 UAC 配置对话框(请参阅图 3)中选择这些模式。通过转到控制面板,单击“用户帐户”,单击“用户帐户”,然后单击“更改用户帐户控制设置”,您可以打开该对话框。(您也可以通过单击提升权限提示上的“显示这些通知时进行更改”链接或通过访问“操作中心”来进入该对话框。)
图 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 所示。
图 4 autoElevate 属性
在目录树中查找自动提升可执行文件的一种简便方法是,通过如下所示的命令使用 Sysinternals Strings 实用工具:
strings –s *.exe | findstr /i autoelevate
还有一个硬编码列表,其中包含获得自动提升处理的 Windows 可执行文件。这些 Windows 可执行文件也并非是 Windows 7 附带的内部文件,因此它们必须能够在 autoexecute 属性会导致错误的旧版系统上运行。列表中包括 Migwiz.exe(迁移向导)、Pkgmgr.exe(程序包管理器)和 Spinstall.exe(Service Pack 安装程序)。
将对 Microsoft 管理控制台 Mmc.exe 进行特殊处理,因为它承载了多个以 DLL 形式实现的系统管理管理单元。Mmc.exe 通过命令行启动,该命令行指定一个 .MSC 文件,其中列出要加载的管理单元 MMC。Mmc.exe 将在通过 PA 帐户启动时请求管理权限,当 Windows 发现这一点时,它将验证 Mmc.exe 是否为 Windows 可执行文件,然后检查 .MSC。为了获得自动提升资格,.MSC 文件必须满足 Windows 可执行文件条件(由 Windows 在安全的位置中签名),并且必须列在自动提升 .MSC 的内部列表中。该列表实际上包括 Windows 附带的所有 .MSC 文件。
最后,COM 对象可以通过创建一个名为 Elevation 的子项(其名为 Enabled 的值设置为 1),利用其注册表项中的注册表值来指定需要管理权限。图 5 显示了外壳的“复制”/“移动”/“重命名”/“删除”/“链接”对象的注册表项,当用户对其帐户没有权限访问的位置执行文件系统操作时,资源管理器将使用该对象。
图 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 的目标,即让更多的软件能够在没有管理权限的情况下运行,并继续使软件生态系统转变为编写能够使用标准用户权限工作的软件。