深入解析MS08-067:netapi32.dll安全更新的技术细节
今天,Microsoft发布了一个安全更新,修复了Windows Server Service中的一个远程代码执行漏洞。这是一个严重的漏洞,我们已经观察到有针对性的攻击利用此漏洞入侵了完全打补丁的Windows XP和Windows Server 2003计算机,因此我们“带外”发布了修复程序(不在常规的补丁星期二)。由于漏洞的严重性和威胁环境需要带外发布,您可能对您组织的风险级别、可以采取的保护措施以及为什么新平台风险较低有疑问。我们希望通过这篇博客文章回答这些问题。
哪些平台风险更高?
未经身份验证的攻击者可以远程触发此漏洞,在Windows Server 2000、Windows XP和Windows 2003上执行代码。默认情况下,Windows Vista和Windows Server 2008需要身份验证。但是,攻击者必须能够访问RPC接口才能利用漏洞。在默认的开箱即用场景中,由于Windows XP SP2、Windows Vista和Windows Server 2008默认启用了Windows防火墙,该接口无法访问。不幸的是,以下两个条件中的任何一个都会暴露RPC端点:
- Windows防火墙被禁用
- Windows防火墙已启用,但文件/打印机共享也已启用
在Windows Vista和Windows Server 2008上启用文件/打印机共享时,Windows防火墙仅将RPC接口暴露给共享的网络类型。例如,如果打印机在“私有”网络类型上共享,当计算机切换到“公共”网络类型时,Windows防火墙将阻止传入的RPC连接。如果您随后选择在“公共”网络类型上共享打印机,Vista和Windows Server 2008将提示询问您是否真的要为所有公共网络启用“文件和打印机共享”。
有关文件/打印机共享的更多信息,请访问以下URL:
- 对于Vista:http://technet.microsoft.com/en-us/library/bb727037.aspx
- 对于XP:http://www.microsoft.com/windowsxp/using/security/learnmore/sp2firewall.mspx
下图更详细地说明了每个平台的风险。
更多关于缓解措施(DEP、ASLR、/GS)
在Vista和Windows Server 2008上,地址空间布局随机化(ASLR,http://blogs.msdn.com/michael_howard/archive/2006/05/26/address-space-layout-randomization-in-windows-vista.aspx)和数据执行保护(DEP,http://support.microsoft.com/kb/875352/EN-US/)的组合将使此漏洞的利用更加困难。ASLR将随机化模块、堆、栈、PEB、TEB等的基地址,使得返回到已知位置变得困难。已知的DEP绕过技术在这些平台上不适用,因为存在ASLR。
关于/GS保护,包含溢出缓冲区的函数的栈帧受到栈帧边界cookie的保护。然而,由于此特定漏洞的性质,利用代码能够利用另一个栈帧,该栈帧本不应受/GS安全cookie保护。/GS安全cookie仅为满足特定条件的函数发出。
UAC缓解措施即使提示被禁用也有效
如上所述,Windows Vista和Windows Server 2008默认需要身份验证。但RPC接口上的安全回调在较新的平台上没有改变。相反,Vista引入的UAC和完整性级别强化工作强制要求身份验证。匿名用户以“不受信任”的完整性级别连接,而命名管道至少需要“低”完整性级别。由于“不受信任”的完整性级别低于“低”完整性级别,访问检查失败。请注意,禁用UAC提示不会禁用完整性级别访问检查。换句话说,无论UAC提示是否启用,完整性级别检查都会执行。如果用户匿名连接,完整性级别检查将在Vista和Windows Server 2008上失败。有关更多信息,请参见http://msdn.microsoft.com/en-us/library/bb625963.aspx。
有一个非默认场景,其中非域加入的Windows Vista和Windows Server 2008可以被匿名利用。如果“密码保护共享”功能被禁用,匿名连接以“中”完整性级别进入。因为“中”完整性级别高于“低”完整性级别,完整性级别检查将成功。这将允许Windows Vista和Windows Server 2008被匿名利用。此功能可以通过Vista的网络共享中心在“共享和发现”部分禁用。
大多数外围防火墙将阻止来自组织外部的利用尝试
如果您位于过滤入站连接到TCP端口139和445的外围防火墙后面,您将无法从Internet访问。这是一个常见的家庭用户场景。在此场景中,只有您本地LAN中的机器能够利用此漏洞。
如何保护自己
您应尽快应用安全更新。这是保护自己的最佳方式。在测试更新和准备部署过程时,您可以选择使用安全公告中列出的一个或多个变通办法。(http://www.microsoft.com/technet/security/Bulletin/MS08-067.mspx)我们研究了几种选项,从关闭受影响的组件到限制对经过身份验证的用户的暴露。
还有一个变通选项我们没有包含在公告中,因为它不是受支持的场景。Server服务通过RPC命名管道暴露易受攻击的代码。命名管道的访问控制列表在netapi32.dll代码中指定。它可以为任何当前Windows会话更改。当Windows重新启动时,ACL将重置为默认值。但是,如果您在每次启动服务后更改ACL,匿名用户的攻击窗口将非常小。我们开发了一个简单的工具,可以删除命名管道访问控制列表中的ANONYMOUS访问控制条目。(请记住,这不是受支持的场景。)运行时如下所示:
|
|
我们已将chacl.c源代码附加在此博客文章的底部。
致谢
大量调查在短时间内投入此案例。我们想公开感谢所有工程师,他们帮助提供了这些困难技术问题的明确答案(有些需要数小时的调试)。
- SVRD团队的Bruce Dang、Fermin J. Serna、Damian Hasse、Andrew Roths和Jonathan Ness
- Microsoft安全工程科学团队的Matt Miller和其他成员
- 核心文件系统团队的David Kruse
- Windows网络团队的Tassaduq Basu和Raghu Gatta
- Windows内核团队的Jon Schwartz
- Windows持续工程团队的Carlos Trueba Salinas
发布内容“按原样”提供,不提供任何保证,也不授予任何权利。
chacl.c
(源代码内容未在提供的文本中显示,因此不翻译。)