了解Windows Vista内核的安全性( 六 )


7.地址空间加载随机化
不管采取什么措施,如数据执行保护和增强的编译器错误检查,恶意软件作者都会继续找到缓冲区溢出漏洞,这些漏洞使他们能够感染面向网络的进程(如 Internet Explorer、Windows 服务及第三方应用程序),获得进入系统的立足点 。不过,在设法感染进程后,他们必须使用 Windows API 通过修改用户或系统配置设置来完成读取用户数据或建立永久存在的最终目的 。
使用 DLL 导出的 API 入口点连接应用程序,通常由操作系统加载器处理,但是这些类型的恶意软件感染不会从加载器的服务中受益 。恶意软件在以前的 Windows 版本中还没有出现过此类问题,因为对于任何特定的 Windows 版本,系统可执行映像和 DLL 总在同一个位置加载,让恶意软件假定 API 驻留在固定的地址 。
Windows Vista 地址空间加载随机化 (ASLR) 功能使恶意软件不可能知道 API 的位置,方法是通过每次系统启动时在不同位置加载系统 DLL 和可执行文件 。在启动进程早期,内存管理器会从用户模式地址空间顶部 16MB 区域的 256 个 64KB 对齐地址中随机选取一个作为 DLL 映像加载偏差 。由于在映像标头中有新的动态重新定位标记的 DLL 加载到进程中,因此内存管理器会从映像加载偏差地址开始并继续将 DLL 选取到内存中 。
具有标记组的可执行文件会得到类似的处理,在存储在其映像标头中的 16MB 基本加载地址内以随机的 64KB 对齐点加载 。此外,如果使用给定的 DLL 或可执行文件的所有进程卸载后再次加载它,内存管理器会重新选择一个随机的加载位置 。图 7 所示为一个 32 位 Windows Vista 系统的示例地址空间布局,包括 ASLR 选取映像加载偏差和可执行文件加载地址的区域 。
只有具有动态重新定位标记的映像(包括所有 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 所示 。

推荐阅读