在家庭和公司环境中,使用标准用户帐户可以提高安全性并降低总体具有 本钱 。当用户使用标准用户权限(而不是管理权限)运行时,系统的安全配置(包括防病毒和防火墙配置)将得到保护。这样,用户将能具有 一个安全的区域,可以保护他们的帐户及系统的其它 部分。对于企业部署,桌面 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_MACHINESoftware),而不是每用户部分 (HKEY_CURRENT_USERSoftware),而注册表虚拟化会将尝试写入系统位置的操作转到 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,在使用标准用户权限和管理权限运行的软件之间建立一个牢不可破 的屏障(称为安全边境 ),但由于以下两个原因,而导致该目的 未能实现,并随之被放弃:可用性和应用程序兼容性。
图 1 显示可执行文件的称号 。
首先,考虑提升对话框自身 。它显示将被授予管理权限的主要可执行文件的称号 和发布者。遗憾的是,虽然 越来越多的软件发布者为其代码添加了数字签名,但依然 有一些软件发布者没有这样做,并且还有许多未添加签名的旧版应用程序。对于未签名的软件而言,提升对话框只会显示可执行文件的文件名,因而 ,对于某些恶意软件(例如,已采用用户帐户运行并且正在监视未签名 Setup.exe 应用程序安装程序的提升)而言,将可以 将可执行文件替换为恶意的 Setup.exe,而用户却一无所知(请参阅图 1)。
其次,该对话框不会告知用户可执行文件在启动时将会加载哪些 DLL。假如 可执行文件位于用户可以控制的目录中,则使用用户标准权限运行的恶意软件将可以 替换该位置中软件将使用的任何关联 DLL。此外,恶意软件可以使用并行功能,使可执行文件加载应用程序或系统 DLL 的恶意版本。并且,除非用户警觉 地单击详细信息按钮,并认真 查看为提升可执行文件列出的文件路径,否则恶意软件可以将可执行文件复制到称号 类似的位置,例如,ProgramFilesVendorApplication.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(例如,WindowsSystem32)及其大多数子目录、%SystemRoot%Ehome,以及 %ProgramFiles% 下的少许目录(其中包括 Windows Defender 和 Windows 日记本)。
同时,视可执行文件是普通 .exe、Mmc.exe 还是 COM 对象而定,自动提升还有一些附加规则。假如 .exe 品种 的 Windows 可执行文件(如前面所定义)在其清单中指定了 autoElevate 属性,这些可执行文件将会自动提升。应用程序也将在该清单中向 UAC 指明它们需要. 管理权限。此处的 Sysinternals Sigcheck 适用 工具通过命令“sigcheck –m %systemroot%system32taskmgr.exe”来转储任务管理器 (Taskmgr.exe) 的清单,该清单显示任务管理器已加入自动提升,如图[ghost win7纯净版] 4 所示[win7旗舰版系统下载] 。
图 4 autoElevate 属性
在目录树中查找自动提升可执行文件的一种烦琐 方法是,通过如下所示[win7旗舰版系统下载] 的命令使用 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 的目的 ,即让更多的软件可以 在没有管理权限的状况 下运行,并继续使软件生态系统转变为编写可以 使用标准用户权限工作的软件。 |