深入解析Windows强制ASLR行为及其配置问题

本文详细解释了Windows强制地址空间布局随机化(ASLR)的工作原理,分析了CERT/CC发现的配置问题,并提供了启用强制ASLR和自底向上随机化的实用解决方案。

澄清强制ASLR的行为

上周,CERT/CC发布了一份公告,描述了在Windows 8及以上版本中使用Windows Defender Exploit Guard (WDEG)和EMET启用系统级强制地址空间布局随机化(ASLR)时观察到的一些意外行为。在本博客文章中,我们将解释CERT/CC遇到的配置问题,并描述启用所需行为的解决方法。简而言之,ASLR按预期工作,CERT/CC描述的配置问题仅影响EXE尚未选择加入ASLR的应用程序。该配置问题不是漏洞,不会产生额外风险,也不会削弱应用程序现有的安全态势。

简要历史:强制和自底向上ASLR

在之前的博客文章中,我们解释了ASLR在Windows上的工作原理。这个解释的绝大部分内容在最新版本的Windows 10 (1709)中仍然适用。为简洁起见,我们将重点介绍与CERT/CC观察到的行为相关的细节:

  • EXE/DLL的随机化是选择加入的。EXE/DLL通过使用/DYNAMICBASE标志链接来告诉操作系统它们与ASLR兼容。自Visual Studio 2010以来,此标志默认启用。选择加入模式是一个有意选择,以避免与现有应用程序产生重大兼容性问题。
  • 强制ASLR可用于强制重新定位未选择加入的EXE/DLL。在Windows 8中,我们引入了操作系统支持,用于在运行时强制重新定位未选择加入ASLR的EXE/DLL。此缓解措施可以系统范围或按进程启用。它通过在映射非ASLR EXE/DLL时强制基地址冲突来工作。当发生这种情况时,EXE/DLL的新基地址通过从地址空间底部开始搜索空闲区域来选择。
  • 自底向上随机化为自底向上分配提供熵。在Windows 8中,我们还引入了对自底向上随机化的选择加入支持,该支持为从地址空间底部开始搜索空闲区域的分配(例如,由于强制ASLR而重新定位的EXE/DLL)添加了熵到所选基地址。这提供了所有自底向上分配的隐式偏置,并且可以系统范围或按进程启用。
  • 仅当进程EXE选择加入ASLR时,自底向上随机化才默认启用。这是出于兼容性原因,因为EXE未选择加入ASLR(通过/DYNAMICBASE)的应用程序不一定期望其地址空间布局在一次执行到下一次执行之间发生变化。

下表试图通过考虑给定进程在不同配置中ASLR的行为来使这一点更容易理解:

配置 EXE选择加入ASLR 强制ASLR启用 自底向上随机化启用 行为
默认 EXE/DLL随机化,自底向上分配随机化
默认 无随机化
强制ASLR EXE/DLL重新定位到固定基地址,无自底向上随机化
强制ASLR + 自底向上随机化 EXE/DLL随机重新定位,自底向上分配随机化

CERT/CC观察到的行为

上述的一个结果是,由强制ASLR重新定位的映像的熵固有地依赖于为进程启用的自底向上随机化。然而,当进程EXE未选择加入ASLR时,自底向上随机化不会自动为进程启用(如上表中黄色突出显示)。这意味着还必须启用自底向上随机化才能将熵应用于由强制ASLR重新定位的映像。实际上,此问题仅影响管理员有意尝试为进程启用强制ASLR的场景,否则该进程不会完全受益于ASLR。

CERT/CC确实发现了Windows Defender Exploit Guard (WDEG)配置界面的一个问题,该问题当前阻止系统范围启用自底向上随机化。WDEG团队正在积极调查此事,并将相应地解决该问题。类似地,EMET不支持系统范围启用自底向上随机化,因此无法直接配置此设置。

幸运的是,此配置问题有可用的解决方法。

解决方法

对于那些希望为EXE未选择加入ASLR的进程启用强制ASLR和自底向上随机化的人,有两种解决方法。与所有非默认配置一样,这些更改可能会引入应用程序兼容性问题,应注意验证应用程序是否按预期工作。

通过系统范围注册表值直接启用强制ASLR和自底向上随机化

将以下内容保存到optin.reg并导入它将系统范围启用强制ASLR和自底向上随机化。这与WDEG和EMET通过其配置用户界面修改的注册表值相同。

1
2
3
4
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\kernel]
"MitigationOptions"=hex:00,01,01,00,00,00,00,00,00,00,00,00,00,00,00,00

注意,应用此注册表文件将覆盖已系统范围应用的任何其他缓解措施。要保留现有设置,可以手动编辑MitigationOptions注册表值,使得第2个字节设置为?1(其中?保留其值,例如01),第3个字节设置为?1。第二个字节对应于强制ASLR,第三个字节对应于自底向上ASLR。

使用WDEG或EMET通过程序特定配置启用强制ASLR和自底向上随机化

从WDEG,可以使用用户界面或命令行工具按程序启用缓解措施,如此处所述。启用强制映像随机化(强制ASLR)和随机化内存分配(自底向上ASLR)将启用预期行为,如下所示:

![WDEG配置界面截图显示强制ASLR和自底向上ASLR选项]

为什么在Windows 7上使用EMET时工作方式不同?

CERT/CC做出的一个值得注意的观察是,在Windows 7上通过EMET启用系统范围强制ASLR不会表现出上述行为。相反,EXE未选择加入自底向上ASLR的进程仍然被观察到是随机的。原因是Windows 7上的EMET使用与现在Windows 8及以上版本使用的设置不同的设置来启用强制ASLR。

EMET在Windows 7上使用的设置导致所有映像被视为已选择加入ASLR(例如,就像它们与/DYNAMICBASE链接一样)。因此,堆栈和堆的自底向上随机化隐式地为所有进程启用,作为它们被视为已选择加入ASLR的副作用,并且映像本身像其他ASLR映像一样被随机化。这与强制ASLR的行为不同,因为强制ASLR强制重新定位映像,并不将它们视为已选择加入ASLR。

不建议使用EMET在Windows 7上使用的设置,并且由于与之相关的应用程序兼容性风险,默认情况下有意隐藏。EMET用户必须通过导航到EMET的高级选项来暴露此设置,如此处所述

总结

总之,CERT/CC观察到的强制ASLR行为是设计使然,ASLR按预期工作。WDEG团队正在调查阻止系统范围启用自底向上ASLR的配置问题,并正在努力相应地解决它。此问题不会产生额外风险,因为它仅在尝试对现有版本的Windows应用非默认配置时发生。即使如此,有效的安全态势也不比默认提供的差,并且通过本文中描述的步骤可以轻松解决该问题。

Matt Miller Microsoft安全响应中心(MSRC)

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计