微软发布IE8漏洞缓解工具Fix it详解

微软发布针对Internet Explorer 8漏洞的Fix it解决方案,通过运行时修改mshtml.dll内存布局来阻止攻击。文章详细介绍了漏洞原理、Fix it工作机制以及EMET缓解措施,并预告即将发布的完整安全更新。

Microsoft “Fix it” available to mitigate Internet Explorer 8 vulnerability

今天,我们发布了"Microsoft Fix it"解决方案,用于阻止利用安全公告2847140中描述的Internet Explorer 8(IE8)漏洞的攻击。这个经过代码签名、易于下载和安装的Fix it包使用Windows应用程序兼容性工具包,在每次加载IE时对mshtml.dll进行运行时的小幅修改。以下是应用和卸载Fix it解决方案的链接:

[应用Fix it](Microsoft Fix it 50992)
[卸载Fix it](Microsoft Fix it 50991)

在本博客文章中,我们将描述以下内容:

  • 关于全面安全更新进展的更多信息
  • 关于破坏利用此漏洞的攻击的变通选项的更多信息
  • 关于Fix it解决方案如何工作的更多信息

全面更新正在测试中

我们已经构建了一个解决此漏洞的全面安全更新,目前正在全天候测试中。一旦测试确认其准备好向所有客户广泛发布,我们将立即发布。明天,请访问我们的月度提前通知服务(ANS)博客,了解5月安全公告周期中发布的安全更新的详细信息。

变通选项

如安全公告2847140所列并经外部确认,Microsoft的增强缓解体验工具包(EMET)是针对我们看到的野外攻击和公共渗透测试框架的良好变通选项。针对Windows Vista和Windows 7的渗透测试框架中的利用版本利用Java 6安装的DLL模块绕过ASLR。EMET的强制ASLR功能通过在IE8加载此DLL时强制实施ASLR随机化来阻止此利用。目前,我们知道的野外攻击数量有限,它们仅针对Windows XP上的IE8。攻击者当前使用的这些利用也被EMET的EAF缓解以及EMET 3.5 TP和4.0 Beta的反ROP缓解措施阻止。第一个ROP阶段触发EMET的StackPointer、CallerCheck和SimExecFlow检查。已经使用EMET的企业可以分析其机器日志,以调查EMET缓解措施报告的此利用的可能利用事件。

为了提供更强的保护级别,我们建议在全面安全更新可用之前安装Fix it解决方案。Fix it应用于mshtml加载的二进制文件的更改,类似于IE团队全面安全更新应用的更改。有关漏洞的更多信息以及Fix it如何阻止它,可以在下一节中找到。

Fix it如何"修复"易受攻击的代码

该漏洞是由于页面布局问题暴露的,当Internet Explorer 8尝试计算不再在DOM树中的节点的布局信息时触发。该问题是由未正确清理并包含对页面元素的悬空指针的布局结构引起的。当布局更新时,浏览器由于访问释放的内存而崩溃。清理死链接的代码已经存在,但它在访问布局结构之后运行。解决方案是在访问布局结构之前移动清理逻辑。

基于appcompat shim的"Fix it"保护工具执行与Internet Explorer团队提供的修复完全相同的操作。这仍然是一个变通方法,但与其他变通方法相比更精确,因为它阻止了漏洞的根本原因。shim在内存中修改mshtml!CBlockContainerBlock::BuildBlockContainer函数,以强制代码流更改,从而在访问之前正确清理布局结构:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
InjectLoopHere:            CODE XREF: CBlockContainerBlock::BuildBlockContainer+103

match:74CC08DC 8B 45 08          mov     eax, [ebp+arg_0]     Inject code here!!
match:74CC08DF 8B 40 08          mov     eax, [eax+8]
patch:74CC08DC E9 ?? ?? ?? ??    jmp     WhilepNextExistingBlock2
patch:74CC08E1 90                nop

ResumeExecution:
.text:74CC08E2 C1 E8 0A          shr     eax, 0Ah
.text:74CC08E5 A8 01             test    al, 1
.text:74CC08E7 0F 85 FB 8E FD FF jnz     loc_74C997E8

WhilepNextExistingBlock:   CODE XREF: CBlockContainerBlock::BuildBlockContainer-6C6CE
.text:74CC094E 39 7D F4          cmp     [ebp+pNextExistingBlock], edi
.text:74CC0951 0F 85 38 36 F9 FF jnz     LoopToRelocate

LoopToRelocate:            CODE XREF: CBlockContainerBlock::BuildBlockContainer+2DF
.text:74C53F8F FF 75 F4          push    [ebp+pNextExistingBlock]
.text:74C53F92 8B 4D 0C          mov     ecx, [ebp+arg_4]
.text:74C53F95 FF 75 08          push    [ebp+arg_0]
.text:74C53F98 8D 55 F4          lea     edx, [ebp+pNextExistingBlock]
.text:74C53F9B E8 2B 64 0A 00    call    CLayoutBlock::RemoveChild ; layout structure cleanup
.text:74C53FA0 8B F0             mov     esi, eax
.text:74C53FA2 3B F7             cmp     esi, edi

match:74C53FA4 0F 8D A4 C9 06 00 jge     WhilepNextExistingBlock
patch:74C53FA4 E9 ?? ?? ?? ??    jmp     CLOBBER_NOPS_PATCH_BYTES
patch:74C53FA9 90                nop

.text:74C53FAA E9 25 58 04 00    jmp     CHK_FAIL
.text:74C53FAA                   END OF FUNCTION CHUNK CBlockContainerBlock::BuildBlockContainer

CLOBBER_NOPS_PATCH_BYTES:
patch:???????? 7D 07             jge     WhilepNextExistingBlock3
patch:???????? E9 ?? ?? ?? ??    jmp     CHK_FAIL
WhilepNextExistingBlock2:
patch:???????? 33 FF             xor     edi, edi
WhilepNextExistingBlock3:
patch:???????? 39 7D F4          cmp     [ebp+pNextExistingBlock], edi
patch:???????? 0F 85 ?? ?? ?? ?? jnz     LoopToRelocate
patch:???????? 8B 45 08          mov     eax, [ebp+arg_0]
patch:???????? 8B 40 08          mov     eax, [eax+8]
patch:???????? E9 ?? ?? ?? ??    jmp     ResumeExecution

“Fix it"解决方案仅适用于已应用MS13-028:Internet Explorer累积安全更新:2013年4月9日的x86版本Internet Explorer 8。应用此变通方法不会干扰将解决此问题的最终安全更新的安装。但是,应用变通方法会对Internet Explorer的启动时间产生很小的影响。因此,在应用尚未发布的最终安全更新后,您应该卸载Fix it变通方法,因为它不再需要。

结论

我们想重申,只有IE8容易受到此问题的影响,并且我们目前只看到有限的攻击。我们正在努力开发全面的安全更新。明天,请查看我们的月度提前通知服务(ANS)博客,了解5月安全公告周期中发布的安全更新的详细信息。同时,如有任何关于上述内容的问题,请随时与我们联系。您可以通过switech@microsoft.com或secure@microsoft.com与我们联系。

特别感谢Elia Florio分析此漏洞的利用工作。

  • Cristian Craioveanu和Jonathan Ness,MSRC工程团队
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计