分析杀毒软件BitDefender中的整数溢出漏洞(第二部分)——漏洞利用

我们的上一篇文章回首了来自Pagefault提交的内容,具体先容了Bitdefender 杀毒软件产品中的整数溢出问题。虽然仅寄托这些内容就足以向供应商提交一份破绽申报,但Pagefault还经由过程供给一个观点验证(PoC)破绽使用来进一步支持该申报。以下是实际中的使用:

Youtube视频连接:https://youtu.be/fPK8UjAogWg

Pagefault供给了关于破绽若何事情的以下细节。

破绽使用

因为终止前提是一个虚拟的越界读取,以及Bitdefender代码仿真器实现SEH的事实,我们可以多次重写覆盖。我们还可以经由过程改动履行的代码来调剂被覆盖的长度和内容。

该vsserve.exe可履行文件切实着实会唤醒ASLR和DEP,然而经由过程在JIT页面内使用与位置无关的shellcode,破绽使用绕过了这些缓解步伐。实今世码履行必要操纵随意率性的内存地址。

Bitdefender仿真器为仿真法度榜样供给虚拟地址空间。一个0x1000字节的仿真器页面具有一个0x1048字节的响应实际页面,此中包孕几个赞助仿真在页面上操作的字段:

在仿真法度榜样内部碰到的多个VirtualAlloc调用和相关的内存造访将导致创建多个0x1048布局,随后在碰到响应的VirtualFree调用,这些布局将被开释。

在内部,0x1048分配经由过程msvcrt的 malloc()履行,并落在低碎片堆(LFH)中。对付Windows 7及以下版本,继承使用的措施是分配多个虚拟页面,开释至少一个虚拟页面,触发分配并溢出0x1048缓冲区的脆弱功能,然后破坏这个虚拟页面。

对付Windows 8及以上版本,LFH增添了随机性,使得堆不那么确定。破绽使用经由过程将LFH随机表位置从新设置为在从新分配考试测验之间的0xFF分配,从而绕过了随机化。为了实现所需数量的内存分配并避免额外分配,必须为仿真代码创建JIT代码。这是经由过程履行一段代码至少34次来实现的。

在Windows 8及以上版本上实现破绽使用的步骤示例:

lNUMPAGES(例如60个)虚拟页面被分配;

l在LFH库中有一个随机的位置,着末一页被开释;

l随后是0xFF分配(JIT被触发以正确地针对这个数字);

l脆弱的功能被触发,脆弱的缓冲区被分配来代替着末一页;

l触发8个字节的有限覆盖,并反省其他NUMPAGES-1虚拟页面,以查看其内容是否被改动;

l假如检测到改动:

n0xFF分配总数必须发生在脆弱缓冲区和下一个缓冲区之间的着末分配之间;

n0x1048字节的另一个缓冲区被分配到与着末一个字节相同的位置,并且这一次覆盖了足够多的字节(0x1024),容许破绽使用。

l假如未检测到改动,破绽使用则将分配另一组虚拟页面并重复这个历程。

重复这个历程直至检测到改动或达到重试限定。有限的覆盖是必需的,以避免碰着进击保护页面。

一旦虚拟页面被改动,任何造访它的考试测验都邑受到影响。偏移量0x1020处的dword抉择了用于谋略被造访内存的真实地址所必要应用的目标读/写地址:

real_address = real_address_base + requested_virtual_address – dword[0x1020]

这使我们可以写入随意率性的偏移量。在这种环境下,可以改动位于已毁坏缓冲区之前的第二个虚拟缓冲区的偏移量0x1020,从而容许对第二个虚拟缓冲区的写入偏移量进行重复节制。换句话来说,我们将毁坏的缓冲区指向先前的缓冲区:

到今朝为止所描述的所有技巧都可以经由过程随意率性偏移量实现靠得住的读/写原语。然而,这对付代码履行来说是不敷的。

假如一段代码被仿真器解释至少34次,那么JIT编译就会启动,然后仿真器解释给定的操作码并构造响应的动态代码,以便对仿真代码履行以下调用。构造的代码被放置在一个可写和可履行的内存页面中。

对付每个JIT段,malloc()阐发重复代码时都邑创建一个内存布局。该内容布局的大年夜小可以经由过程在仿真代码中放置谋略指令来节制。经由过程多次调器具有多个push ecx/pop ecx对的函数,可以实现0x1048字节的大年夜小。

重复调用的函数数组由相同的内容构成,并且只有在实现了随意率性读写功能后才会对每个函数履行第34次调用,并开释着末一个脆弱的缓冲区。

此中一个虚拟缓冲区占用的空间将被此中一个JIT布局占用,是以我们可以应用读/写偏移量来造访它。相对付节制的虚拟页面,JIT缓冲区被放置为0x1108*x字节(0x1108 = 0x1048,四舍五入到近来的LFH大年夜小,为块标头添加了8个字节)。

JIT布局从几个有用的字段开始:

经由过程在偏移量0x2C处读取dword,我们可以提取毁坏的虚拟页面的实际地址,从而可以进一步对随意率性地址进行读写,而不仅仅是对随意率性偏移量进行读写。新得到的能力接下来用于改动放置在JIT布局中第一个dword所指向的地址处的字节。

一个自定义的shellcode将包孕的可履行文件转储到文件中并履行,它被放置在编译后的JIT代码中,,该代码鄙人一个调用对应的JIT编译函数的调用中履行。shellcode以一个TerminateProcess()结尾,避免了因为毁坏的堆而导致的潜在崩溃。

结论

假如你想自己测试一下,PoC就在这里。它应该在73447之前的BitDefender版本上事情。

这个破绽还注解,纵然启用诸如ASLR和DEP这样的缓解步伐,纯熟的进击者仍旧可以找到履行代码的措施。假如你是一位开拓职员,盼望避免软件中呈现整数溢出问题,CERT供给了一些关于若何避免在各类操作中呈现带符号整数的溢出的优秀指南,这是绝对值得回首。着末,谢谢Pagefault的申报和Bitdefender对问题的及时办理。

赞(0) 打赏
分享到: 更多 (0)
免责申明:本站所有资料均来自于网络,版权归原创者所有!本站不提供任何保证,不保证真实性,并不承担任何法律责任

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

阿里云优惠网 更专业 更优惠

阿里云优惠券阿里云大礼包