202010月,我们收到了一份目标ISC BIND服务器匿名安全报告。本报告中发现的安全问题实际上是基于之前曝光的漏洞CVE-2006-5989,该漏洞影响Apache模块mod_auth_kerb,匿名研究人员最初发现了它。ISC BIND服务器SPNEGO(the Simple and Protected GSSAPI Negotiation Mechani *** ,SPNEGO)包含漏洞的代码在组件 *** 享,但ISC当时没有合并相应的安全补丁。15年后,ISC对BIND修复漏洞,并分配相应的漏洞编号,即CVE-2020-8625。
对于BIND服务器,从9.11到9.16所有版本都受到漏洞的影响。此外,攻击者可以在没有身份验证的情况下远程触发漏洞,导致4字节溢出。本安全报告的内容符合要求Targeting Incentive Program但缺乏获得全额奖金所需的完整性exploit。不过,这仍然不失为一个优秀的安全报告,而且这个漏洞也值得我们深入进行研究。
漏洞分析
漏洞的原因位于lib/dns/spnego.c中的函数der_get_oid()有堆溢漏洞。
该函数在(1)处分配数组缓冲区。len用于跟踪缓冲区剩余元素的数量。同时,代码在(2)处填充前两个元素,但只在(3)处填充len减去1。因此,循环(4)可以使缓冲区溢出一个元素。data->components的类型是int,因此,这将导致4字节的溢出。
触发机制
因为漏洞存在SPNEGO因此,组件在组件中BIND中对TKEY-GSSAPI配置相应。
其中,dns.keytab文件位于bin/tests/system/tsiggss/ns1/中,而example.nil.db文件是脚本bin/tests/system/tsiggss/setup.sh生成的。
现在,相应的测试环境已经准备好了。当收到手动请求时,会触发漏洞,并产生以下调用栈:
漏洞利用
这个漏洞的可用性高度依赖于glibc以下解释是基于版本Ubuntu18.04和glibc2.27后者支持tcache。
首先要确定溢出漏洞能控制的内容:
- 在der_get_oid()分布在易受攻击缓冲区的大小和内容是可控的。顺便说一句,当前请求完成后,缓冲区将被释放。
- decode_MechTypeList()中有一个while用于重复执行的循环der_get_oid()函数,循环次数也可控。
有了这两点,我们就可以轻松操作堆了。为了准备堆,我们可以耗尽任何大小的堆tcache bins,并在要求完成后重新填写。同时,重新填充的块(chunk)内存可以是连续的。这使得内存布局相当有利于通过缓冲区溢出发动攻击。
实现任意写原语
在这个阶段,通过滥用tcache空闲列表可以很容易地写原语。
触发一个4字节的溢出来扩展下一个空闲chunk大小。
在下一个请求中,受损chunk内存空间空间。当请求结束时,它将被移动到新的tcache bin中。
用新的大小再次分配损坏的chunk。此时,损坏chunk下一个空闲的chunk重叠,然后用任何值覆盖它freelist。
从“中毒的”tcache freelist内存空间的上部分配。它将返回任何地址。
泄漏内存地址
默认情况下,会为BIND启用所有Linux缓解措施。因此,我们必须首先处理它。ASLR,这意味着我们需要找到一种从内存中泄露地址的 *** 。实现内存泄漏的可能性是使用它code_NegTokenArg()函数。该函数用于将响应信息编码到缓冲区并发送给客户端。
位于(5)处buf它的初始大小是1024字节,正好在临时缓冲区tcache处理范围内。outbuf是将被发送到客户端的缓冲区,其大小也在tcache在这两个缓冲区的大小范围内。tcache dup攻击,在(5)和(6)处两次malloc()调用将返回相同的地址。执行(7)free()函数后,一个tcache->next该指针将被更新buf然而,此时它已经和解了outbuf重叠在一起。这意味着堆指针会泄露给客户端。
理想情况下,位于(6)处buf_len应选择足够大的,以避免干扰较小tcache bins。不幸的是,更大值似乎只有96个字节。由于这个问题,这个过程根本无法生存,在客户端获得泄漏的堆指针后不久就会崩溃。因此,我们需要进行更深入的研究,以找到一种充分利用漏洞的 *** 。
漏洞的修复
在BIND 9.16.12和BIND 9.11.28这个漏洞已经修复了。BIND 9.16,ISC完全放弃了SPNEGO的使用。在BIND 9.11补丁程序是针对原始问题的。
小结
这个安全漏洞表明,即使软件是开源的,并被广泛使用,漏洞也会存在多年,难以发现。软件维护人员需要密切监控他们使用的所有外部模块,以确保最新的安全补丁的应用。这个漏洞也表明,这是一个非常棘手的挑战。ISC BIND是Internet上更流行的DNS服务器,因此,该漏洞的影响范围相当大,特别是该漏洞可以远程触发,无需身份验证。我们建议您尽快更新相应的DNS服务器。
本文翻译自:https://www.thezdi.com/blog/2021/2/24/cve-2020-8625-a-fifteen-year-old-rce-bug-returns-in-isc-bind-server