假设您有一台运行各种敏感服务的 Windows Server 机器。假设其中一项服务非常简单,在文本文件中维护少量信息,但由于编码不当,存在(未知的)任意代码执行漏洞。
是否可以为该服务设置一个用户帐户,这样如果黑客成功利用此漏洞,他们可能造成的最大破坏就是读/写此文本文件,搞砸此特定服务,并可能列出文件C:\Windows,但没有别的?
天真的尝试这样做会立即遇到问题:“用户”中的任何人都可以写入 C:\一个非常糟糕的主意。
或者如果攻击者可以执行任意代码,无论使用哪个用户帐户,游戏都已经输了?我一直认为 Windows NT 的后代可以包含它,但现在我已经尝试过了,我不再那么确定了。
默认情况下,用户无法写入
C:\Program Files
. 他们有读取、列出文件夹内容以及读取和执行。如果您不是这种情况,则有人或某物修改了这些权限。受限用户可以读取文件系统的大部分内容,但只能写入明确授予其访问权限的位置,例如其用户配置文件。
如果您仅对那个文本文件授予修改权限,则该帐户唯一能够在文件系统上写入的就是该文件,以及其配置文件目录(我的文档等)中的内容,这些内容应该无关紧要。
如果您的内置用户组对整个文件系统具有修改权限,那么这是非标准的。开箱即用,有限的用户帐户可以造成很小的损害。
如果运行其进程的服务帐户的权限受到限制,则任意代码执行错误本身并不是特别无害。问题是那里有太多的特权升级漏洞,一旦你可以任意执行代码,你就可以执行一些可以让你突破特权级别的东西。就其本身而言,任意代码执行并不是什么大问题,但在现实世界中,它几乎总是与特权升级漏洞捆绑在一起。所以,是的,我会担心。
这里有一些非常有趣的答案。
从实证的角度来看,在我手下有许多渗透后测试“要修复的东西”列表,我实际上会说微软近年来在提供工具和选项来很好地强化服务器方面做得很好。
当然,MS 仍在对他们的代码进行模糊测试,他们和社区继续发现远程执行/权限提升漏洞,但我不得不说,与其他一些供应商(SonicWall、Tivoli 和我想到了甲骨文)。
我的建议是:
重要的是要记住,没有完全安全的操作系统、应用程序或网络这样的东西。这一切都与预防层有关,并在事情看起来不同时进行识别。也不要在入侵检测上出卖,当然,除非您 a) 容易受到炒作推销的影响,b) 您手上有很多空闲时间,并且 c) 有很多空闲 $$$。
最后,当今最狡猾的“攻击”与破坏无关;恰恰相反。重点(和资金!)已转向数据泄露。
在 Linux 世界中,我们会使用 SELinux或其他强制访问控制机制来减轻这种威胁。
Windows 没有那么强大的功能,但自 Vista/2008 以来,它确实具有您可以使用的基本完整性机制。(虽然,这有一个相当高的学习曲线,并且完整地解释它需要比这里允许的更多的长度。)
我认为最好的短期缓解措施是将服务隔离在虚拟机中。
如果“执行任意代码”意味着进程可以创建目录,则它们可能会在当前目录、服务帐户的用户配置文件目录、C:\ 驱动器的根目录中创建目录,或者只是搜索一个目录它可以在哪里创建目录。
上次我查看时,Windows 通常授予在 C: 根目录中创建目录的权限。由于您需要查看高级属性页面或使用 ICACLS 获取完整的权限列表,因此您可能不会在 gui 中看到它。
即使 C:\ 根目录权限已被强化,搜索 C:\ 上的所有目录并测试权限允许服务帐户创建目录的目录也是微不足道的。很有可能会有一个。
如果进程利用可以在 C: 的某处创建目录,那么通过创建数百万或数十亿个空目录/子目录来禁用系统是相当简单的。
空目录是零字节,因此不受配额限制。这些目录也直接存储在 MFT 中(由于它们的体积小),因此即使可以停止进程并删除目录,MFT 也实际上是垃圾 - 太大和/或碎片化以至于系统可能需要恢复从备份。
对所有进程使用 DEP。它会阻止大多数人,但是有很多漏洞无论如何都可以击败 DEP。
必须从头开始防止滥用 - 没有必要对攻击面很大的不安全服务器上的帐户这样做
所以;
1)确保服务器已打补丁。
2)可以使用SCW(Security Config Wizard)来加固服务器。它将比大多数管理员做得更快更好。
它允许您撤消所做的更改,但它只会撤消一步。所以如果你运行它,锁定东西然后再次运行它(即如果你错过了什么)然后你发现有东西坏了,如果它在第一次锁定期间坏了,你不能轻易撤消它(必须做它手动)
因此,在运行并应用它之后,彻底测试功能。
3)然后,确保您使用的帐户不是管理员、超级用户等,并且他们只有 NTFS 权限来完成他们需要做的最少的事情——没有别的。
4) 您还可以使用本地安全策略(或域策略,如果服务器是域成员)来锁定 GUI 的其他方面。
您当然可以尝试创建一个安全用户,类似于无法登录的 Windows 附带的用户,并且只能访问机器上的某些文件。缺点是特权升级漏洞可能会根据情况对该用户起作用。
在 linux 中,我们将这样的 chroot 监狱进程和服务作为安全缓解策略的一部分。我不是 Windows 专家,但您将如何在 Windows 中执行此操作?
要将服务放入沙箱,您可以做的一件事是在 VM 中运行它。 Virtualbox是我的选择,因为如果你愿意,你甚至可以将它安装在同一个盒子上,并让它从服务器开始,甚至是无头的,所以它几乎可以像服务一样运行。它也是免费的。漏洞很难逃脱您的 VM。这种方法的缺点是您将运行另一个完整的窗口实例,它本身需要保持最新并且会消耗资源。
另一件可行的事情是使用专用的沙盒程序,例如sandboxie,它可以将任何进程沙盒化,以使其在受到威胁时更难逃脱。