Windows Vista用户帐户控制深度剖析文章作者 盆盆 技术难度 Level300 内容简介 本文详细介绍了用户帐户控制(UAC)的应用程序标识、安全桌面和虚拟重定向等深层原理详细描述了用户帐户控制对用户的价值,并且总结为什么不能禁用 UAC的若干理由更重要的是,本文还就用户广为诟病的 UAC问题提出比较巧妙的解决方案,既能尽可能规避 UAC所带来的麻烦,又能保留 UAC的安全性 原始链接 Windows Vista 中,使用管理员帐户登录系统,当 Winlogon 进程收集帐户凭据并交由 LSA 验证后LSA 会查看该帐户的访问令牌,如果发现里面包含某些高级特权(例如“修改系统时间”) 或者高级 SID(例如管理员组 SID),就会自动创建两个访问令牌,一个是管理员访问令牌(Full Token),另一个是标准用户访问令牌(UAC Token) 由 Winlogon 启动的初始化进程 userinit 链接到标准用户访问令牌,所以由 userninit 进程启动的Explorer 进程也链接到标准用户访问令牌同样由 Explorer 启动的用户进程也会自动链接到标准用户访问令牌,由此大大减少受攻击面,极大地提升系统安全性。
如附图所示如果某个进程需要以更高权限运行,则系统会弹出一个权限提升对话框,确认后即可以更高权限运行该进程,该进程链接到管理员访问令牌提示要了解有关 UAC 进程创建的流程,可以参考 MVP Smallfrog 的 《 Windows Vista UAC 模式下的进程创建实战的故事》五种标识权限提升的方法Windows Vista 并没有一种与生俱来的魔力,可以未卜先知某个应用程序是否应该运行在更高安全级别上应用程序必须自己想办法通知 Windows Vista 它需要更高权限有以下五种方法,让Windows Vista 明白该应用程序需要提升权限:(1) Windows Vista 可以智能识别安装程序,例如根据安装程序的文件名(包含 install 或者 setup),还可以智能识别 msi 发布的安装包等等可以做一个实验,如果修改其他某个应用程序的名字,例如将.exe 重命名为 Install.exe,运行它就会自动触发权限提升,原来 UAC 以为这是一个安装程序2) 在可执行文件的属性对话框、兼容性标签页里勾选“以管理员身份启动该程序 ”复选框这等效于在 HKCU \Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers 注册表分支下添加键值,也相当于修改 C:\Windows\AppPatch 下的 sysmain.sdb 兼容性数据库。
3) 在程序的 manifest 文件或者内嵌的 manifest 信息里加入“ level=highestAvaible”或者“level requireAdministrator”安全级别4) 鼠标右键单击应用程序,选择“用管理员帐户运行”菜单项5) 利用 ACT(应用程序兼容性工具)为特定应用程序创建兼容性数据库,以便 IT 部门可以方便地在企业里部署兼容性设置提示其中(2)和(3)可以参考笔者的 《Windows Vista UAC 安全功能深入剖析系列之二 》毁誉参半的安全桌面大概是从 5365 Build 起,当系统弹出“用户帐户控制”提升权限对话框时( 实际上是 consent 进程),桌面背景会呈暗色显示,这可能导致某些显示器弹出“无信号”的错误消息,正好可能挡住 consent 对话框,让这些用户感到非常不便1.原理简析其实这个功能的本意是非常好的,可以增加 UAC 功能的安全度原来这个暗色的背景实际上是安全桌面,也就是我们按“Ctrl+Alt+Del”组合键时所看到的蓝色的特殊桌面(上面有类似启动任务管理器等命令)为什么看到的是暗色的当前桌面呢?原来这是微软为了保持用户体验的一致性,特地对当前桌面做了一个“快照”,将其作为安全桌面的“墙纸”。
由于 consent 对话框实际运行在安全桌面上( 安全桌面运行在 session 0 上,而用户进程都运行在session 1 或者更高的 session 上) ,所以安全性非常好除了少数系统进程外,任何用户进程都无法和consent 对话框进行通信,所以恶意程序无法仿冒提升权限对话框以便诱使用户点击由于安全桌面的安全性非常好,所以连我们自己都无法直接监控 UAC 背后发生了什么,同时甚至无法按 PrintScreen 键进行截图(剪贴板程序无法获得键盘输入 )2.如何监控 UAC 底层变化用常规方法无法对 UAC 背后的变化进行监控,因为这时候提升权限对话框运行在安全桌面上,用户进程无法与之进行通信,所以我们必须另辟蹊径联想到 Longhorn Server 也具有 UAC 功能(默认禁用),所以我们可以利用 Longhorn Server 搭建一个实验环境,用管理员帐户登录进入 Session 1,然后借助远程桌面,以另外一个管理员身份登录到这台实验机,进入 Session 2我们在 Session 1 里试图运行一个管理任务,这时候系统会提示权限提升由于安全桌面的原因,这时候无法在 Session 1 下用 Process Explorer 访问 consent 进程的详细信息。
这时候我们可以在远程桌面窗口(Session 2)下打开 Process Explorer,可以很方便地查看consent 进程的详细信息,如附图所示,我们可以发现 consent 进程的父进程是 svchost(本例的 PID是 1008),查看这个 PID 1008 的 svchost 进程,发现是“Application Information Service”服务的宿主进程所以可以推测是“Application Information Service”服务启动了 consent 进程同时还可以看到 consent 进程本身运行在 Session 1,而不是 Session 03.禁用安全桌面可以用以下方法禁用安全桌面:(1) 运行 secpol.msc,打开“本地安全策略”管理单元窗口2) 在左侧的控制台树中依次展开本地策略、安全选项,在右侧的详细窗格里双击“用户帐户控制:提示提升时切换到安全桌面”策略项3) 在打开的对话框里选中 “已禁用”选项,如附图所示让 UAC 停薪留职不少读者朋友非常讨厌 UAC,有时候 UAC 就像是一位喋喋不休的 MM,时不时地打断我们的正常工作。
为什么那么多朋友都无法容忍 UAC?用户对 UAC 功能的抱怨大概集中在以下两个方面:(1) 我已经是管理员了,为什么不直接允许我执行管理任务?如果是第三方应用软件倒也罢了,为什么 Windows 自带的工具软件都要阻止我?为什么不能让防火墙一样设置规则,让 UAC 下次不要再提醒?(2) 为什么转移、删除一个文件都要那么麻烦?有不少朋友安装好 Windows Vista 后,第一件事情就是禁用 UAC!其实这是一种非常不值得的做法,至少有如下五大理由:(1) UAC 功能是 Windows Vista 中最大的卖点之一,花费不菲购买了 Windows Vista,却把其中最值钱的功能特性给禁用了,这很有点“买椟还珠”的意思2) 如果禁用 UAC,则会同时禁用 IE 保护模式等安全特性,这将大大降低系统的安全性3) 在企业环境里,如果启用 UAC,可以减少约 40%的桌面相关成本4) 如果禁用了 UAC,则当以普通用户登录系统时,无法享受 UAC 带来的便利(无法方便地安装程序和执行管理任务,也无法享受 UAC 为遗留应用程序准备的兼容性帮助)5) 强烈推荐正在追 MM 的 GGDD 们启用 UAC,这可以帮助您提前训练对 MM 唠叨的抵抗力。
其实从 Build 5308、Beta 2,一直到当前最新的 5472,UAC 功能的进步是有目共睹的,现在UAC 的恼人提示已经减少了很多,也增加了很多人性化的改进,UAC 功能已经变得越来越平易近人,更多时候,UAC 就像一位站在不远处用慈祥目光注视着我们的母亲,而不再是一个在您耳边不停斥责咆哮的上司如果您确实讨厌 UAC,推荐不要彻底禁用它,而是用以下两种方法将其临时禁用,需要时可以即时恢复1.临时摆脱 UAC 的唠叨—疯狂的石头(1) 打开任务管理器,切换到 “进程”标签页,然后结束“Explorer”进程2) 这时候再单击 “显示所有用户的进程”按钮,即可让任务管理器运行在管理员的级别上3) 切换到“应用程序 ”标签页,单击“新任务”按钮,启动“Explorer”进程,现在新启动的“Explorer”进程运行在管理员级别下现在虽然在安全中心里显示 UAC 启用,如附图所示但是实际上由于 Windows 系统的 Shell 进程Explorer 此刻连接的访问令牌是管理员级别的,所以在 Windows 里启动的任何应用程序都自动继承管理员级别的访问令牌,不受 UAC 的限制,包括执行管理任务和文件操作。
这时候的 UAC 功能,光凭“肉眼”很难辨别真伪,说它是假的,安全中心里明明显示启用;说它是真的,但是却不会受到任何限制……——这不就是疯狂的石头吗?那么如何才能重新回到 UAC 状态呢?聪明的您一定想到了,那就是用标准用户权限重新启动Explorer 进程:(1) 首先在任务管理器里中止 Explorer 进程[ 记住:这时候任务管理器具有管理员权限],然后关闭任务管理器2) 按“Ctrl+Alt+Del ”组合键呼出安全桌面,点击其上的“启动任务管理器”,即可以标准用户权限启动任务管理器,并新建 Explorer 进程,好了,现在 UAC 又回来了!提示只有在万不得已的情况才使用这种方法,而且推荐仅在该环境里运行管理任务或者进行文件操作时,才用这种方法,至于 IE 等进程,最好在之前就启动不过该方法总比彻底禁用 UAC 功能要好2.让 UAC 闭嘴如果既希望启用 UAC 功能,又希望让 UAC 闭嘴,那么可以通过以下方法修改本地安全策略:(1) 运行 secpol.msc,打开“本地安全策略”管理单元窗口2) 在左侧的控制台树中依次展开本地策略、安全选项,在右侧的详细窗格里双击“用户帐户控制:管理审批模式中管理员的提示提升行为”策略项。
3) 在打开的对话框里选中 “无提示”选项,如附图所示这时候 UAC 的功能还是保持启用状态( 可以在安全中心里进行验证),但是当执行管理任务时,系统不再提示确认,而是直接运行当进行文件操作时,如果遇到权限问题,还是会发出提示,如附图所示,但是单击其上的“继续”按钮,并不会弹出“用户帐户控制”的确认对话框,而是直接完成文件操作这种方法的安全性要强于禁用 UAC,因为至少这时候 IE 保护模式等功能还是可以使用的但是如果一个恶意软件被标记为需要提升权限,那么它同样可以被直接执行所以为了保证安全性,可以再启用一条比较严厉的策略“用户帐户控制:只提升签名并认证的可执行文件这样没有合法数字签名的应用程序将拒绝执行提示仅推荐忍耐力比较差的朋友们使用文件操作的噩梦与福音UAC 最为人诟病的就是文件操作的不方便,网上曾流传着这样一个笑话:要彻底删除一个文件,需要花费七个步骤其实平心而论,这本不是 UAC 所造成的问题,恰恰相反,如果理解 UAC 的本质原理,还会发现UAC 其实对文件操作是有帮助的何以见得?原来在 Windows 安全体系中,用户对文件能够进行什么操作,主要是看 E。