安全建议2488013新增临时修复方案
我们已更新针对公开披露的Internet Explorer CSS漏洞的安全建议2488013。更新内容显示:目前野外已出现利用该漏洞的有限攻击活动。该建议同时包含新的临时修复方案,可在安全更新发布前为计算机提供保护。此修复方案不同于我们常规推荐的解决方案,因此我们在此提供更详细的技术说明。
漏洞回顾
该漏洞要求攻击者提供包含通过@import命令自引用的CSS样式表。当Internet Explorer尝试加载此递归样式表时,会造成内存损坏,可能导致任意代码执行。由于无法选择性禁用此功能,目前最佳解决方案是启用EMET来阻止已知攻击向量的成功利用。
新修复方案
该修复方案为MSI安装包(Microsoft “FixIt”),利用Windows应用程序兼容性工具包,在每次Internet Explorer加载MSHTML.DLL时进行微小修改。此修改使IE在检测到CSS样式表与其加载源具有相同URL时拒绝导入。简言之,修复方案会插入检查机制,在检测到递归加载样式表时中止加载过程。
重要提示:只有在安装最新安全更新(包括2010年12月14日发布的MS10-090)后,此修复方案才能生效。
安装链接:http://download.microsoft.com/download/E/5/6/E56904FD-3370-479D-B14A-E5481222C59C/MicrosoftFixit50591.msi
卸载链接:http://download.microsoft.com/download/3/3/3/33346329-840F-4B9F-B54E-9AE1114EA331/MicrosoftFixit50592.msi
修复方案实现原理
Internet Explorer使用mshtml!CStyleSheet类实例表示CSS样式表。CStylesheet Create()方法在每个样式表导入时被调用,可访问父/子样式表的URL。为获取子样式表绝对URL,原代码调用ExpandUrlWithBaseUrl函数:
|
|
修复方案将此函数调用替换为自定义函数,新函数执行以下操作:
- 调用ExpandUrlWithBaseUrl()转换相对URL为绝对URL
- 若调用失败则返回错误码
- 调用_wcsicmp()比较父子样式表绝对URL
- 若相同则返回80004005h错误码,不同则返回0
新函数通过重写进程关闭时清理调试资源的函数实现:将其首条指令改为ret,使正常调用直接返回,然后实现修复检查逻辑。
修复后的代码变化
应用修复后,CStyleSheet::Create()相关代码变为:
|
|
DeinitScriptDebugging()函数被修改为:
|
|
安全验证机制
修复方案在修改MSHTML.DLL前执行以下检查:
- 文件版本验证
- 校验和验证
- 待替换汇编指令精确匹配 确保不会错误应用到其他版本MSHTML.DLL,且修改结果符合预期。未通过所有检查的DLL将不会被修改。
性能影响与部署建议
应用此修复方案会使IE启动时间增加约150毫秒。安装最终安全更新后应卸载此修复方案。建议部署前在企业内部业务应用程序中进行测试,最终安全更新将经过全面测试并适合广泛部署。
CSS样式表循环处理
经测试确认,A.css导入B.css再导入A.css的循环配置不会触发漏洞,因此仅需检查子样式表与父样式表绝对URL不同即可有效阻断攻击。
本文提供信息"按原样"提供,不提供任何担保,也不授予任何权利。