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) 遗漏。
标签: