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解决方案的链接:
- 启用Fix it: Microsoft Fix it 51001
- 禁用Fix it: Microsoft Fix it 51002
漏洞利用分析
该漏洞利用攻击了IE的HTML渲染引擎(mshtml.dll)中的Use After Free漏洞,并完全通过Javascript实现(不依赖Java、Flash等),但依赖于一个未启用ASLR(地址空间布局随机化)编译的Microsoft Office DLL。该DLL(hxds.dll)通过以下HTML href属性加载到IE中:
|
|
此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时修补字节的解释及其作用:
修复前:
|
|
修复后:
|
|
如您所见,NULL_IMPORT_DESCRIPTOR中的代码是此Fix it中实际阻止漏洞的逻辑。它全部依赖于检查C++对象中的一个标志。
这是一个复杂的Fix it构建,因为我们必须填充所有版本的所有变体,因此感谢所有帮助检查此案例的人!特别感谢IE团队的Michael Howell和Han Li帮助测试许多不同的IE版本/语言/操作系统组合,以及Elias Bachaalany关于地址空间中安全填充代码位置的建议。
- Neil Sikka, MSRC Engineering @neilsikka