在众多的软件缺陷中,安全软件中出现的漏洞被认为比其他漏洞尤为严重。这是因为,安全软件是帮助用户抵御攻击者的靠山,所以,如果这些软件中出现安全问题,不仅会受到攻击者所带来的伤害,同时,还会导致虚假的安全感:自以为神功护体,实际上却不堪一击。这就是我们特别关注Bitdefender Internet Security中的安全漏洞的原因之一,如果该漏洞被利用,这款安全防护软件就会被攻击者用于远程执行代码。实际上,这个漏洞是由整数溢出引起的,尽管现在已经修复,但是仍然值得我们仔细研究。
当前,尽管系统已经提供了DEP和ASLR等防御机制,但是,人们仍然可以对现代软件中的整数溢出进行有效的利用。在本文中,我们将对这个运行攻击者在目标系统上面远程执行代码的整数溢出漏洞进行详细的介绍。
Bitdefender概述
Bitdefender提供了多种具有防病毒(AV)功能的产品,并且所有这些AV产品都安装了SYSTEM服务vsserv.exe。该服务的作用是处理AV扫描请求。就像各种AV引擎一样,它能够处理各种常见文件类型(例如PDF、JPG、DOC、EXE)和病毒库,即一系列扩展名为.xmd或.cvd的压缩可执行文件,位于%PROGRAMFILES%\Common Files\Bitdefender\Bitdefender Threat Scanner\Antivirus_XXXX\Plugins\目录中。除此之外,该引擎还有一个鲜为人知的功能,即模拟遇到的可执行代码,以此检测未知或经过混淆处理的病毒。
遇到x86可移植可执行文件(PE)时,Bitdefender实际上是通过保存在cevakrnl.xmd和ceva_emu.cvd文件中高度复杂的代码仿真器来虚拟执行PE的。这些仿真器会创建一个私有虚拟地址空间,解释字节码,提供各种Windows API的实现,并为频繁执行的地址创建相应的JIT(Just-In-Time,JIT)代码。
杀毒原理简介
当仿真器检测到函数调用时,就会调用cevakrnl.xmd!sub_366F4D0()。该函数处理被仿真函数中的第一条指令,实际上就是在一个常量表中搜索匹配项。在处理后面的指令时,算法会考虑解释器的当前状态。换句话说,对于每个已经匹配的指令,都要为后面的指令搜索其他匹配表。
当函数的前16个字节被仿真器找到相应的匹配项时,或者当指令序列是未知的指令序列时,初始搜索就宣告结束。
常量表中最后的匹配项会提供函数起始位置之前一些已知字节的内容,以及函数起始位置后16字节的内容。
[X bytes before]
FUNCTIONSTART:
16 bytes already matched
[Y bytes after]
然后,该引擎会读取并检查这些字节的内容,以确定是否与已知的AV签名相匹配。如果匹配,则调用检测到的代码签名对应的处理程序做进一步处理。
漏洞分析
遇到Themida加壳软件代码序列时,该杀毒软件就会调用sub_36906D0()函数以便对匹配的序列进行代码解释。
被解释的代码中,唯一的变量为ebp偏移量"X",并且ebx的值就是通过它读取的。该函数从代码流中提取偏移量,并使用它从仿真堆栈中获取ebx的值。
接下来,会解释mov ecx, [ebx]指令,ecx的值是从保存在ebx中的模拟地址中提取的。
接下来解释下面的代码序列:
这里,会根据ecx + dword[ecx + 0x78 + word[ecx+0x3c]]计算出仿真esi的值。
接下来从仿真的esi中总共提取0x28字节,并读取偏移0x18处的dword (对应仿真代码的mov edi,[esi + 18h]指令)。
对dword(N)乘以4的时候,没有进行整数边界检查,然后调用了malloc()。这样的话,将导致分配的缓冲区过小。
接下来进入一个循环,在该循环中,将会把通过位于仿真堆栈中的偏移量找到的N个字符串的CRC32校验和填充到这个缓冲区中。当字符串的偏移量过大的时候,循环将会中止。
这提供了执行代码时所需的一切。首先,我们需要能够用自己的内容覆盖任意数量的字节。这就需要用到一些其CRC值符合特定要求的字符串。当然,这里的CRC32算法是非标准的,因为它将每个字符串的终止零字节也计算进来了。然而,通过蛮力攻击,也能完成逆向分析。
当匹配的函数被调用时,漏洞被触发,即利用任意内容覆盖特定数量的内存空间。
小结
通过深入分析,我们可以看到,攻击者可以含有整数溢出漏洞的Bitdefender版本上执行任意代码。目前,软件供应商已经通过更新修复了该漏洞(以及其他漏洞)。因此,对于Bitdefender用户来说,应确保自己更新到最新的版本。在下一篇文章中,将为大家介绍如何利用这个漏洞,届时将会向读者展示我们是如何绕过DEP和ALSR等防护机制的。