CVE-2013-3893漏洞分析与Fix it临时解决方案

本文详细分析了CVE-2013-3893漏洞的利用机制,包括Use After Free漏洞在IE浏览器中的触发方式、ASLR绕过技术,并提供了Microsoft发布的Fix it临时解决方案及EMET 4.0防护配置指南。

CVE-2013-3893: Fix it临时解决方案可用

今天,我们发布了一个Fix it临时解决方案工具,用于解决一个新的IE漏洞,该漏洞曾在极其有限的目标攻击中被积极利用。此Fix it在mshtml.dll加载到内存时进行微小修改以解决漏洞。该Fix it临时解决方案工具链接自描述此问题的安全公告2887505。我们分析的漏洞利用仅适用于运行Internet Explorer 8或9的Windows XP或Windows 7。以下是应用和卸载Fix it解决方案的链接:

漏洞利用分析

该漏洞利用攻击了IE的HTML渲染引擎(mshtml.dll)中的Use After Free漏洞,并完全通过Javascript实现(不依赖Java、Flash等),但依赖于一个未启用ASLR(地址空间布局随机化)编译的Microsoft Office DLL。该DLL(hxds.dll)通过以下HTML href属性加载到IE中:

1
try { location.href = 'ms-help://' } catch (e) { }

此DLL在漏洞利用中的目的是通过提供内存中已知地址的可执行代码来绕过ASLR,以便使用硬编码的ROP(返回导向编程)链将包含shellcode(以Javascript字符串形式)的页面标记为可执行。这一点可以从ROP链使用的所有小工具都包含在hxds.dll中看出。

通过恶意格式化的Javascript字符串在低碎片堆上重新分配错误释放的内存,然后等待在释放的对象上调用虚函数,攻击者获得了对EIP(x86指令指针)的控制。攻击者使EIP指向堆中地址0x12121212附近,该地址包含一个ROP链。以下是ROP链的内容:

地址 数据 意义
12121212 51c3b376 //ret
…(多次重复ret指令)
1212127e 51c2046e //pop edi; ret
12121282 51be4a41 //xchg eax, esp; ret(栈旋转,从这里调用)
12121286 51c2046e //pop edi; ret
1212128a 51bd10b8 //hxds中的VirtualProtect IAT条目
1212128e 51c0e455 //mov eax, [edi]; pop edi; ret(将VirtualProtect地址移动到eax并浪费下一个ROP链链接)
12121292 51c3b376 //ret
12121296 51bd71f4 //push eax; ret(推送VirtualProtect地址,并返回到其中)
1212129a 121212da VirtualProtect后的返回地址(Shellcode)
1212129e 12121212 lpAddress(VirtualProtect(lpAddress = 12121212, dwSize = 00001000, flNewProtect = 00000040 = PAGE_EXECUTE_READWRITE, lpflOldProtect = 12120a0c))
121212a2 00001000 dwSize
121212a6 00000040 flNewProtect
121212aa 12120a0c lpflOldProtect

EMET 4.0防护

EMET 4.0可用于帮助防护我们分析的试图利用此漏洞的攻击。需要启用的具体缓解措施如下:

  • 强制ASLR
  • ROP
    • 启用MemProt
    • 启用Caller
    • 启用SimExecFlow
    • 启用StackPivot
  • 堆喷雾防护
    • 找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\EMET\iexplore.exe\ *\Internet Explorer\iexplore.exe的值
    • 打开HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\EMET\settings\VALUE_FROM_STEP_1\heap_pages
    • 0x12121212添加到列表中

FixIt解决方案

我们还构建了一个应用程序兼容性填充程序作为临时高级解决方案,以帮助防护试图利用此漏洞的攻击。

整个Fix it中仅有23个修补字节来缓解漏洞。这23个修补字节出现在两个位置:调用者以重定向执行到填充代码,以及填充代码本身。以下是在Windows 7上运行IE9时修补字节的解释及其作用:

修复前:

 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
mshtml!CDoc::SetMouseCapture [j:\win7\inetcore\mshtml\src\site\base\ipwnd.cxx @ 3211]:
8bff            mov     edi,edi
55              push    ebp
8bec            mov     ebp,esp
81eca0000000    sub     esp,0A0h
53              push    ebx
8b5d08          mov     ebx,dword ptr [ebp+8]
56              push    esi
57              push    edi
8bf9            mov     edi,ecx
f7879807000000100000 test dword ptr [edi+798h],1000h
8bf0            mov     esi,eax
0f855b000400    jne     mshtml!CDoc::SetMouseCapture+0x21 (6ca068f1)
85db            test    ebx,ebx
0f855a000400    jne     mshtml!CDoc::SetMouseCapture+0x32 (6ca068f8)
53              push    ebx
e88d2affff      call    mshtml!CDoc::ClearMouseCapture (6c9b9331)

mshtml!_NULL_IMPORT_DESCRIPTOR+0x420b:
0000            add     byte ptr [eax],al
0000            add     byte ptr [eax],al
0000            add     byte ptr [eax],al
0000            add     byte ptr [eax],al
0000            add     byte ptr [eax],al
0000            add     byte ptr [eax],al
0000            add     byte ptr [eax],al
0000            add     byte ptr [eax],al

修复后:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
mshtml!CDoc::SetMouseCapture [j:\win7\inetcore\mshtml\src\site\base\ipwnd.cxx @ 3211]:
8bff            mov     edi,edi
55              push    ebp
8bec            mov     ebp,esp
81eca0000000    sub     esp,0A0h
53              push    ebx
8b5d08          mov     ebx,dword ptr [ebp+8]
56              push    esi
57              push    edi
8bf9            mov     edi,ecx
f7879807000000100000 test dword ptr [edi+798h],1000h
8bf0            mov     esi,eax
0f855b000400    jne     mshtml!CDoc::SetMouseCapture+0x21 (6c6d68f1)
85db            test    ebx,ebx
0f856d8d6700    jne     mshtml!_NULL_IMPORT_DESCRIPTOR+0x420b (6cd0f60b)
53              push    ebx
e88d2affff      call    mshtml!CDoc::ClearMouseCapture (6c689331)

mshtml!_NULL_IMPORT_DESCRIPTOR+0x420b:
66f743260100    test    word ptr [ebx+26h],1
0f848d7298ff    je      mshtml!CDoc::SetMouseCapture+0x227 (6c6968a4)
e9dc729cff      jmp     mshtml!CDoc::SetMouseCapture+0x32 (6c6d68f8)

如您所见,NULL_IMPORT_DESCRIPTOR中的代码是此Fix it中实际阻止漏洞的逻辑。它全部依赖于检查C++对象中的一个标志。

这是一个复杂的Fix it构建,因为我们必须填充所有版本的所有变体,因此感谢所有帮助检查此案例的人!特别感谢IE团队的Michael Howell和Han Li帮助测试许多不同的IE版本/语言/操作系统组合,以及Elias Bachaalany关于地址空间中安全填充代码位置的建议。

  • Neil Sikka, MSRC Engineering @neilsikka
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计