前言

在2018年9月,FortinetFortiGuard实验室研究员Honggang RenWindows JET引擎的Msrd3x40代码中发现了一个执行漏洞,之后通过相关流程向微软公司进行了报告。在2019年1月的星期二,微软发布了新的安全公告,其中包含此漏洞的修复程序,并将其标识为CVE-2019-0538

这个易受攻击的DLL msrd3x40漏洞点存在于Windows 7到Windows 10的所有版本中。在我们的报告中提到的漏洞可以使用精心设计的mdb文件进行触发。由于我们解析mdb PoC文件时释放无效的堆地址会发生堆损坏,所以这导致代码执行漏洞。

在本文中,我们希望分享对此漏洞的详细分析。

分析

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

方法一:

通过在Excel oledb外部数据源加载PoC文件的过程中使用下面的这几个参数可以导致Excel产生崩溃。这个PoC文件可以放置于任何本地或smb共享中。

方法二:

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

上图为trigger1.vbs脚本情况。

下图是冲突发生时调用堆栈的情况。

从上面的调用堆栈的输出中我们可以看到冲突发生在函数“msrd3x40!free”中。 之后我们通过以下命令启用cscript.exe填充页堆:“gflags /p /enable cscript.exe /full”。

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

通过逆向工程的追踪,我们可以看到攻击者精心设计的mdb错误地导致调用msrd3x40.dll文件,因为精心设计的mdb文件头版本字段为0,而正常版本应为1 。正常的mdb文件会让程序输入头进行解密操作。然而,由于精心设计的mdb文件版本字段为0,mdb文件没有在msjet40.dll中完成标头解密操作。

因此,具有攻击性质的mdb文件将跳跃至函数msjet40!ErrOpenForeignDatabase+0x65处并调用msrd3x40.dll!ErrIsamOpenDatabase。 但处理正常的mdb文件并不会调用msrd3x40.dll。 因此,从此处开始,精心设计的mdb文件导致系统采用错误的代码分支。

上图显示了版本错误调用msrd3x40.dll的情况。

DLL msrd3x40.dll文件会解密精心设计的mdb标头。 偏移量0x42处的数据最初为0x86,但在RC4解密mdb头之后,0x42处的偏移量数据变为0。 因此系统会跳转到下一个代码分支上, 请参阅以下代码:

到目前为止,系统仍然没有生成无效的堆内存地址。 之后通过进一步的逆向工程追踪,我们发现用于生成无效堆内存的乘数因子来自以下代码:

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

接下来,让我们跟踪无效的堆内存生成,如下所示:

在该函数中,[ecx + 6c]处存放了事先获得的密钥乘法因子0x100。此处dx = 0x1。在经过值分配后。[ecx + eax * 2 + 194h]实际分配给数字1,而这里的数字实际上是释放的无效存储器地址的低字节。 也就是说,在调用Database::MarkCorrupt函数之前,目标对象的堆指针是正确的。 然而,在将值0x1字分配给上述存储器地址之后,系统会生成无效堆指针。 这导致无效指针的释放并使代码无法正常执行。

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

结论

我们鼓励所有使用Microsoft Windows Server漏洞版本的用户将系统升级为打补丁版本。此外,已部署Fortinet IPS解决方案的组织自2018年10月12日起会受到签名的保护,从而不受此漏洞的影响:

MS.JET.Database.Engine.Msrd3x.Remote.Code.Execution

更多相关的0 day信息请点击: 这里

本文为翻译稿件,来源于:https://www.fortinet.com/blog/threat-research/microsoft-windows-jet-engine-msrd3x-code-execution-vulnerability.html

源链接

Hacking more

...