首先,考虑提升对话框本身。它显示将被授予管理权限的主要可执行文件的名称和发布者。遗憾的是,尽管越来越多的软件发布者为其代码添加了数字签名,但仍然有一些软件发布者没有这样做,并且还有许多未添加签名的旧版应用程序。对于未签名的软件而言,提升对话框只会显示可执行文件的文件名,因此,对于某些恶意软件(例如,已采用用户帐户运行并且正在监视未签名 Setup.exe 应用程序安装程序的提升)而言,将能够将可执行文件替换为恶意的 Setup.exe,而用户却一无所知(请参阅图 1)。
其次,该对话框不会告知用户可执行文件在启动时将会加载哪些 DLL。如果可执行文件位于用户可以控制的目录中,则使用用户标准权限运行的恶意软件将能够替换该位置中软件将使用的任何关联 DLL。此外,恶意软件可以使用并行功能,使可执行文件加载应用程序或系统 DLL 的恶意版本。并且,除非用户警惕地单击详细信息按钮,并仔细查看为提升可执行文件列出的文件路径,否则恶意软件可以将可执行文件复制到名称类似的位置,例如,/ProgramFiles/Vendor/Application.exe(注意应为Program Files的内容中缺少的空格),在该位置中,恶意软件将可控制应用程序加载哪些 DLL。在图 2 中,我已将 Microsoft 网络监视器的一个组件复制到用户创建的 C:/ProgramFiles 目录(用户可控制该目录),并启动了该组件。
最后,为了实现应用程序兼容性,提升的应用程序与标准用户环境共享实质性状态,恶意应用程序可以使用该状态来影响提升的应用程序的行为。就这一点而言,最直观的示例就是用户的注册表配置文件 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 中显示的默认设置就是其中一个新级别。与位于滑块顶部并相当于 Windows Vista 中的默认模式的始终通知不同,只有当非 Windows 可执行文件请求提升时,Windows 7 才会默认提示用户;针对非 Windows 提升的行为与 Windows Vista 相同。
下面接下来的滑块位置是第二个新设置,它的标签相同,只是后面附加了(不降低桌面亮度)。该模式和默认模式的唯一不同之处在于:提示将出现在用户的桌面(而不是安全桌面)上。这样的好处是:用户可以在提示处于活动状态的同时与桌面交互,但正如我之前提到的,将会出现第三方辅助功能软件可能无法在该提示对话框上正常工作的风险。
最后,如果选择最底部的滑块位置,将会完全禁用 UAC 技术,这样,所有采用 PA 帐户运行的软件都将使用完全管理权限运行、文件系统和注册表虚拟化将被禁用,并且保护模式 IE 将被禁用。尽管采用此设置时将没有提示,但保护模式 IE 的损失是此模式的一个很大的弊端。
自动提升
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/diannaorumen/)在采用中间两种设置时,之所以(大多数)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 所示。
在目录树中查找自动提升可执行文件的一种简便方法是,通过如下所示的命令使用 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 显示了外壳的复制/移动/重命名/删除/链接对象的注册表项,当用户对其帐户没有权限访问的位置执行文件系统操作时,资源管理器将使用该对象。
要使 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 并未提供这种功能。我们理解这种操作非常繁琐,并且可能有这些应用程序无法在没有管理权限的情况下运行的合理原因,但开发人员将会避免将其代码修正为使用标准用户权限,而这样的风险太高。即使有关哪些应用程序进行自动提升的列表只能由管理员访问,但开发人员只需更改其要求一次性提升的应用程序安装程序,就可将其应用程序添加到列表中。作为替代,我们选择进行投资来进行培训并与应用程序开发人员密切合作,以确保其程序能够以标准用户身份正常工作。
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/diannaorumen/)很多人发现,采用 PA 帐户通过标准用户权限运行的第三方软件可以利用自动提升来获取管理权限。例如,软件可以使用 WriteProcessMemory API 将代码注入资源管理器,并使用 CreateRemoteThread API 来执行该代码,这种技术称为 DLL 注入。由于代码在资源管理器(一种 Windows 可执行文件)中执行,因此它可以利用自动提升的 COM 对象(比如复制/移动/重命名/删除/链接对象)来修改系统注册表项或目录,并为软件授予管理权限。如果是这样,这些步骤将需要蓄意谋划,而且并非无关紧要,因此,与将其软件修正为使用标准用户权限来运行相比较,我们不相信正当的开发人员会选择进行这些步骤。事实上,我们建议任何应用程序开发人员不要依赖于系统中的提升行为,并且建议应用程序开发人员测试其软件在标准用户模式下运行的情况。
接下来的发现是,恶意软件可以使用同样的技术获取管理权限。同样,情况确实如此,但正如我前面指出的,恶意软件也可以通过提示的提升来危害系统。从恶意软件的角度来看,Windows 7 的默认模式并不比始终通知模式(Vista 模式)安全多少,并且,采用管理权限的恶意软件在 Windows 7 的默认模式下运行时,将仍然会崩溃。
结论
总而言之,UAC 是一组具有一个整体目标的技术:使用户能够以标准用户身份运行。因为对 Windows 进行了更改,使标准用户能够执行以前需要管理权限的更多操作,再结合文件和注册表虚拟化以及提示,从而共同实现了此目标。最终标准是:默认的 Windows 7 UAC 模式通过减少提示使 PA 用户的体验更加流畅、允许用户控制可以修改其系统的合法软件,并仍然实现 UAC 的目标,即让更多的软件能够在没有管理权限的情况下运行,并继续使软件生态系统转变为编写能够使用标准用户权限工作的软件。