Microsoft Windows JET引擎Msrd3x代码执行漏洞

2018年9月,Fortinet FortiGuard实验室的研究人员发现了Windows JET引擎Msrd3x40的代码执行漏洞,根据Fortinet的披露流程研究人员将此漏洞报告给了微软。2019年1月,微软发布了安全公告,修复了该漏洞并将其标识为CVE-2019-0538。

易受攻击的DLL msrd3x40是支持从Windows 7到Windows 10所有Windows版本的组件。研究人员报告的漏洞可以使用精心设计的mdb文件触发。解析mdb PoC文件时,由于释放无效的堆地址而发生堆损坏,这可能导致代码执行漏洞。

分析

有两种方法可以重现此漏洞。

方法1

通过使用下面的参数用Excel oledb外部数据源加载PoC文件, Excel就会崩溃。该PoC文件可以位于任何本地或smb共享中。

Microsoft Windows JET引擎Msrd3x代码执行漏洞 Microsoft Windows JET引擎Msrd3x代码执行漏洞

输入PoC.mdb

方法2

在Windows 10中,可以在命令窗口中执行“cscript.exe trigger.vbs”。

Microsoft Windows JET引擎Msrd3x代码执行漏洞

trigger1.vbs脚本

以下是崩溃发生时的调用堆栈。

Microsoft Windows JET引擎Msrd3x代码执行漏洞

从上面的调用堆栈输出中,可以看到崩溃发生在函数“msrd3x40!free”中。可以通过以下命令启用cscript.exe整页堆:“gflags / p / enable cscript.exe / full”。

然后检查堆内存地址中堆内存释放失败的原因。内存处于MEM_RESERVE状态,如下所示:

Microsoft Windows JET引擎Msrd3x代码执行漏洞

通过逆向工程和跟踪,研究人员发现精心设计的mdb会错误地导致调用msrd3x40.dll,因为精心设计的mdb文件header版本字段为0,正常版本应为1。正常的mdb文件让程序进入header解密代码。但是,由于精心设计的mdb文件版本字段为0,就无法在msjet40.dll中完成header解密。

Microsoft Windows JET引擎Msrd3x代码执行漏洞

与精心制作的mdb版本进行比较并采用错误的分支

因此,精心设计的mdb文件将导致函数msjet40!ErrOpenForeignDatabase + 0x65并调用msrd3x40.dll!数据库。但处理正常的mdb文件不会调用msrd3x40.dll。因此,从这里开始,精心设计的mdb文件导致采用错误的代码分支。

Microsoft Windows JET引擎Msrd3x代码执行漏洞

错误版本导致msrd3x40.dll调用

DLL msrd3x40.dll解密精心设计的mdb header。偏移量0x42上的数据最初为0x86。在RC4解密mdb header之后,它使偏移量0x42处的数据变为0。然后会采用另一个代码分支,如下图所示:

Microsoft Windows JET引擎Msrd3x代码执行漏洞

到目前为止,仍然没有生成无效的堆内存地址。通过进一步的逆向工程和跟踪,研究人员发现用于生成无效堆内存的乘数因子来自以下代码:

Microsoft Windows JET引擎Msrd3x代码执行漏洞

运行上述Database :: AssignUserNumber函数后,关键乘法因子变量[esi + 6ch]等于0x100。

然后,研究人员跟踪无效堆内存生成,如下所示:

Microsoft Windows JET引擎Msrd3x代码执行漏洞

在msrd3x40.dll中生成的无效堆内存地址

在该函数中,[ecx + 6c]是先前获得的关键乘法因子0x100。在这里dx = 0x1。分配值后,[ecx+eax*2+194h]实际分配给字1,其中字1实际上是释放的无效存储器地址的低字。也就是说,在调用Database :: MarkCorrupt函数之前,目标对象堆指针是正确的。然而,在将值0x1字分配给上述存储器地址之后,就生成了无效堆指针。

从上面的分析,我们可以看到漏洞的根本原因是格式错误的mdb版本值0x00,它导致程序选择错误的分支,而且精心设计的mdb文件偏移量0x42是0x86,偏移量0x600 -0x7ff数据等于0,这使0x100值创建乘法因子。在下一个函数调用中,由于乘法因子而导致目标堆地址的低字被1覆盖,并且生成了无效的堆地址。释放无效堆地址时,就会导致崩溃。成功利用此漏洞可能导致远程执行代码。

原创文章,作者:Gump,如若转载,请注明出处:http://www.mottoin.com/tech/134107.html

发表评论

登录后才能评论

联系我们

021-62666911

在线咨询:点击这里给我发消息

邮件:root@mottoin.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code