当前位置:安全资讯 >> 全文

微软竟然手动修复了存在17年之久的Office组件漏洞

发布时间:2017-11-21 16:15 标签: 微软,手动修复,17年
分享到 0

ACROS公司的安全研究人员表示,微软工程师似乎手动修复了Office中一个存在17年之久的漏洞,而不是修改易受攻击组件的源代码。

漏洞存在于“公式编辑器”中

这个漏洞的编号是CVE-2017-11882,微软在1114日的“补丁星期二”安全更新中予以修复。该问题是由Embedi安全研究人员在微软的“公式编辑器 (EquationEditor)(EQNEDT32.EXE) 工具中发现的,该工具自从2009119日在Office组件中推出后就未曾发生改变。

疑似工程师手动修复漏洞

ACROS Secrutiy公司的0patch团队在分析打上补丁的文件后发现它跟原始文件几乎一模一样,虽然新的编译日期是2017.8.14.0。如果微软对源码进行了必要的更正并重构二进制的话,这种情况是不可能发生的。然而,手动修复这个二进制可执行文件的话就另当别论了,而研究人员认为公式编辑器正是通过手动修复的。

研究人员指出,“真的,就是‘手动’原本的意思,一些技术强大的微软员工或承包商逆向了EQNEDT32.EXE,找到了有缺陷的代码,然后手动用更好的代码覆盖了现有的指令(确保仅使用之前原始指令占用的空间)。”

微软拒绝就如何修复漏洞的问题置评。

但我们可通过比对原始和打补丁文件版本来找到手动修复的证据。研究人员指出,没有一个C/C++编译器“会在重构了一个修改的源代码后,把500+KB大小的可执行文件中所有的函数都放在同样的模块地址中。”

这两个文件的BinDiff结果显示,所有的EA初始值和所匹配函数的从属值相似,甚至被修复的函数在两个EQNEDT32.EXE版本中的地址都一样。

这个漏洞在于公式编辑器不会检查目标缓冲对于用户提供的字符来说是否足够大。因此,如果通过Equation对象提供的字体名称足够长,那么就可能会引发缓冲溢出问题。

现在,添加到该函数的一个附加参数制定了目标缓冲区的长度,当达到目标缓冲区长度时,字符复制循环的原始逻辑也会结束以阻止缓冲溢出问题的发生。

研究人员指出,除了增加上述提到的检查缓冲长度内容外,修复了这个函数的工程师还设法将其缩短了14个字节的长度。工程师似乎还修复了这个组件中的其它函数,很可能是因为他们发现了其它的漏洞,因此一并修复。

修复版本中的两个函数会在内联memcpy操作之前注入边界检查。研究人员认为,补丁工程师只用一个指令(而非两个指令)来执行检查,因此代码在逻辑上保持一致,同时工程师还释放了用于注入检查的空间和零终止复制的字符串。

研究人员表示,在这两个修改的函数中存在六个类似的长度检查,由于这些检查似乎跟修复CVE-2017-11882并不相关,因此微软可能是发现了一些其它的攻击向量也可能导致缓冲溢出问题因此决定主动打上补丁。

组件源代码或丢失?

研究人员指出,修复二进制格式的软件产品而非从更改的源代码基础上重构是非常困难的,不过微软工程师在修复公式编辑器方面确实做得非常出色。这个组件可能已经老久了,但还不得不确保跟包含旧格式共识的文档保持兼容性。

不过还有一个需要解答的问题是,为何微软选择维护二进制形式的组件,而不是修改源代码并重新编译呢?有人认为微软可能丢失了组件的源代码。

本文由360代码卫士编译,不代表360观点,转载请注明“转自360代码卫士www.codesafe.cn”。
原文链接:http://www.securityweek.com/microsoft-manually-patched-office-component-researchers
参与讨论,请先 登录 | 注册

用户评论