深入了解Windows Vista用户帐户控制
如果用户拒绝提升,Windows 将向激发该启动过程的进程返回一个拒绝访问错误。当用户通过输入管理员凭据或单击“继续”同意提升时,AIS 将调用 CreateProcessAsUser 以使用适当的管理身份启动进程。虽然从技术上讲 AIS 是所提升进程的父项,但 AIS 使用了 CreateProcessAsUser API 中的新支持,后者将该进程的父进程 ID 设为最初启动它的进程的 ID(请参阅图 13)。这就是在显示进程树的工具(如 Process Explorer)中,已提升进程没有显示为 AIS Service Hosting 进程的子项的原因。
图 13 提升流程
即使提升对话框显示在单独的安全桌面上,默认情况下,用户也无法验证他们查看的是合法对话框,而不是由恶意软件提供的对话框。这并不是 AAM 的问题,因为恶意软件虽无法使用假的“同意”对话框获取管理权限,但它可以等待标准用户的 OTS 提升,截获它,并使用特洛伊木马对话框捕获管理员凭据。使用那些凭据,它们可以获得对管理员帐户的访问权限并感染它。
因此,强烈建议不要在企业环境中使用 OTS 提升。要禁用 OTS 提升(并减少咨询台呼叫),请运行本地安全策略编辑器 (Secpol.msc) 并将“用户帐户控制:标准用户的提升提示行为”配置为“自动拒绝提升请求”。
注重安全的家庭用户应当将 OTS 提升配置为要求使用一个恶意软件无法截获或模拟的安全注意序列 (SAS)。要配置 SAS,请运行组策略编辑器 (Gpedit.msc),导航到“计算机配置”|“管理模板”|“Windows 组件”|“凭据用户界面”,并启用“要求输入凭据的受信任路径”。完成上述步骤后,会要求您输入 Ctrl+Alt+Delete 以访问提升对话框。
隔离已提升的进程
Windows Vista 在已提升进程周围设置了一道屏障,以保护它们免受在同一桌面上使用标准用户权限运行的恶意软件的侵扰。如果没有这道屏障,恶意软件可能会通过窗口消息发送合成的鼠标和窗口输入,从而驱动某个管理应用程序。虽然标准 Windows 安全模型可防止使用标准用户权限在进程中运行的恶意软件破坏作为不同用户运行的已提升进程,但它不会禁止作为某个管理用户的标准权限版本运行的恶意软件打开该用户的已提升进程、向其中插入代码并启动其中的线程以执行插入的代码。
Windows Vista 为窗口消息提供的防护称为用户界面特权隔离 (UIPI)。它基于新的 Windows 完整性机制,Windows Vista 同样使用该机制作为已提升进程周围的屏障。在此新安全模型中,所有进程和对象都具有完整性级别,并且对象的完整性策略可以限制访问权限,否则,这些访问权限将由 Windows 随机访问控制 (DAC) 安全模型授予某个进程。
完整性级别 (IL) 由安全标识符 (SID) 表示,后者还表示用户和组;而级别则编码在 SID 的相对标识符 (RID) 中。图 14 显示了四个主要 IL 的显示名称、SID 和 SID 的 RID 的十六进制版本。十六进制数字揭示了每个级别间的 0x1000 的间隔,以便提供由 UI 可访问性应用程序使用的中间级别并考虑未来增长需要。
图 15 列出了对象 IL 策略以及它们所限制的访问类型,这些访问类型与为对象定义的通用访问权限相对应。例如,No-Write-Up 将禁止低 IL 进程获取任何由 GENERIC_WRITE 访问权限表示的访问权限。大多数对象(包括文件和注册表项)的默认策略都是 No-Write-Up,这将禁止进程从具有比它更高的 IL 的对象获取写访问权限,即使该对象的随机访问控制列表 (DACL) 授予用户这种访问权限也是如此。仅有的具有不同策略的对象是进程对象和线程对象。它们的策略(No-Write-Up 加上 No-Read-Up)会禁止在低 IL 上运行的进程向具有较高 IL 的进程插入代码或从中读取数据(如密码)。
Windows 为每个进程分配一个 IL,该 IL 放在进程令牌中组 SID 的旁边,这些组是运行该进程的用户所属的组。图 16 列出了分配给不同 IL 的进程示例。进程通常继承其父项的 IL,但进程也可以在其他 IL 上启动进程,与 AIS 启动已提升进程时的操作相同。您可以通过指定 /all 选项使用内置的 Whoami 实用工具、Sysinternals Process Explorer 或 AccessChk 来查看进程完整性级别。Process Explorer 可以在附加的“完整性级别”列中显示进程 IL。
每个安全对象都有一个显式或隐式的 IL。进程、线程和令牌对象始终具有一个显式分配的 IL,它通常与对应进程令牌中存储的 IL 相同。多数对象都没有显式 IL,因此都默认为某个中等 IL。使用中等以外的 IL 创建的仅有对象是由在低 IL 上运行的进程创建的对象,它们因此而具有一个低 IL。您可以使用内置的 iCacls 工具 (%SystemRoot%\System32\iCacls.exe) 查看文件的 IL,并使用 Sysinternals AccessChk 实用工具查看文件、注册表项、服务和进程的 IL。图 17 显示需要通过保护模式 Internet Explorer 才能访问的目录的 IL 为“低”。

图 17 显示用户收藏夹目录 IL 的 AccessChk
如果对象具有显式 IL,则它存储在 Windows Vista 中新引入的一种访问控制项 (ACE) 类型中(即 Label ACE),该 ACE 位于对象安全描述符的系统访问控制列表 (SACL) 中(请参阅图 18)。ACE 中的 SID 对应于对象的 IL,ACE 的标志为对象的完整性策略进行了编码。在 Windows Vista 之前,SACL 只存储审核 ACE,这需要“管理审核和安全日志”特权 (SeSecurityPrivilege),但读取 Label ACE 只需要“读取权限”(READ_CONTROL) 访问权限。如果进程要修改对象的 IL,它必须具有该对象的“更改所有者”(WRITE_OWNER) 访问权限以及一个与该对象相同或更高的 IL,并且该进程只能将 IL 设置为自己的 IL 或更低的 IL。新的“修改对象标签”(SeRelabelPrivilege) 特权使进程能够更改它可以访问的任何对象的 IL,甚至将 IL 提高到超过进程自己的 IL,但默认情况下,该特权未分配给任何帐户。
图 18 对象的 Label ACE
当进程尝试打开某个对象时,内核的 SeAccessCheck 功能中将先进行完整性检查,然后再进行标准的 Windows DACL 检查。在默认完整性策略下,仅当进程的 IL 等于或高于对象的 IL,且 DACL 也为该进程授予了它所需要的权限时,该进程才能打开此对象进行写访问。例如,低 IL 进程不能打开中等 IL 进程进行写访问,即使 DACL 为该进程授予了写访问权限。
在默认完整性策略下,进程可以打开任何对象(进程和线程对象除外)进行读取访问,只要对象的 DACL 为它们授予了读取权限即可。这意味着,在低 IL 上运行的进程可以打开任何其运行所在的用户帐户可以访问的文件。保护模式 Internet Explorer 使用 IL 来帮助防止感染它的恶意软件修改用户帐户设置,但是它不能禁止恶意软件读取用户的文档。
上述情况不适用于进程和线程对象,因为它们的完整性策略还包括 No-Read-Up。这意味着,进程的 IL 必须等于或高于它要打开的进程或线程的 IL,且 DACL 必须授予它成功打开所需的访问权限。假设 DACL 允许授予所需的权限,图 19 显示了在中等和低 IL 上运行的进程针对其他进程和对象所拥有的访问权限。
图 19 对象和进程访问权限
Windows 消息传递子系统还支持完整性级别通过以下方式实施 UIPI:禁止进程向具有较高 IL 的进程所拥有的窗口发送除信息性窗口消息以外的任何消息。这将不允许标准用户进程向已提升进程的窗口进行输入,或不允许通过向其发送可触发内部缓冲区溢出的格式不正确的消息来破坏已提升进程。进程可以通过调用 ChangeWindowMessageFilter API 选择允许其他消息通过这层防范。UIPI 还会防止窗口挂接影响较高 IL 进程的窗口,这样,例如标准用户进程便无法记录用户在管理应用程序中的键击情况。
提升和安全边界
UAC 提升是一种方便性,而不是安全边界,清楚这一点很重要。安全边界要求安全策略指明能够通过该边界的内容。用户帐户就是 Windows 中安全边界的一个示例,因为如果没有另一个用户的许可,某个用户就无法访问属于另一个用户的数据。
因为提升不是安全边界,所以无法保证使用标准用户权限在系统上运行的恶意软件不会侵扰已提升进程以获取管理权限。例如,提升对话框只标识了即将提升的可执行文件;其中没有提供执行时将如何操作的任何信息。可执行文件将处理命令行参数、加载 DLL、打开数据文件并与其他进程通信。可以想象,上述任何操作都可能允许恶意软件侵扰已提升进程,进而获取管理权限。
低 IL 沙盒中的游戏
保护模式 Internet Explorer 在低 IL 上运行,以便在可能感染其进程的恶意软件周围筑起一道围墙。这将防止恶意软件更改用户帐户设置并将自己安装在一个自动启动位置。您可以使用 Sysinternals PsExec 实用工具和 -l 开关,在低 IL 上启动任意进程以探究沙盒的秘密。图 B 显示了在低 IL 上运行的命令提示符如何无法在用户的临时目录(具有中等 IL)中创建文件,却能够在具有低 IL 的 Internet Explorer 临时目录中创建该文件。
图 B 命令提示符只能在相似的 IL 中创建文件
已提升的 AAM 进程尤其易受侵扰,因为它们在与 AAM 用户的标准权限进程相同的用户帐户下运行,并共享用户的配置文件。许多应用程序读取在用户配置文件中注册的设置并加载在其中注册的扩展,这为恶意软件的提升提供了机会。例如,常用控制对话框会加载在用户的注册表项(位于 HKEY_CURRENT_USER 下)中配置的外壳扩展,因此恶意软件可以将其自身作为一项扩展添加进去,以加载到使用那些对话框的任何已提升进程中。
即使是从标准用户帐户提升的进程也必定会因共享状态而受到侵扰。在某个登录会话中运行的所有进程将共享 Windows 用来存储对象(如事件、mutex、信号和共享内存)的内部命名空间。如果恶意软件知道某个已提升进程将在进程启动时尝试打开并读取特定共享内存对象,它可以创建该对象,而其内容将触发缓冲区溢出以便将代码插入到已提升进程中。这种攻击类型比较复杂,但其存在的可能性使得 OTS 提升无法成为一种安全边界。
我们的底线是引入提升以提供方便,从而鼓励要获得管理权限的用户在默认情况下使用标准用户权限运行。希望安全边界有保障的用户可以用方便性换取这种保障,此时,可以为日常任务使用标准用户帐户,同时使用快速用户切换 (FUS) 切换到专用管理员帐户来执行管理操作。另一方面,希望用安全性换取方便性的用户可以在“控制面板”的“用户帐户”对话框中禁用系统上的 UAC,但是必须清楚,这同时也会禁用 Internet Explorer 的保护模式。
结束语
以标准用户身份运行有许多好处,其中包括有助于保护系统免受无意或有意的损害,以及防止共享系统的用户的数据和完整性受到未经授权的访问。UAC 的各种变化和技术将导致 Windows 使用模型发生重要改变。在 Windows Vista 中,Windows 用户第一次能够使用标准用户权限执行大多数日常任务并运行大多数软件,现在,许多企业都能够部署标准用户帐户。











文章评论
共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面