影响 IE8 用户的新漏洞
此前,MSRC 发布了安全公告 2794220,提醒 IE6 至 IE8 的用户注意由该问题引起的针对性攻击,而 IE9 和 IE10 的用户是安全的。
有关漏洞和攻击的更多信息
在此特定漏洞中,IE 尝试引用并使用之前已释放的对象。针对此类漏洞的攻击通常由以下部分组成:
- 用于触发 IE 漏洞的 Javascript
- Heap Spray 或类似的内存攻击,以确保被访问的内存在其释放后仍是有用的
- 突破平台级别的ASLR防护
- 突破平台级别的DEP防护
我们已经分析了目前为止我们所发现的全部四个针对性攻击。这些攻击非常相似:
- 经过模糊处理用以出发漏洞的 Javascript
- 基于 Flash ActionScript 的 Heap Spray 攻击
- 使用 Java6 MSVCR71.DLL 或 Office 2007/2010 hxds.dll (https://www.greyhathacker.net/?p=585) 任意一个文件来绕过 ASLR
- 通过连接 ROP Gadgets(根据不同的选取方式,也可绕过 ASLR )来绕过 DEP
阻止代码执行的方法
抵御针对此漏洞攻击的最佳方式就是不含有易受攻击的代码。而 IE9 和 IE10 不包含易受攻击的代码。 IE 团队正夜以继日地工作,争取尽早开发出修复早期版本产品中漏洞的安全更新。不过,在该更新发布之前,使用 IE8 的用户可以通过引入更改来中断该漏洞的任何要素以阻止此类针对性攻击。具体而言:
- 禁用 Javascript 将阻止漏洞被触发。
- 禁用 Flash 将阻止基于 ActionScipt 的Heap Spray内存攻击(可导致释放的对象包含攻击代码)。
- 禁用 ms-help 协议句柄并且确保 Java6 被禁止运行,将阻止 ASLR 绕过攻击和相关的 ROP 链攻击。
另一种方法是安装 EMET 工具并启用它保护 IE,此方法将对您的浏览体验产生更小的影响。 EMET 的强制 ASLR 将阻止基于 Java6 和 hxds.dll 的 ASLR 绕过攻击。 EMET 的导出地址筛选 (EAF) 将阻止在我们已分析的针对性攻击中所使用的 shellcode。 EMET 3.5 的 ROP 迁移将阻止在我们已分析的针对性攻击中所使用的 Java6 和 hxds.dll ROP 链。
可用于测试的基于appcompat 填充码的保护工具
此外,我们正在开发基于 appcompat 填充码的 Fix It 保护工具,在全面更新发布之前可使用此工具来保护系统。该填充码无法修复漏洞,但它通过在运行时对 mshtml 进行两字节更改(将 je 指令替换为 jmp)来阻止漏洞被用于代码执行。为了解释此填充码可用于防止漏洞被利用的原因,我们需要对漏洞本身进行更详细的说明。
首先,以下是删除对象的位置:
mshtml!CBase::SubRelease+0x1b:
62088d79 8b01 mov eax,dword ptr [ecx] ds:0023:0b8d1520
={mshtml!CButton::`vftable' (61ec6678)}
62088d7b 6a01 push 1
62088d7d ff500c call dword ptr [eax+0Ch] ds:0023:61ec6684
={mshtml!CButton::`deleting
destructor' (622e6773)}
以下是重用对象的位置:
mshtml!CMarkup::OnLoadStatusDone+0x4bd:
62067d0a e8b07d0600 call mshtml!CElement::FindDefaultElem (620cfabf)
62067d0f 8bf8 mov edi,eax ; eax=0b8d1520
62067d11 3bfe cmp edi,esi
62067d13 0f85915d0000 jne mshtml!CMarkup::OnLoadStatusDone+0x4d0 (6206daaa) [br=1]
mshtml!CMarkup::OnLoadStatusDone+0x4d0:
6206daaa 8b07 mov eax,dword ptr [edi]
ds:0023:0b8d1520=0c0dab10 !!!
该序列将导致以下结果:
6206daac 57 push edi
6206daad 8975c4 mov dword ptr [ebp-3Ch],esi
6206dab0 8975d4 mov dword ptr [ebp-2Ch],esi
6206dab3 8975dc mov dword ptr [ebp-24h],esi
6206dab6 8975d8 mov dword ptr [ebp-28h],esi
6206dab9 8975e0 mov dword ptr [ebp-20h],esi
6206dabc 8975e4 mov dword ptr [ebp-1Ch],esi
6206dabf ff90dc000000 call dword ptr [eax+0DCh]
ds:0023:10ab0de8=????????
在此示例中,eax 由以下 Javascript 控制:
window.location = unescape("%u0d0c%u10abhttps://xxx_redacted_xxx");
我们开发了一个 appcompat 填充码,它在内存中将 mshtml!CElement::FindDefaultElem 函数修改为始终返回 NULL,这样一来,当 IE 遇到此攻击时,会发生安全的 IE 崩溃,而不是执行代码。由于该函数返回 NULL,因此不会访问任何已释放的对象,攻击将不会有效。在某些未默认选定默认窗体按钮的情况下,此填充码可能会带来负面影响。
此填充码当前作为一键式可部署的微软 Fix It 工具进行打包和代码签名。对于希望在 Fix It 工具的最终版本发布之前了解此工具机制的用户,我们今天发布了 sdb 本身以供测试。该填充码适用于最新版本的 IE 6至 8。该填充码在安装了早期版本或更高版本的 IE 的系统上不起作用。该填充码针对的是特定版本的 mshtml.dll,因此,在通过 Windows Update 安装正式更新时,该填充码将自行弃用。但是,建议在不再需要它时将其卸载,因为它在应用程序启动时会对性能产生轻微影响。
32 位和 64 位填充码已附于此博客文章中,也可以通过以下 URL 获得:
- mshtml_shim32.sdb (SHA1: 695750970F6595D247FA30775579BD22E034252B)
- mshtml_shim64.sdb (SHA1: 29444332522F8F06A88953071B3BA13C14FBD70A)
安装 |
卸载 |
在 32 位操作系统上运行: sdbinst –p mshtml_shim32.sdb 在 64 位操作系统上运行: sdbinst –p mshtml_shim32.sdb sdbinst –p mshtml_shim64.sdb |
在 32 位操作系统上运行: sdbinst –u mshtml_shim32.sdb 在 64 位操作系统上运行: sdbinst –u mshtml_shim32.sdb sdbinst –u mshtml_shim64.sdb |
检测针对IE9 和IE10 的(失败的)攻击尝试
对于攻击者而言,尝试攻击 IE9 和 IE10 的此漏洞是无效的。但是,精明的防御者可能会发现攻击者已利用此漏洞将其管理的 IE9 或 IE10 系统作为攻击目标。此漏洞触发的关键要素是:
window.location = unescape("%u0d0c%u10abhttps://www.example.com…)
在不存在此漏洞的系统中,该 Javascript 代码段会产生负面影响,即启动包含在Heap Spray攻击后被编码地址中的 HTTP GET 请求。网络日志或代理日志将揭示以下 HTTP 请求:
GET /exploit.html HTTP/1.1
GET /%E0%B4%8C%E1%82%ABhttps://www.example.com HTTP/1.1
如您所见,值 0x10AB0C0D 已采用 UTF8 进行编码并作为 HTTP 请求的一部分发送。实际攻击不会使用 example.com,并且 Heap Spray 地址攻击将因目标操作系统平台和攻击机制的不同而异,但如果您在代理日志中看到已编码的内存地址,您就应进行调查以确定您的组织是否已被列为攻击目标。
结论
需要重申的是,IE9 和 IE10 不会受到影响,并且我们目前只发现过针对性很强的攻击。我们正夜以继日地工作以便开发出完整的安全更新。如您所愿,我们即将发布可阻止易受攻击代码路径的 Fix It 工具。同时,如果您对上述内容有任何问题,请随时与我们联系。您可以通过 switech@microsoft.com 与我们联系。
特别感谢 Elia Florio 在分析针对此漏洞的攻击上所做的辛勤工作。
- Cristian Craioveanu 和 Jonathan Ness,
MSRC 工程部
更新:在本文中文版发布时,Fix It工具已经开发完毕,下载地址:https://support.microsoft.com/kb/2794220