Vista问世后,安全专家认为UAC实际上并不是一个安全屏障,微软最终承认它不是。但他们谈论的案例是本地管理员,他只需要在 UAC 提示上单击 ALLOW 即可。
但是对于必须在 UAC 提示时输入密码的非管理员用户呢?那么,UAC 真的是一个安全屏障吗?
这里的一个相关问题暗示答案是肯定的,但没有这么明确地说: 假设 UAC 已启用,非管理员帐户是否提供任何安全改进?
Vista问世后,安全专家认为UAC实际上并不是一个安全屏障,微软最终承认它不是。但他们谈论的案例是本地管理员,他只需要在 UAC 提示上单击 ALLOW 即可。
但是对于必须在 UAC 提示时输入密码的非管理员用户呢?那么,UAC 真的是一个安全屏障吗?
这里的一个相关问题暗示答案是肯定的,但没有这么明确地说: 假设 UAC 已启用,非管理员帐户是否提供任何安全改进?
这不是一个真正的答案,但绝对安全地说话可能很危险......所以......这取决于......
我想当你说“微软说 UAC 不是安全屏障”时,这可能就是你的意思:
UAC 不是什么
UAC 并非刻意设计为 Windows 历史上最烦人的功能。相反,这套技术旨在让我们走上一条用户不需要像过去几年那样频繁地将其系统暴露于潜在恶意代码的道路。
在目前的形式下,UAC 不会阻止真正优秀的攻击者,或者那些得到真正优秀攻击者帮助的攻击者。如果坏人想不出任何其他方法来击败 UAC,他们几乎肯定会求助于要求用户为他们做这件事。鉴于跳舞猪的选择和安全性,我们从经验中知道跳舞猪每次都赢。用户已经学会了关闭对话框,所以他们会这样做,直到我们设法教他们其他方式。这是由许多促成因素造成的,包括警告对话框太多、其中的消息无用以及用户购买的任何设备的许多手册都包含“请在安全警告对话框中单击是”的注释解雇它。”
UAC 不提供万无一失的安全性。事实上,它使古老的本地特权提升攻击再次变得有趣。这是一类在很大程度上被打折扣的攻击,因为在 Windows 上,几乎每个人都是管理员,所以提升到其他管理员是毫无意义的。话虽如此,UAC 确实改变了此类攻击的性质,并将游戏规则转变为更像 UNIX 上 20 多年来盛行的规则。
UAC 不会阻止坏人窃取您的个人数据。无论用户的权限如何,该用户都可以访问用户的个人数据。因此,应用程序(包括恶意应用程序)可以访问数据。UAC 没有也不能改变这一点。它并没有消除保持警惕、不信任和偏执的需要——我们都应该抓住每一个机会向我们的最终用户灌输这些属性。
UAC 并非旨在保护以提升权限运行的应用程序免受在同一登录会话中以正常权限运行的应用程序的所有攻击。虽然 UAC 确实提供了一些较弱的进程隔离,但 UAC 将应用程序相互沙箱化并不是设计目标。
那么 UAC 是干什么用的呢?从同一篇文章中,我们得到了答案……
当今世界上一些关于 Windows 安全的最聪明的思想家,例如 Joanna Rutkowska,确实了解 UAC 的目的。正如她在 2007 年 2 月 4 日的一篇博文中所说,UAC“是 Vista 中引入的一种新的安全机制,其主要目标是强制用户使用受限帐户工作,而不是以管理员身份工作”(theinvisiblethings.blogspot.com/ 2007/02/running-vista-every-day.html)。她说得大部分是对的,除了我会使用“启用”而不是“强制”这个词。
这表明 UAC 的目的更多是让用户在大多数情况下放弃管理权限,而不会削弱用户体验。UAC 是为长期游戏实施的一组安全功能。它强制应用程序开发人员在可能的情况下在标准用户的范围内工作,这样用户在本应能够在没有管理权限级别的情况下工作时就不需要提升权限。
对于您的普通用户,如果他们在计算机上没有管理权限,则可能足以阻止他们运行需要管理权限的安装程序。但这绝不是安全的万能解决方案。
奖励材料:这是从 IT 角度对RunAs Radio的 UAC 的一个很好的讨论(第 376 集) 。多年来,Richard Campbell 通过 RunAs Radio 反复提出一个主题,即如果 IT 配置正确,并且用户正在做他们应该做的事情,他们永远不应该被安全屏障阻止。这是一个崇高的目标,但它确实是理想的平衡。
我将暂时退出这个问题,并考虑您提出的另一个问题的上下文:我可以将 Windows Defender 配置为拒绝竞争的 AV 程序吗?
在您大约 30 台机器的规模上……您可能需要像组策略这样的工具来开始更多地锁定机器。但是由于您不在域控制的网络上,您可能不得不满足于组策略的小兄弟:本地策略。
下面是一个可能有用的特定组策略对象:用户帐户控制:标准用户的提升提示行为。此设置将 UAC 配置为自动拒绝权限提升请求。不幸的是,如果用户没有他们需要的软件……或者他们使用的软件需要管理权限,像这样锁定机器会导致更多的帮助台请求。
“安全屏障”一词可能含糊不清。我认为考虑安全保证的概念可能更有用,有时称为安全边界。 更多在这里。
基本上,安全保证是关于软件预期行为的声明。
任何违反安全保证的方式(在适当范围内)都代表安全漏洞,即错误或设计缺陷。对于 Windows 中的安全漏洞,Microsoft 的一般策略是至少尝试纠正该问题。在大多数情况下,这意味着一个安全补丁,通常通过每月累积更新。
注意:这不是法律或合同义务。
那么UAC呢?好吧,这取决于场景和系统配置。让我们看一些更明显和/或有趣的案例。[OP 提示:我认为您最感兴趣的是最后一种情况,所以请直接跳到底部。]
默认设置,管理员用户
在这种情况下,当您尝试执行某些需要管理员访问权限的任务时,您会看到“是/否”对话框。
[我相信]有一个安全保证,没有应用程序(还没有管理员权限)可以代表您按“是”,并且对话框提供的有关正在启动的应用程序的信息是准确的。[附带条件:我不完全确定有关潜在恶意可访问性应用程序的故事。任何人都可以对此进行扩展吗?]
但在这种情况下,这一切都无关紧要,因为没有任何安全保证可以保证应用程序在不打开对话框的情况下无法获得管理员权限,实际上有很多众所周知的技术可以做到这一点。 更多在这里。
始终通知,管理员用户
如果您打开了“始终通知”UAC 设置,那么 [我相信] 有一个安全保证,即任何应用程序都无法通过 UAC 直接获得管理员访问权限,而不会出现对话框。 更多在这里。
...但仍然不能保证应用程序将以您期望的方式使用管理员权限。您可以查看正在启动的应用程序,但您有责任检查它是否是您所期望的。此外,默认情况下您看不到命令行,只有在您询问更多详细信息时;如果您信任的应用程序具有危险的命令行选项,则恶意应用程序可能会利用它,希望您不会注意到它们。
...如果任何第三方应用程序以管理员权限运行,它们可能存在允许恶意应用程序控制的漏洞。Windows 确实采取了一些措施来减轻这种风险,例如,您不能只使用普通的旧粉碎攻击,但它不能消除一个应用程序可能用来攻击另一个应用程序的所有可能方法。
...此外,在典型的企业环境中,您可以利用 UAC 不在网络上运行的事实,如Joshua 的回答中所述。我怀疑这种攻击比听起来更容易、更实用。
在实践中,这些问题极大地限制了这种安全保证的有效性,即使在 Windows 本身没有任何安全漏洞的情况下也是如此。
(此类安全漏洞已经存在;例如,Joshua 指出,在某一时刻,任务计划程序允许管理员用户创建提升的任务,而无需首先要求提升。一旦发现,它们很可能最终会被修补,但它们也是可能被认为是低优先级。)
[当前的用户注册表配置单元为恶意应用程序攻击提升的应用程序提供了巨大的攻击面,特别是如果您可以在提升的应用程序启动之前进行更改。有谁知道这方面是否有任何标准技术?最明显的方法是将恶意 DLL 放到用户的 PATH 中,我怀疑许多应用程序都容易受到这种简单的攻击。]
具有管理员密码的非管理员用户
这是登录用户帐户不是管理员但用户知道管理员密码的情况。前面的所有警告都适用。
...另外,恶意应用程序可能会模仿对话框来捕获您的密码,正如迈克尔的回答中已经讨论的那样。有一些缓解措施使程序难以使用管理员密码来获得管理员权限,但我的理解是这不是安全保证。[一旦您获得管理员密码,任何人都可以确认是否有已知的提升方式?例如,也许通过任务计划程序?在很多情况下,我想这是没有实际意义的,因为一旦你获得了密码,你就可以使用它来 RDP 或从另一台机器访问 C$ 共享或其他任何东西。]
这里唯一真正安全的方法是在出现提示时永远不要提供管理员密码;相反,在必要时切换用户并使用您的管理员帐户登录。当然,这已经足够痛苦了,只有最严格的系统管理员才会始终如一地坚持下去。
...显然,如果您这样做,您还需要在其他方面遵循良好的卫生习惯,例如,您不要在非管理员帐户中下载安装程序,然后从您的管理员帐户运行它。但是,您也不应该真的从您的管理员帐户运行 Web 浏览器,所以 catch-22。
没有管理员密码的非管理员用户
我们在这里站得更稳。 有一个明确的安全保证,即非管理员用户将无法在不提供管理员密码的情况下以管理员权限运行应用程序。 这对 UAC 来说并不新鲜,但 UAC 也不会取消保证。
违反此保证的漏洞通常称为本地特权提升漏洞。在大多数情况下,它们的优先级低于允许远程攻击的漏洞,但 Microsoft 通常会合理及时地修补它们。
[好吧,这取决于你对“合理”的定义。:-)]
我认为这个问题需要具体而彻底地解决:
但是对于必须在 UAC 提示时输入密码的非管理员用户呢?那么,UAC 真的是一个安全屏障吗?
让用户在 UAC 提示符中输入密码实际上会降低系统整体的安全性!
为什么?
当前 [更新:似乎在较新的 Windows 10 版本中已修复,但应仔细检查,因为所涉及的 API 不等同于在屏幕上按下按钮] UAC 绕过是计划任务 -> 创建任务 -> [X] 运行于最高权限 + [X] 不存储用户密码 -> 运行任务
如果微软要花很长时间来关闭它,那么之前的 UAC 绕过就会等待:远程桌面到自己;呈现真实的登录屏幕 -> 等待用户输入密码 -> 使用自动化在 UAC 提升提示上单击“是”。这一次,防止低权限应用程序操纵高权限应用程序的强制授权控制检查不起作用,因为 RDP 服务器处于足够高的级别。
no-RDP-loopback 检查在客户端而不是服务器中。我已经设法使用修改后的客户端连接到本地主机。
UAC 在专业环境中没有安全边界。
此外,一旦加入域,如果当前用户可以在两台当前开机的机器上提升为管理员,那么 UAC 就会有另一个绕过。根据文档,即使没有加入域,这也有效,但我无法让它为本地帐户工作,因此文档可能是错误的。机器 2 上的机器 1 的 OpenSecurityManager()。机器 2 不知道来自机器 1 的会话没有提升并且网络登录总是被提升。创建执行“sc \machine1 create ... binPath =”的新服务;启动它; 等待启动失败;删除服务;创建执行“sc \machine1 start ...”的新服务;并且您的二进制文件现在具有本地系统。