详细了解Windows Vista内核的安全性( 五 )


只有具有动态重新定位标记的映像(包括所有 Windows Vista DLL 和可执行文件)才能重新定位 , 因为移动原有映像可能会中断开发人员对其映像加载位置所做的内部假设 。Visual Studio 2005 SP1 增加了对设置标记的支持 , 以便第三方开发人员可以充分利用 ASLR 。将 DLL 加载地址随机分布到 256 个位置之一 , 并不会使恶意软件猜不出正确的 API 位置 , 但是它会严重限制网络蠕虫传播的速度 , 并且可以阻止仅有一次机会感染系统的恶意软件以可靠地运行 。此外 , ASLR 的重新定位策略的第二个好处是 , 地址空间压缩比在以前的 Windows 版本上的更加紧密 , 为连续内存分配创建更大的可用内存区域 , 减少内存管理分配以跟踪地址空间布局的页表数 , 以及最小化转换旁路缓冲器 (TLB) 遗漏 。
8.服务安全性改进
Windows 服务成为理想的恶意软件目标 。许多服务都提供通过网络访问其功能 , 这很可能会暴露远程可利用的访问系统的机会 , 而大多数服务运行都使用比标准用户帐户更多的权限 , 如果它们被恶意软件利用 , 则会提供在本地系统上提升权限的机会 。因此 , Windows 以在 Windows XP SP2 中所做的更改为始不断完善 , 将权限和对指定服务的访问权限降为仅其角色需要的权限 。例如 , Windows XP SP2 引入了本地服务和网络服务帐户(仅包括服务以前一直运行的本地系统帐户权限的子集) 。这样可以在利用服务时最小化攻击者获取的访问权限 。通过使用像 Sysinternals 提供的 Process Explorer 一样的工具 , 在两个不同的引导会话中比较进程的 DLL 加载地址 , 您可以很容易看到 ASLR 的效果 。在从两个不同会话截取的这两个屏幕快照中 , Ntdll.dll 首先在地址 0x77A30000、然后在地址 0x77750000 加载到 Explorer 。在以前的文章中 , 就介绍了服务如何在其会话中与用户帐户分开运行 , 但是 Windows Vista 还通过进一步降低分配给大多数服务对文件、注册表项及防火墙端口的权限和访问权限 , 以扩大其最小权限原则的使用 。Windows Vista 为每种服务定义了一组唯一的新帐户 , 称为服务安全标识符 (SID) 。服务可以对其资源设置权限 , 这样只有其服务 SID 拥有访问权限 , 避免在服务出现安全漏洞时以相同用户帐户运行的其他服务拥有访问权限 。您可以使用 sc showsid 命令后接服务名称来查看服务的 SID , 如图 8 所示 。
服务 SID 保护对特定服务所拥有资源的访问权限 , 但默认情况下 , 服务对其运行的用户帐户可以访问的所有对象仍有访问权限 。例如 , 在“本地服务”帐户中运行的服务可能无法访问在不同进程(该进程使用参考服务 SID 的权限保护其对象)中以“本地服务”运行的另一服务创建的资源;但是 , 它仍可以读取和写入“本地服务”(以及“本地服务”所属的任何组 , 如“服务组”)有权访问的任何对象 。因此 , Windows Vista 引入了称为限制写入服务的新受限服务类型 , 可让服务仅对其服务 SID、Everyone 组及分配到登录会话的 SID 可访问的对象允许写入访问权限 。为了实现这一点 , 它会使用重新引入 Windows 2000 的受限 SID 类型 。当打开对象的进程是限制写入服务时 , 访问 - 检查算法会发生变化 , 这样尚未以受限和非受限方式分配到进程的 SID 就无法用来为进程授予对象的写入权限 。您可以使用以下命令查看服务是否受限:sc qsidtype [service] 另一个变化是让服务更容易阻止在相同帐户中运行的其他服务对其创建的服务拥有访问权限 。在以前的 Windows 版本中 , 对象的创建者也是对象的所有者 , 而且所有者能够读取和更改其对象的权限 , 允许其对自己对象的完全访问权限 。Windows Vista 引入了新的所有者权限 SID , 如果在对象的权限中存在 SID , 则 SID 可以限制所有者对其对象的访问权限 , 甚至会删除设置和查询权限的权利 。

推荐阅读